티스토리 뷰

Study/OS

[Memory] Dynamic Memory Allocation

생각많은 소심남 2014. 9. 5. 11:29

* 이 글은 coursera에서 제공되는 HW/SW Interface 강의를 요약한 내용입니다.


이전 포스트들(Process, Virtual Memory관련)을 살펴보면서 알 수 있었던 것은 process가 실행되기 위해서는 Memory에 올라가야 되고, 자신만의 space를 가져야 한다는 것이다. 이런 동작들이 모두 memory에 연관되어있기 때문에 어떻게 하면 memory를 조금 더 효율적으로 사용할 수 있을까에 대한 의문이 생길 것이다. 이때문에 Dynamic Memory Allocation을 사용한다.

 고정된 영역만 memory에 할당하는 static memory allocation과는 다르게 dynamic memory allocation은 프로세스가 돌아가는 runtime내에 영역의 크기를 알려줌으로써 영역을 확보하는 방법이다. 이때 전에도 이야기 했던 내용과 관련이 있다.


process가 memory에 load가 되면 memory 영역은 위와 같이 code(text), data, stack, heap 영역으로 나눠진다. 이중 process내에서 생성되는 local variable은 stack에 저장되고 지금 이 포스트를 통해서 설명하고자 하는 Dynamic memory allocation 은 중간에 있는 heap 영역을 통해서 수행된다. 그림에도 표현되어 있지만 heap의 maximum size가 정해진 상태에서 사용자가 원하는 size만큼 할당받아서 사용할 수 있다. 그런데 여기에도 전제되어 있는 것이 maximum size가 정해져 있다는 것이다. 즉, 원하는 만큼 할당받을 수는 있는데 이 size를 넘어버리게 되면 process가 사용할 수 있는 free 영역은 더이상 없는 것이다. 따라서 상황에 따라서 기존에 할당된 영역중 필요없는 부분은 시간이 날때마다 해제시키거나 해줘야 한다. 보통 이걸 자동으로 해주는 게 garbage collection인데 지금 이 강의에서 다루는 C/C++에는 garbage collection이 기능이 없다. 따라서 뭔가 수동으로 해제시키는 방법을 취해야 하는데 이 건 다른 글에서 다뤄보려고 한다.


 application이 생성되고 나서부터는 프로그램 자체적으로 heap 영역이 얼마나 필요한지는 사용자가 입력을 집어넣기 전까지는 알 수가 없다. 이때문에 각 application마다 사용자의 입력을 받아서 heap 영역을 지정해주는 게 있는데 이게 dynamic memory allocator이고, 우리가 흔히 쓰는 malloc이나 new keyword같은 게 그런거다. allocator가 하는 역할은 앞에서도 언급했던 것처럼 virtual memory 영역중 heap 영역을 관리한다. 이 때 관리하는 개념이 allocated / free인데 보통 application object의 크기가 page 단위보다 작기 때문에 page size 단위로 heap에 할당하거나 해제한다. 이렇게 block 단위로 관리하게 되면 우리가 해당 주소를 찾아갈때 용이한 점이 있다. 이렇게 필요한 크기가 allocator에서 반환되면 OS kernel이나 Virtual memory를 관리하는 하드웨어에선 이 page단위의 block을 process와 연결시켜준다.

 보통 Allocator의 종류로 크게 Explicit 과 Implicit를 나누는데 단어의 의미에 담긴 내용이 뭔지는 잘 모르겠다. 아무튼 explicit allocator라고 하는 것은 C의 malloc 처럼 allocate/free 개념이 같이 있는 방식이다. 즉 앞에서 설명했던 것처럼 process내의 dynamic memory allocation이 잘 수행되기 위해서 필요없는 할당영역에 대해서는 해제를 수동으로 해줘야 하는 것이다. 반대로 자동으로 해주는 것을 implicit은 이런 동작들을 자동으로 해주기 때문에 훨씬 더 프로그래머가 memory allocation에 신경써야 할 필요가 줄어든다.



malloc은 stdlib에 정의되어 있는 함수이고,인자로는 사용자가 원하는 size를 받게 된다. 그래서 실제로 heap 영역에는 보통 8* size만큼의 크기만큼 할당이 된다. 이는 memory addressing에 따른 alignment를 맞춰주기 위해서이다. 이와 반대 개념인 free는 malloc을 통해서 받은 pointer의 영역을 해제시키는 역할을 한다. 참고로 malloc과 비슷한 동작을 하는 함수들이 몇 개 더 있다. calloc, realloc 같은 건데 calloc은 clear alloc이라고 생각하면 편할 것 같다. 말그대로 malloc을 해주되 그 안에 있는 정보를 다 0으로 초기화해준다. 원래 memory 자체가 휘발성 소자이기 때문에 처음에 전원이 들어오게 되면 그 안에 전기적 신호로 인해서 쓰레기 값들이 써지게 된다. 이 쓰레기 값이 써지는 것을 막기 위해서 초기화해주는 함수가 따로 있는 것이다. 또 realloc은 역시 re-alloc이라고 보면 될텐데, 기존에 할당되어있는 영역의 크기를 바꾸고자 할 때 이용한다. 

더 자세한 내용은 다음 글에서 다뤄보고자 한다.

'Study > OS' 카테고리의 다른 글

[Memory] Sample Memory System  (7) 2014.09.03
[Memory] Address Translation  (1) 2014.09.02
[Memory] Virtual memory caches  (5) 2014.09.01
[Memory] Indirection  (0) 2014.09.01
[Process] Fork-exec Model  (0) 2014.08.29
[Process] Creating New Processes  (0) 2014.08.29
[Process] What is a process?  (2) 2014.08.29
댓글