세그멘테이션(Segmentation)은 프로세스를 논리적 내용을 기반으로 프로세스를 나누는 기법입니다. 작게는 프로그램을 구성하는 함수 하나, 크게는 프로그램 전체를 하나의 Segment로 정의할 수 있습니다. 일반적으로 code, data, stack 영역 부분이 하나의 세그먼트로 정의됩니다.
세그멘테이션의 주소 변환도 페이징과 유사합니다. 다만, 세그먼트의 크기는 일정하지 않기 때문에 세그먼트 테이블에 세그먼트 크기(limit) 정보가 주어집니다. 세그먼트 테이블의 엔트리는 세그먼트 번호와 시작 주소(base), 세그먼트 크기(limit)로 구성됩니다.
세그먼트 테이블의 세그먼트 크기를 넘어서는 주소가 들어오면 인터럽트가 발생해서 해당 프로세스가 강제 종료됩니다.
페이징보다 효율적입니다. 세그멘테이션도 페이징과 마찬가지로 테이블에 비트를 추가하는데 세그멘테이션은 논리적으로 나누기 때문에 비트를 설정하기 매우 간단하고 안전합니다. 페이징은 code, data, stack 영역이 있을 때, 이를 일정한 크기로 나누므로 두 가지 영역이 섞일 수 있습니다. 그러면 비트를 설정하기가 까다롭습니다.
마찬가지로 페이징보다 효율적입니다. 페이징에서는 code 영역을 나누어도 다른 영역이 포함될 확률이 높습니다. 반면에 세그멘테이션은 정확히 code 영역만 나누기 때문에 더 효율적으로 공유할 수 있습니다.
보호와 공유에 있어서 세그멘테이션이 더 효율적이라고 설명드렸습니다. 하지만 현재 대부분은 페이징 기법을 사용합니다.
메모리 할당을 처음 시작할 때, 다중 프로그래밍에서의 문제는 크기가 서로 다른 프로세스로 인해 여러 hole이 발생한다는 것입니다. 어느 hole에 프로세스를 할당하는 것에 대한 최적화가 어렵고, 외부 단편화로 인한 메모리 낭비가 많게 됩니다.
세그멘테이션도 마찬가지입니다. 세그먼트의 크기는 다양합니다. 따라서, hole의 크기도 제각각일 것입니다.
페이징은 외부 단편화를 해결했고, 세그멘테이션은 보호와 공유에 있어서 효율적입니다. 따라서, 두 방법을 함께 사용하는 방법도 있습니다. 세그먼트를 페이징 기법으로 나누는 방법입니다. 하지만 이 방법은 세그먼트와 페이지가 동시에 존재하기 때문에 주소 변환을 두 번 해야한다는 단점이 있습니다.