프로세스를 서로 크기가 다른 논리적인 블록 단위인 Segment(세그먼트)
로 분할하여 메모리에 할당하는 기법이다.
이때 핵심은 각 Segment
는 쪼개지지 않고 연속적인(contiguous allocation) 메모리 공간에 할당된다.
세그먼트들의 크기가 서로 다르기 때문에 프로세스가 메모리에 적재될 때, Segment Table
에 의해 빈 공간을 찾아 할당한다.
하지만 Segmentation
의 치명적인 단점은 외부 단편화(External Fragmentation)
이 발생한다는 점이다.
위 그림을 보면 메모리의 두 Empty
의 공간을 합치면 프로세스 C
가 메모리에 적재될 수 있듯이, 충분한 메모리 공간이 있음에도 그 공간들이 연속적이지 않을 때, 외부 단편화
가 발생한다.
이렇듯 놀고 있는 메모리 공간이 있지만, 이를 활용하지 못해 효율적이지 않다.
Compaction
은 위 외부 단편화
의 해결법으로 등장하였다.
위 그림처럼 흩어져 있는 메모리 빈 공간을 합치는 방식을 Compaction
이라고 한다.
하지만 빈 메모리 공간을 합치기 위해 1,3,5번 프로세스를 메모리의 다른 공간으로 욺기는 것은 매우 어려운 일이다. 1,3,5번 프로세스를 욺기기 위해서는 Disk
와 같은 Secondary Storage에 1,3,5번 프로세스를 임시로 복사한 뒤, 메모리를 청소하고, Disk에 잠시 복사했던 프로세스들을 가져와야 한다.
Disk
의 접근 속도는 느리고, 이러한 과정을 거치는 것은 결국 좋은 방법이 아니다.
따라서 Compaction
이라는 개념만 알아두고, 실제로는 앞으로 다룰 Paging
기법으로 외부 단편화를 보완하였다.
📗Segmentation vs Fragmentation
- Segmentation : 서로 다른 크기의 블록 단위인 세그먼트로 분할하는 기법
- Fragmentation : 단편화. 사용 가능한 메모리가 충분하지만 사용할 수 없는 상태
이 둘의 용어를 혼동하지 말자
프로세스의 주소 공간을 고정된 사이즈의 Page
단위로 나누어 메모리에 불연속적으로 할당하는 기법이다.
Segment
를 메모리에 연속적으로 할당한 Segmentation
과 다르게, Paging
에서는 Page
를 불연속적으로 할당하여 외부 단편화를 방지하였다는 점을 기억해두자.
위 그림을 보면 ProcessA
ProcessB
가 Page
라는 단위로 쪼개어져 Paging Table
에 의해 불연속적으로 메모리에 배치된다. 그림을 보면 왜 Paging
이 외부 단편화가 발생하지 않는지 알 수 있다.
Page
Frame
는 크기가 같고, 어떤 대상이냐에 따라 구별하기 위해 명칭만 다르다.
메모리는 Frame
이라는 고정크기로 분할되고, 프로세스는 Page
라는 고정크기로 분할된다.
하지만 Paging 기법도 여전히 문제가 있다. 바로 내부 단편화
가 발생할 수 있다.
위 그림에서는 Process로 나누었지만 이를 Page라고 가정하고 본다면, 메모리에 할당 받은 Page가 실제로는 모두 쓰이지 않고 일부가 낭비되고 있는 것을 내부 단편화
라고 한다.
이는 프로세스가 할당받은 메모리 공간이 실제 그 크기보다 크기 때문에 발생한다.
예를 들어, 프로세스가 4KB 메모리를 할당받았을 때 실제로 사용하는 데이터가 3KB라면 1KB의 메모리가 낭비되는 것이 내부 단편화이다.