[12] 세그멘테이션

hyunsooo·2023년 6월 5일
0
post-thumbnail

KOCW - 양희재 교수님 강의를 기반으로 운영체제 정리

프로세스를 자르는데 일정 크기로 자르는 것을 페이징이라고 했습니다. 반면에, 세그멘테이션(Segmentation)은 논리적 내용(세그멘트)으로 잘라서 메모리에 배치하는 기술입니다.

  • 프로세스는 세그멘트(segment)의 집합

  • 세그멘트의 크기는 일반적으로 같지 않다.

하나의 프로세스는 기본적으로 code, data, stack으로 3개의 세그멘트로 나눌 수 있습니다. 각각의 영역을 더 세부적(논리적)으로 나눠 세그멘트를 늘릴 수 있습니다.

주소변환

세그멘트의 주소변환도 페이징과 마찬가지로 CPU는 segment 번호(s)변위(d)를 담은 논리주소(Logical address)를 사용합니다. 이 주소는 실제 물리주소(Physical address)를 찾기 위해 MMU를 사용하는데 세그멘테이션에서 사용하는 MMU를 Segment table이라고 합니다.

페이징에서는 메모리와 프로세스가 같은 크기로 잘라져 있기 때문에 Relocation 레지스터값으로 주소변환이 가능했습니다. 반면, 세그멘테이션의 경우 세그멘트별로 가변적인 크기를 가지고 있기 때문에 base 레지스터limit 레지스터를 사용하여 다른 메모리 영역에 침범하는 것을 막고 있습니다.

CPU가 (0, 500)을 내놓는 경우

세그멘트 테이블 0번지에는 base가 3000번지이고 limit가 2000 입니다. 현재 변위가 limit를 넘어가는지 확인하고 넘어가지 않는다면 세그멘트 테이블을 통해 (3000, 500)의 주소를 얻을 수 있고 실제 물리주소는 3500번지로 계산되어 집니다.

CPU가 (2, 800)을 내놓는 경우

세그멘트 테이블의 2번지에는 base가 500번지이고 limit가 500입니다. 현재 변위와 limit를 비교하여 limit를 벗어나는 경우 세그멘트 테이블은 인터럽트를 발생시켜 강제종료 시킬 수 있습니다.

보호 (Protection) : 해킹 등 방지

모든 주소는 세그멘트 테이블을 경우하므로 페이징 페이블과 마찬가지로 r, w, x비트를 두어 메모리를 보호할 수 있습니다.

페이징 기술의 경우 일정 크기로 프로세스를 자르기 때문에 code, data, stack 영역이 섞여서 잘릴 수 있습니다. 하지만 세그멘테이션은 논리적으로 나누기 때문에 각 영역별로 비트를 설정하기 수월합니다.

공유 (Sharing) : 메모리 낭비 방지

메모리 낭비를 방지하는 방법도 보호와 같은 이유로 세그멘테이션이 더 좋은 성능을 나타냅니다. 하나의 페이지에는 code만 남기는 것이 아니라 섞일 수 있습니다. 반면 세그멘테이션은 code영역만을 나누기 때문에 효율적으로 공유를 수행할 수 있습니다.

왜 페이징을 자주 사용할까?

여러가지 장점으로 미루어 보았을 때 페이징에 비해 세그멘테이션이 훨씬 우월한 것 같습니다. 하지만 현대의 컴퓨터는 대부분 페이징 기술을 사용하고 있습니다.

메모리 관리의 발전은 메모리 낭비 방지(동적 적재, 동적 연결, 스와핑), 연속 메모리 할당(first, best, worst)부터 외부 단편화를 방지하기 위해 페이징 기술까지 발전되어 왔습니다. 세그멘테이션은 보호와 공유 측면에서 페이징 기술보다 우월하지만 세그멘트의 크기가 가변적이기 때문에 외부 단편화가 발생하는 치명적인 단점이 있습니다.

세그멘테이션 + 페이징

세그멘테이션의 보호와 공유, 페이징의 외부 단편화 해소의 각각의 장점만을 합쳐서 더 좋은 기술을 생각할 수 있습니다.

이 방법은 프로세스를 세그멘트로 자르고, 세그멘트를 페이지 단위로 자르는 방법입니다. 이 방법을 Paged segmentation라고 부르고 있습니다. 하지만 세그멘트와 페이지가 동시에 존재하기 때문에 주소 변환도 두번 해야하는 단점이 있습니다.

이처럼 어느 한쪽이 좋아지려고 하면 어느 한쪽이 안좋아지는 현상을 trade-off 현상이라고 합니다.

profile
CS | ML | DL

0개의 댓글