CS
[OS] 세그멘테이션 Segmentation
D0HAN.
2021. 6. 27. 21:42
페이징 : 프로세스를 정확하게 일정한 간격(페이지)으로 잘라 메모리에 적재하는 방법
세그멘테이션 : 프로세스를 논리적 단위(세그먼트)로 잘라서 메모리에 적재하는 방법
✔️세그멘테이션
- 페이징과 같이 가상 메모리를 관리하는 기법 중 하나.
- 세그멘테이션에서는 프로세스= 세그먼트의 집합
- 프로세스를 논리적 내용을 기반으로 나눠 메모리에 배치. => 각 세그먼트는 연관된 기능을 수행하는 하나의 모듈 프로그램
- 한 프로세스는 기본적으로 세가지 segment로 나눌 수 있음 (그 안에서 각각 더 작은 세그먼트로 나눌수도 OO)
- Text(=code) segment(Read) - 프로그램의 기계어 명령이 들어있음
- Data segment(Read & write) - 초기화 된 전역변수, 정적 변수 저장
- Stack segment & Heap segment - 크기가 가변적. - 보호와 공유 용이
- 보호 : 테이블에 r,w,x 비트를 테이블에 추가. 논리적으로 나눠진 세그먼트별로 해당 비트를 설정하기 때문에 간단하고 안전함. paging은 크기로 나누기 때문에 영역이 섞일 수 있어 비트를 설정할 때 까다롭다.
- 공유 : 필요한 부분이 연관된 기능을 수행하는 세그먼트로 나눠지기 때문에 효율적인 공유 가능
✔️세그먼트를 메모리에 할당하는 법
- 페이징과 같음
- *MMU내의 재배치 레지스터를 이용하여 논리주소 -> 물리 주소로 바꿈.
* MMU(Memory Management Unit): CPU가 물리적 메모리에 접근하는 것을관리하는 하드웨어 장치.
MMU는 세그먼트 테이블로 CPU에서 할당한 논리주소에 해당하는 물리주소의 위치를 가지고 있음
MMU의 STBR(Segment Table Base Register)에 segment table 시작주소 넣어줘서 접근 가능하게 함.
- 세그먼트 테이블은 physical 메모리의 unmap된 영역에 저장됨.
- 세그먼트 테이블: 세그먼트 번호, 시작 주소(base), 세그먼트 크기(limit)을 엔트리로 가짐
✔️논리-물리 주소 변환 법
- 페이징과 비슷, 테이블이 다름(페이징은 페이지 테이블 사용)
- 논리주소는 v = (s,d) 로 표현됨
- 논리주소 = s 세그먼트 번호(테이블의 인덱스로 사용) + d 오프셋(길이랑 비교)
물리주소 = a 세그먼트 테이블에서 base (시작 물리 주소) + d 오프셋 - ex. 논리주소 (2,100) = 물리주소 4400
논리주소 (1,500) = 인터럽트로 인해 프로세스 강제 종료(limit 벗어남) - 리눅스에서 자주 볼 수 있는 오류인 segmetation fault 도 권한,범위 밖의 메모리를 참조하려 할 때 일어남.
- 논리주소에서 보내는 주소값에서 하위 변위비트(오프셋,d) 빼고, 앞의 비트들은 세그먼트 번호(세그먼트 테이블 인덱스로 사용)
✔️장점
- 보호와 공유 면에서 효과적
- 두 user process가 동일한 코드(text segment)를 공유하기 용이.
- 각 memory section 들에게 각기 다른 read/write권한 설정할수있음
- 내부단편화 발생하지 않음
✔️단점
- 세그먼트는 크기고정 x, 가변적이라 동적 메모리 할당을 해야함. -> 외부단편화가 발생할수있다
=> 너무 큰 단점이라 segmentation 거의 사용하지 않음 - 평균 세그먼트 크기가 작을수록 외부 단편화 작음
보완
- 세그먼트를 페이징. -> 세그먼트 안에 별도의 페이지 테이블 존재
- 논리 주소 = 세그먼트 번호/페이지 번호/오프셋
- 외부 단편화 적음.
- but 테이블 두개를 거쳐야 해서 속도 느림(각 사용자의 메모리 3번참조)
CPU -> 세그먼트 테이블 -> 페이지 테이블
오버헤드가 커짐 - Multics, 인텔 386계열에서 사용