Always Be Wise

동적 메모리 할당과 할당기 본문

컴퓨터 시스템/CSAPP

동적 메모리 할당과 할당기

bewisesh91 2021. 12. 9. 20:08
728x90

동적 메모리 할당

동적 메모리 할당이란 힙(Heap) 프로세스의 가상 메모리 영역을 이용하여 프로그램을 실행하는 중간에 메모리를 할당 받는 것

의미한다. 동적 메모리 할당을 사용하는 이유는 프로그램을 실제로 실행하기 전까지 데이터의 크기를 알 수 없는 경우들이 있기

때문이다. 따라서 런타임 시 동적으로 메모리를 할당하여 사용하는 것이다.

할당기

이러한 동적 메모리 할당을 수행하는 할당기는 명시적 할당기묵시적 할당기, 두 가지 기본 유형으로 구분된다. 할당기는 힙을 

다양한 크기의 블록들의 집합으로 관리한다. 각 블록은 할당되었거나 사용 가능하며, 할당된 블록은 명시적으로 또는 묵시적으로

할당기에 의해 반환될 때까지 할당된 채로 남아 있는다. 반면, 사용 가능한 블록은 명시적으로 할당할 때까지 사용 가능한 상태로

남아 있는다. 명시적 할당기는 명시적으로 할당된 블록을 반환해 줄 것을 요구한다. C 언어에서는 malloc 함수를 호출하여

블록을 할당하고, free 함수를 호출하여 블록을 반환한다. 반면에 가비지 컬렉터(Garbage Collector)라고 알려져 있는 묵시적

할당기는 자동으로 사용하지 않는 할당된 블록을 반환시켜 준다. 아래 그림은 32비트(4바이트) 모드에서 malloc과 free를

이용하여 블록을 할당하고 반환하는 과정을 보여준다. 

 

동적 메모리 할당을 위해 사용하는 가상 메모리는 유한한 자원이다. 따라서 할당기는 효율적으로 메모리를 활용하면서

가능한 많은 요청을 처리해야 한다. 단편화(Fragmentation)라고 알려진 현상은 메모리를 효율적으로 사용하지 못하는

현상을 의미한다. 이는 내부 단편화와 외부 단편화, 두 가지로 구분된다. 

 

  • 내부 단편화 : 필요한 메모리 이상의 메모리를 할당하여 할당된 메모리 내에 비어있는 메모리가 발생하는 현상

  • 외부 단편화 : 전체 메모리 기준에서 할당 요청을 만족시킬 수 있는 메모리 공간이 존재하지만, 해당 요청을
                             처리할 수 있는 단일한 가용 블록이 없는 현상(이 경우 커널에서 추가적인 가상 메모리를 요청해야 함)

내부 단편화보다 외부 단편화가 훨씬 측정하기 어렵다. 내부 단편화의 경우 할당된 블록의 크기와 요청 데이터 크기의 차이 

합으로 측정할 수 있다. 그러나 외부 단편화는 미래의 요청 패턴에 따라 발생 여부가 달라진다. 따라서 할당기들은 대개

많은 수의 더 작은 가용 블록들보다는 더 적은 수의 더 큰 가용 블록들을 유지하려는 방법들을 채택하고 있다.

 

 

Comments