1. 세그멘테이션(Segmentation)
세그멘테이션이란 프로세스를 논리적 내용(=세그멘트)으로 잘라서 메모리에 배치하는 방법을 말한다. 즉, 프로세스를 일정한 크기단위로 자르는 것이 아니라 의미 단위로 자르는 것을 말한다.
- 프로세스는 세그멘트(segment)의 집합
- 세그멘트의 크기는 일반적으로 같지 않다.
MMU 내의 재배치 레지스터 값을 바꿈으로서 세그멘트를 메모리에 할당한다.
CPU는 프로세스가 연속된 메모리 공간에 위치한다고 착각하게 된다.
MMU는 세그멘트 테이블(segment table) 이 된다.
2. 주소 변환(Address Translation)
1) 논리주소 (Logical address)
- CPU가 내는 주소는 segment 번호(s) + 변위(d)
2) 주소변환 : 논리주소 → 물리주소(Physical address)
- 세그멘트 테이블 내용 : base(시작주소) + limit (세그멘테이션의 길이)
그래서 아래 예제처럼 2차원 배열의 형태를 갖게 된다.
- 세그멘트 번호(s)는 세그멘트 테이블 인덱스 값
- s에 해당되는 테이블 내용으로 시작 위치 및 한계값 파악
- 한계(limit)를 넘어서면 segement violation 예외 상황 처리
- 물리주소 = base[s] + d // 즉, 시작주소에 떨어진 거리(d)를 더한다.
3) 예제
a. 논리주소 (2, 100)의 물리주소는 무엇인가?
=> 2번째 세그멘테이션의 Base값, 즉 시작주소는 4300이다. 4300에 d를 더해 물리주소는 4400이 된다.
b. 논리주소 (1, 500)의 물리주소는 무엇인가? => 1번째 세그멘테이션의 Base는 6300이다. 여기에 500을 더하면 6800이지만 이는 할당된 Limit를 초과하기 때문에 segementation violation을 일으킨다. 해당 주소를 요청하는 그즉시 세그멘트 테이블이 CPU에 interrupt 신호를 일으켜 프로세스가 중지된다.
3. 세그멘테이션의 장점과 단점
1) 장점 : 보호와 공유
페이징과 마찬가지로 세그멘테이션을 통해 보호와 공유 측면에서 추가적인 이점을 얻을 수 있다.
1) 보호(Protection) : 해킹 등 방지
- 모든 주소는 페이지 테이블을 경유하므로, 페이지 테이블 엔트리마다 r, w, x 비트를 두어 해당 페이지에 대한 접근제어가 가능해진다. r은 read(읽기), w는 write(쓰기), x는 execute(실행하기)를 의미한다.
아래의 예시를 보면 인덱스 0번의 페이지의 경우 r, w, e가 모두 1인데 이것은 이 페이지가 읽기, 쓰기, 실행하기가 모두 가능하다는 것을 의미한다.
- 페이징보다 우월!
2) 공유(Sharing) : 메모리 낭비 방지
- 같은 프로그램을 쓰는 복수 개의 프로세스가 있다면, Code+date+stack에서 Code는 공유 가능
(단, non-self-modifying code=reentrant code=pure code인 경우만 가능)
이를 통해 프로세스의 페이지 테이블 코드 영역이 같은 곳을 가리키게 된다.
- 페이징보다 우월!
왜 보호와 공유 차원에서 페이징보다 우월할까?
그 이유는 논리적 내용을 단위로 프로세스를 잘랐기 때문이다.
프로세스는 Code + data + stack 으로 이루어져 있다. 페이징의 경우 일정한 크기로 나눴기 때문에 어떤 페이지는 Code와 data가 섞여 있을 수 있다. 이때 이 페이지의 접근 권한을 설정하는 경우 세그멘테이션이 좀더 의미기반의 접근 권한 설정이 가능하다.
공유의 측면에서도 세그멘트는 Code단위로만 이루어져 있기에 페이징보다 더 나은 공유가 가능해진다.
2) 단점 : 외부 단편화
세그멘트의 크기는 고정된 것이 아니라 가변적이다.
크기가 다른 각 세그멘트를 메모리에 두려면 동적 메모리 할당이 필요하다.
이때 최초적합(First-fit), 최적적합(best-fit), 최악적합(worst-fit), compaction 등 문제가 발생한다.
=> 외부단편화 문제를 해결하기 위해 프로세스를 잘랐지만 세그멘테이션의 경우 외부단편화 문제가 완전히 해결되지 않는다.
3) 해결방법 : 세그멘테이션 + 페이징
세그멘테이션은 보호와 공유면에서 효과적이고 페이징은 외부 단편화 문제를 해결한다.
따라서 이 둘의 장점을 합쳐 세그멘트를 페이징한다. => Paged segmentation
Paged segmentation은 주소변환의 부담이 커진다는 단점이 있다. 왜냐하면 세그멘트 테이블과 페이지 테이블을 모두 갖기 때문이다.
Paged segmentation을 사용하면 대표적인 예가 바로 Intel 80x86이다.
'Programming > 운영체제' 카테고리의 다른 글
페이지 교체 알고리즘 - FIFO, OPT, LRU (0) | 2021.09.25 |
---|---|
가상메모리와 요구페이징 (0) | 2021.09.25 |
페이징(Paging) (0) | 2021.09.25 |
연속 메모리 할당 - 메모리단편화, 최초적합, 최적적합, 최악적합 (0) | 2021.09.16 |
메모리 낭비 방지 - 동적적재, 동적연결, 스와핑 (0) | 2021.09.15 |