2019년 2월 9일 토요일

malloc()의 구현 방법?

C 언어에서 흔하게 사용되는 메모리 할당 함수인 malloc()은 어떻게 구현되어 있을까?
함께 짝으로 사용되는 free()는 어떻게 구현되어 있을까?

흔하게 공룡책으로 불리우는 Operating System Concepts에서 배웠던 기억으로는 first-fit과 best-fit이라는 전략이 있다는... 어렴풋한 기억이 있을 뿐이다.
당시의 그 책은 매우 유용하기도 했지만, 다분히 교과서적이고 개념 위주였기에 실제 구현과는 거리가 좀 있었던 것으로 기억한다.

아무튼...
커다란 메모리 공간을 확보해서 힙으로 사용하도록 정한 후에, malloc()이라는 함수를 통해 메모리 할당 요청이 들어왔을 때, 그리고 메모리를 다 사용한 후에 free()라는 함수를 통해 메모리를 반납할 때, 이들을 어떤 식으로 처리하는 것이 좋을까?

우선은 잠시 생각해 본 아이디어를 끄적여 보겠다.

- 일단은 first-fit으로 구현.

- 메모리의 할당과 반납의 반복으로 힙은 여기 저기 조각난 상태가 될 것인데, 이 경우에 메모리 할당 요구가 발생하면, 비어있는 조각들 중에 크기가 맞는 것을 골라서 할당해 주어야 한다.
- 이를 위해 메모리 할당 테이블과 같은 별도의 정보를 관리하는 것도 하나의 방법이지만, 아주 작은 메모리의 할당이 많이 발생하면 관리를 위한 정보가 급격히 늘어나는 문제가 있다.
- 예전에 어떤 프로토콜 스택을 사용하면서 소스를 살펴보니, 이런 관리 정보를 힙 내부에 보관했던 기억이 있다. 즉, 사용하지 않은 힙의 메모리 내부에 비어있는 메모리 블럭들에 대한 정보를 저장하여 관리하는 것.
- 비어있는 메모리 블럭의 시작 부분에 블럭의 크기와 이전 블럭의 주소, 다음 블럭의 주소를 가지고 있는 구조. 최초의 힙은 블럭의 크기가 힙의 크기와 일치하고 이전 블럭의 주소와 다음 블럭의 주소는 null 값이 될 것이다. 전역 변수로 비어있는 첫번째 블럭의 주소만을 가지고 있으면 되고, 이 변수의 최초값은 힙의 시작 주소와 일치.
- 메모리 할당 요청이 들어오면 전역변수로 첫번째 빈 블럭부터 시작하여, 할당할수 있는 크기의 블럭이 나올 때까지 링크드 리스트처럼 연결된 블럭을 순회한다.
- 할당 가능한 블럭이 나오면, 할당 요청된 크기만큼을 할당하여 돌려주고, 블럭의 남은 조각을 새로운 블럭으로 리스트에 넣어주면 된다.

- 메모리 반납은 시작 주소만 있을 뿐, 크기는 없다. 위와같은 구조에서 해당 주소만이 주어졌을 때, 크기는 어떻게 알아내야 하는가?
- 할당된 메모리의 앞 부분에 할당된 블럭의 크기를 넣는다? --> 오케이.
- 그러면 비어있는 블럭의 맨 처음에도, 할당된 블럭의 맨 처음에도 그 블럭의 크기가 들어가는 셈.

- 메모리 얼라인먼트 문제?
- malloc()함수에서 할당 크기가 아니라, 메모리 단위와 개수로 할당을 받는 이유는 뭘까?

2019년 2월 7일 목요일

인공지능의 의미

인공지능은 한때, 흥미로운 SF의 소재였을 뿐 UFO나 외계인, 예티처럼 현실 세계에는 거의 아무런 영향을 끼치지 못하는 '꿈'의 기술이었다.

알파고의 출현은 가히 충격적이었다.
바둑이라는 게임에 한정된 것이었지만, 그 위력과 영향력에 대한 희망과 두려움은 전세계인에게 분명한 흔적을 남겼음에 틀림없다.
물론, 그 이후론 이렇다할 충격적인 인공지능의 출현이 보도되지 않아, 다시금 예전의 일상으로 돌아온 듯 하지만, 이제 우리의 생활이 큰 변화를 맞을 수 있다는 사실은 인정할 수 밖에 없어 보인다.

어쩌면 그렇게나 큰 충격은 다분히 우리가 생각하는 인공지능에 대한 무지에서 비롯된 것이 아닐까 싶다.
기계는 쉬지 않고 엄청난 속도로 학습하고 빠르게 진화할 수 있다고 생각하지만, 틀림없이 그건 아주 어려운 일이다.
마치 모든 분야에 속속들이 인공지능이 침투할것이라고 생각하겠지만, 그러기위해 필요한 자원(?)은 막대한 수준을 넘어 현재로썬 불가능할지도 모르는 수준일 것이다.

딥러닝, 빅데이터, 서칭 알고리즘, 데이터의 분류, 분산된 데이터의 적절한 결합, 이를 바탕으로 한 새로운 추론 등등...
각 기술의 작동 방식을 이해하기도 어렵지만, 이해한다 해도 어떤 데이터가 수집되어 있는지에 따라 결과는 큰 차이를 보일 것이기에, 인공지능 기술이 어떤 결과를 가져 올지는 예측하기 쉽지는 않다.

즉, 인공지능이 인간의 생활을 근본부터 바꾸리라는 희망이자 두려움에 대해서는 약간 냉정함을 가질 필요는 있어보인다.
상상처럼 '완벽한' 인공지능, 광범위한 영역에 단일한 메커니즘으로 운영되는 그런 인공지능은 여전히 '꿈'의 기술인 듯 하기 때문이다.


오히려, 인공지능에 대한 기대감과 시각을 바꿀 필요가 있어 보인다.

아마도 인공지능의 발전은 기대만큼 빠르지 못하고, 많은 자원을 필요로 하기에 중간중간 그 효용성에 대한 의문이 제기될 소지가 많다.
그럼에도 불구하고 꾸준히 발전시켜야할 분야라고 생각하는데, 그 이유는 이렇다.

수치나 논리로 설명을 하긴 어렵지만 직관적으로 이런 생각이 들곤 하는데,
가령 IQ가 80인 사람들이 제아무리 많이 모여도, 제아무리 많은 시간을 투자한다고 해도 아인슈타인의 상대성이론을 만들 수는 없겠다 싶은 생각.
물론 그 사람들이 모두 모여 덧셈 곱셈을 해 내는 속도는 이인슈타인보다 훨씬 빠르겠지만.

자칫, 타고난 지능에 대한 차별로 보일 수 있겠지만, 이건 오히려 그 반대의 상황이다.
즉, IQ가 80인 사람들이 아무리 노력하고 아무리 많이 모여도 이룰 수 없었던 수준에 도달하는 '방법'에 대한 얘기인 것이다.

과연 그런 방법이 존재할까?
만약 그 방법이 존재한다면, IQ 150인 사람이 IQ 200의 수준에 도달하는 방법도 찾을 수 있으며, 인간이 외계인 혹은 신의 수준에 도달하는 방법도 찾을 수 있을지 모른다.

인공지능은 바로 그 '방법'의 하나이다.
계산만 빠르게 하던 컴퓨터가 인간의 사고방식 수준에 도달하는 '방법'


사람은 개와 고양이를 구별할 수 있지만, 컴퓨터로는 그게 어려웠다고 한다.
사람들은 모두 언어를 구사하지만, 컴퓨터가 사람의 언어를 이해하는 건 아주 어려운 일이었다.
사실 그렇게 어려웠던 건, 사람들이 그런 능력을 공짜로 부여받았기에, 특별한 어려움 없이 습득한 능력이기에, 어떻게 그걸 하는 것인지 그들 자신도 그 '방법'을 모르고 있었던 것이다.

사실, 이제는 컴퓨터가 고양이와 개를 구별할 수 있다고 한다. 인간의 언어를 이해하고 명령대로 이행하고 번역이나 통역도 한다고 한다.
그게 단지 빅데이터를 통해 단순히 비교 검색하는 것으로 이루어지는, 컴퓨터의 인간 '흉내내기'에 불과한 것이 아닐까 생각하지만, 우리들 스스로도 우리가 어떻게 구별하고 어떻게 이해하고 있는지 모르는데, 컴퓨터의 그것을 비난할 수 있겠는가.