포스트

CSAPP › 메모리 단편화에 대해(Week6_Day1)

포인터의 크기

32비트 환경에서와 64비트 환경에서의 포인터의 크기는 왜 다를까??

32비트 => 4byte
64비트 => 8byte

인 건 알고 있었지만 이유는 몰랐었다.

32비트 환경에서 메모리 주소는 32비트로 표현이 되고, 64비트 환경에서는 메모리 주소가 64비트로 표현이 된다.
그렇기 때문에 메모리 주소를 표기하기 위해서는 각 포인터는 4바이트, 8바이트의 크기일 필요가 있는 것이다.

6주차 키워드

메모리 단편화(Memory Fragmentation)

RAM에서 메모리의 공간이 작은 조각으로 나누어져 사용 가능 메모리는 충분하지만 할당이 불가능한 상태를 의미한다.

내부 단편화(Internal Fragmentation)

메모리가 할당 될 때 프로세스가 필요로 하는 양보다 더 큰 메모리가 할당(할당 된 블록이 데이터 보다 큼)되어 프로세스에서 사용하는 메모리 공간이 낭비되는 현상이다.

외부 단편화(External Fragmentation)

메모리의 할당과 해제가 반복되면서 중간중간 작은 메모리가 생기는데, 전체적으로 메모리 공간을 모았을 때는 충분한 크기가 존재하지만, 요청을 처리할 수 있는 단일 가용 블록은 없는 경우이다.

가용 블록(free block): 아직 할당 되지 않은 메모리 공간.

단편화의 측정

내부 단편화의 경우 할당된 블록의 크기와 데이터 사이의 차이의 합으로 쉽게 정량화가 가능하다. 즉 이전에 요청한 패턴과 할당기 구현에 의존한다.
반면 외부 단편화의 경우 이전 요청 패턴과 할당기 구현 뿐만 아니라 미래의 요청 패턴에도 의존하기 때문에 측정과 예측이 어렵다. 예를 들면 일정 수의 요청 이후 모든 가용 블록들이 4워드 크기를 갖는다고 하면 미래의 할당 요청들이 4워드와 같거나 작은 것이라면 발생하지 않지만, 4워드 보다 큰 블록을 하나라도 요청하면 발생하는 것이다.
때문에 대게 다수의 작은 가용블록 보다는 소수의 더 큰 가용블록을 유지하려 한다.

메모리 할당 정책

어플리케이션이 특정 크기의 블록을 요청 할 때 할당기가 적당한 가용블록을 찾는 방법이다.

First fit

가용리스트를 첫 부분부터 검색해서 크기가 맞는 첫 번째 가용블록을 선택한다.

가용 리스트(free list) : 가용 리스트에도 종류가 여러개지만 일단 묵시적 가용리스트라고 생각 하겠다.

묵시적 가용 리스트(Implicit free list) : 연속된 할당 및 가용 블록의 배열.

  • 장점 : 리스트의 마지막에 가장 큰 가용 블록들을 남겨두는 경향이 있다.
  • 단점 : 리스트의 앞부분에 작은 가용 블록들을 남겨두는 경향이 있어 큰 블록을 찾는다면 검색 시간이 늘어난다.

Next fit

first fit과 비슷하지만 처음부터 검색하는 것이 아니라 마지막 검색 위치에서 검색을 시작한다.
이 때, 8바이트 크기의 가용블록에 6바이트 크기의 데이터를 할당했다면 다음 검색 위치는 6바이트의 다음이 아니라 마지막 검색 위치인 8바이트의 다음 부터 검색을 한다.

  • 장점 : first fit 에 비해 매우 빠른 속도를 가진다.
  • 단점 : 보통 메모리 공간의 끝에 있는 가장 큰 크기의 메모리를 짧은 시간 내에 작게 조각낸다. 그렇기 때문에 first fit 에 비해서도 메모리 이용도가 최악이다.

Best fit

모든 가용 블록을 검사하며 크기가 맞는 가장 작은 블록을 선택한다.

  • 장점 : 요청된 크기와 가장 가까운 크기의 가용블록을 선택하기 때문에 너무 블록이 크게 남는 상황을 방지하고, 더 좋은 메모리 이용도를 가지게 된다.
  • 단점 : 모두를 검색해야 하기 때문에 시간이 오래걸리고, 가장 알맞은 가용블록을 선택하는 특성이 오히려 가장 작은 단편을 만들어 외부 메모리 단편화를 유발할 수 있다.

참고 문서: [CSAPP]

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.