[운영체제] 세그멘테이션(Segmentation)이란?, 세그멘테이션 vs 페이징
세그멘테이션(Segmentation)이란?
페이징은 프로세스를 물리적으로 일정한 크기로 나눠서 메모리에 할당하는 것을 의미한다.
반면, 세그멘테이션은 프로세스를 논리적 내용을 기반으로 나눠서 메모리에 배치하는 것을 의미한다.
세그멘테이션은 프로세스를 세그먼트(segment)의 집합으로 표현한다. 이때 세그먼트는 논리 단위로 아래와 같은 것들이 해당된다.
- main program
- procedure
- function
- method
- object
- stack
- local variable
- global variable
- etc...
프로세스를 code영역, data영역, stack영역 등으로 나누는 것 또한 세그멘테이션이라고 할 수 있다.
세그멘테이션도 페이징과 비슷하게 세그먼트 테이블을 가지고 있다. 페이징과 비슷하게 논리주소가
<segment-number, offset>로 이루어져 있다. 다만 다른 점은 세그먼트의 크기는 일정하지 않기 때문에, 테이블에 limit 정보가 추가로 들어있다는 점이다. 만약 세그먼트의 크기를 초과하는 주소가 들어오면 인터럽트가 발생해 해당 프로세스는 강제 종료된다.
예를들어, 위 그림과 같은 경우를 살펴보자.
1. 논리주소 <2, 100> -> base[2] + 100 = 4400(물리주소)
2. 논리주소 <1, 500> -> base[1] + 500 = limit이 400이므로 범위를 벗어나 인터럽트가 발생한다.
세그멘테이션 VS 페이징
세그멘테이션은 페이징보다 보호와 공유 면에서는 더 낫다.
세그멘테이션은 read/write/execute 권한을 테이블에 추가하는데, 이때 이것을 논리적으로 나누기 때문에 해당 비트를 설정하기 간단하고 안전하다. 반면, 페이징은 code+data+stack 영역이 존재할 때 이를 일정한 크기로 나누기 때문에 영역이 섞여 비트를 설정하기 까다로워질 수 있다.
공유의 측면에서도 마찬가지로, 페이징은 영역이 섞일 가능성이 존재하지만, 세그멘테이션은 정확히 영역을 나누므로 더 효율적으로 공유를 할 수 있다.
하지만, 현재 대부분은 페이징 기법을 세그멘테이션보다 많이 사용한다.
그 이유는 세그멘테이션의 세그먼트 크기가 일정하지 않고 다양하기 때문이다. 세그먼트의 크기가 다양하기 때문에 다양한 hole이 발생해 외부단편화가 발생하여 메모리 낭비가 크게 된다.
+참고
[운영체제] 페이징(Paging)이란? 페이지 테이블이란?
[운영체제] 내부 단편화, 외부 단편화란? | 외부단편화 해결 방법