페이징은 프로세스를 물리적으로 일정한 크기로 잘라 메모리에 할당하는 방법이다. 세그멘테이션은 프로세스를 논리적인 내용 ( = 세그먼트)으로 잘라서 메모리에 배치한다. 따라서 프로세스는 세그먼트 (Segment)의 집합이다. 이렇게 나눈 세그먼트의 크기는 일반적으로 같지 않다. 왜냐하면 물리적으로 일정한 크기로 자른 것이 아니라 그 안의 논리적인 내용을 기준으로 잘랐기 때문이다.
세그먼트를 메모리에 할당하는 과정은 페이징과 동일하다. MMU 내의 재배치 레지스터가 논리 주소를 물리 주소로 변경하는 과정에서, 프로세스를 작은 세그먼트로 쪼갠 후 각각 메모리에 비어있는 곳으로 보낸다. CPU는 프로세스가 연속된 메모리 공간에 위치한다고 착각한다. 이때 MMU는 세그먼트 테이블 (Segment Table)이라고 부른다.
논리 주소는 세그먼트 번호 (s)와 변위 (d)의 합으로 이루어져 있다.
세그먼트 테이블은 base주소와 limit 주소로 이루어져 있다.
segment No. | base | limit |
---|---|---|
0 | 1000 | 1400 |
1 | 400 | 6300 |
2 | 400 | 4300 |
3 | 1100 | 3200 |
4 | 1000 | 4700 |
변환 과정은 페이징과 동일하므로 생략한다. 다만 물리 주소를 구하는 공식은 base[s] + d
이다.
모든 주소는 세그먼트 테이블을 경유하므로 페이징과 마찬가지로 R, W, X비트를 두어 접근 제어가 가능하다.
페이징은 내용과 상관 없이 크기만 일정하게 자르기 때문에 여러개의 프로세스 영역이 서로 섞일 수 있다. 하지만 세그먼테이션은 논리적인 내용에 기반해서 나누기 때문에 간단하고 안전하게 비트 설정이 가능하다. 따라서 페이징보다 우월하다.
공유 역시 마찬가지로 페이징은 크기 별로 Code 영역을 나누기 때문에 서로 다른 비트 영역이 섞일 수 있다. 하지만 세그머테이션은 논리적인 영역으로 구분하기 때문에 더 간단하고 안전하게 비트 설정이 가능하다.
세그먼트의 크기는 고정된 것이 아니라 가변적이다. 따라서 크기가 서로 다른 세그먼트를 메모리에 할당하려면 동적 메모리 할당이 필요하다. 이로 인해 다양한 크기의 hole이 발생할 수 있고, 결국 페이징과 같은 문제가 발생할 수 있다. (First-Fit, Best-Fit, Worst-Fit, Compaction 등등)
세그먼테이션의 페이징 각각의 장단점이 있으므로 이 둘을 합쳐서 서로를 보완하자는 방법이다. 세그먼테이션은 보호와 공유 면에서 효과적이고 페이징은 외부 단편화 문제를 해결하는데 효과적이다. 따라서 세그먼트를 페이징하는 Paged Segmentation의 방법이 등장했다.
하지만 세그먼트와 페이징이 동시에 이루어지기 때문에 주소 변환이 2번 이루어져야한다는 단점이 있다. CPU의 세그먼트 테이블에서 한 번, CPU의 페이지 테이블에서 또 한 번 주소 변환이 이루어지면 Overhead가 발생할 수 밖에 없다.