프로세스의 주소공간을 이루는 스택, 데이터, 코드 힙 등의 의미 단위의 세그먼트로 나누어 물리적 메모리에 올리는 기법이다. 프로세스의 주소 공간 전체를 크게 하나의 세그먼트로 볼 수도 있다.
프로세스의 주소 공간이 나누어져 각각 메모리에 적재되는 면에서는 페이징 기법과 유사하다고 볼 수 있다. 그러나 페이징 기법과 달리 크기가 제각기 다른 세그먼트들을 메모리에 적재하는 부가적인 관리 오버헤드가 뒤따르게 된다.
논리적 주소가 <세그먼트 번호, 오프셋>으로 나뉘어 사용된다.
마찬가지로 주소 변환을 위해 세그먼트 테이블을 사용한다. 각 항목은 기준점(base)와 한계점(limit)를 갖고 있다. 세그먼트의 크기가 균일하지 않기 때문에 페이징 기법과는 달리 항목마다 길이 정보까지 포함하고 있다.
주소 변환 할 때,
변환하기 전, 먼저 두 가지 사항을 체크한다.
두 가지 사항이 모두 만족한다면 유효한 멤모리 접근 요청으로 판단해 주소 변환 작업이 수행된다.
세그먼트 테이블에서도 각 항목에 보호비트와 유효비트를 둔다.
세그먼테이션 기법도 여러 프로세스가 특정 세그먼트를 공유해 사용하는 공유 세그먼트를 지원한다. 공유 세그먼트는 이 세그먼트를 공유하는 모든 프로세스의 주소 공간에서 동일한 논리적 주소에 위치해야 한다.
세그먼트는 공유와 보안 측면에서 페이징 기법보다 훨씬 효과적이다.
또한, 페이징 기법에서는 동일한 크기로 주소 공간을 나누기 때문에, 공유하려는 코드와 사유 데이터 영역이 동일 페이지에 공존하는 경우가 발생할 수 있는데, 세그먼테이션 기법에서는 이러한 현상이 발생하지 않는다.
내부 단편화 문제도 발생하지 않는다.
세그먼트의 길이가 균일하지 않아 물리적 메모리 관리에서 외부 단편화가 발생하게 되며 세그먼트를 어느 가용 공간에 할당해야 될지 결정하는 문제가 발생한다.
페이징 기법과 세그먼테이션 기법의 장점만 이용한 주소 변환 기법이다. 세그먼테이션 기법처럼 프로그램을 의미 단위의 세그먼트로 나누는데 단, 모든 세그먼트들은 동일한 크기 페이지들의 집합으로 구성되어야 한다. 그리고 물리적 메모리에 적재하는 단위는 페이지 단위로 한다.
이 기법은 하나의 세그먼트 크기를 페이지 크기의 배수가 되도록 함으로써 세그먼테이션 기법에서 발생하던 외부 단편화 문제가 발생하지 않고 세그먼트 단위로 프로세스 간 공유나 프로세스 내의 접근 권한 보호가 이루어짐므로 페이징 기법의 단점을 해결할 수 있게 된다.
페이지드 세그먼테이션의 2단계 테이블
하나의 세그먼트가 여러 개의 페이지로 구성되므로 각 세그먼트마다 페이지 테이블을 갖는다.
논리적 주소는 <세그먼트 번호, 오프셋>으로 구성되어 있고 물리적 주소로 변환하는 과정은 아래와 같다.
논리적 주소의 상위 비트인 세그먼트 번호를 통해 세그먼트 테이블의 해당 항목(세그먼트 길이와 세그먼트의 페이지 테이블 시작 주소 포함)에 접근한다.