메모리 단편화는 사용 가능한 메모리가 충분히 존재하지만, 공간이 흩어져 있어 할당이 불가능한 현상을 말한다. 내부 단편화와 외부 단편화가 있다.

 

 

[내부 단편화]

 

할당 시 프로세스가 필요한 메모리보다 더 많이 할당된 경우를 말한다. 예를 들어, 프로세스를 실행했을 때, OS가 100KB를 할당했지만 실제로는 90KB를 사용하고 있다면, 필요 이상으로 10KB 더 많이 할당받은 것이다. 이때 내부 단편화가 10KB 발생했다고 한다.

 

내부 단편화는 세그먼테이션을 활용하여 해결이 가능하다. 세그먼테이션은 가상 메모리를 서로 크기가 다른 논리 단위인 세그먼테이션으로 분할하여 메모리를 할당하고, 물리 메모리에 활용하는 방법이다.

 

하지만 세그먼테이션들은 서로 크기가 다르기 때문에 미리 분할해둘 수 없고 메모리에 적재될 때 빈공간을 찾아 메모리를 할당하기 때문에 프로세스를 반복적으로 생성/해제할 경우 외부 단편화 문제가 발생하게 된다.

 

 

[외부 단편화]

 

외부 단편화는 반복적인 생성/해제로 인하여 작은 메모리가 중간 중간 발생하는 것이다. 이후 새로운 메모리를 100KB 할당하고자 하는데, 남은 공간은 100KB로 할당이 가능한 상태로 보이지만, 나뉘어져 있기 때문에 할당이 불가능해진다. 프로세스는 메모리에 연속적으로 존재해야하기 때문이다.

 

외부 단편화는 페이징을 활용하여 해결이 가능하다. 페이지 기법에는 페이지와 프레임이 필요하며, 페이지는 가상 메모리를 같은 크기의 블록으로 나눈것이고 프레임은 물리 메모리를 페이지와 같은 크기로 나눈 것이다. 둘을 매핑하기 위해서는 페이징 테이블이 필요하며, 물리 메모리의 프레임에 페이지를 할당하여 사용하는 방식이기 때문에 빈 공간 없이 메모리 할당이 가능하다.

 

하지만 여전히 페이지 단위를 알맞가 채워서 사용하는 것이 아니기 때문에 내부 단편화 문제가 발생하게 된다.

 

 

[메모리 풀]

 

메모리 풀은 고정된 크기의 블록을 할당하여 malloc, new와 유사하게 동적 할당을 가능하게 해준다. malloc, new 같은 기능들은 다양한 블록사이즈 때문에 단편화를 유발시키고 파편화된 메모리들은 퍼포먼스 때문에 실시간 시스템에서 사용하기 어려워진다. 이러한 방법을 해결하기 위해 메모리 풀을 사용하여 동일한 사이즈의 메모리 블록들을 미리 할당하는 것이다. 이러면 응용 프로그램은 실행 시간에 핸들에 의해서 표현되는 블록들을 할당한뒤 접근 가능해지며, 해제 또한 가능하다.

 

메모리 풀은 고정 메모리 풀과 가변 메모리 풀 등 종류가 다양한데, 이중 고정 메모리 풀의 특징은 다음과 같다.

 

- 고정된 크기의 블록을 갖는 메모리 관리자는 반환된 메모리를 효율적으로 재사용할 수 있어 똑같은 크기를 요청하기 때문에 메모리 파편화가 발생하지 않는다.

- 고정된 크기의 블록을 갖는 메모리 관리자는 캐시 효율이 좋다.

+ Recent posts