개발 공부
세그멘테이션 (Segmentation) 본문
●프로세스를 논리적 내용(=세그멘트)로 잘라서 메모리에 배치
-프로세스는 세그먼트의 집합
- 세그멘트의 크기는 일반적으로 같지 않다.
●세그멘트를 메모리에 할당
MMU 내의 재배치 레지스터 값을 바꿈으로써 CPU는 프로세스가 연속된 메모리 공간에 위치한다고 착각 MMU는 세그먼트 테이블이 된다.
주소변환
●논리주소
: CPU가 내는 주소는 세그멘트 번호(s) + 변위(d)
● 주소변환 : 논리 주소 -> 물리주소
- 세그멘트 테이블 내용 : base + limit
- 세그멘트 번호(s)는 세그멘트 테이블 인덱스 값
- s에 해당되는 테이블 내용으로 시작 위치 및 한계값 파악
- 한계(limit)을 넘어서면 segment violation 예외상황 처리
- 물리주소 = base[s] + d
Limit | Base | 예제 1. 논리주소(2, 100) 물리주소는? s= 4300, d=100 >>4300+100=4400 (Limit은 400이므로 4700까지 가능) 2. 논리주소(1,500) 물리주소는? s=6300 , d=500 >>6300+500 = 6800 (Limit은 400이므로 6700까지 가능) (Limit범위가 400이므로 벗어나므로 인터럽트가 걸려 해당 프로세스는 강제 종료됨) |
1000 | 1400 | |
400 | 6300 | |
400 | 4300 | |
1100 | 3200 | |
1000 | 4700 |
보호와 공유
●보호 : 해킹 등 방지
:모든 주소는 세그멘트 테이블을 경유하므로 세그멘트 테이블 엔트리마다 r,w,x비트르르두어 해당 세그멘트에 대한 접근 제어 가능
-페이징보다 우월
●공유 : 메모리 낭비 방지
:같은 프로그램을 쓰는 복수개의 프로세스가 있다면 code + data + stack에서 code는 공유 가능
(단, non-selfmodifying code = reentrant code = pure code 인 경우)
-프로세스의 세그멘트 테이블 코드 영역이 같은 곳을 가리키게
-페이징보다 우월
* 일정 크기인 page단위로 자르면 어떤 page에는 code도 있고 data도 있고, 다른 page에는 data도 있고, stack도 함께 있을 수 있음
>> code만을 실행해야 하는데 code와 data가 함계 존재하면 곤란 stack도 마찬가지
어떤 것은 read만 or write만 해야하는데 둘이 동시 존재시 보호나 보안이 어려워짐
>>세그먼트는 논리적으로(등심, 안심, 부채살등 부위별처럼) 의미있는 크기로 자를 수 있어
보호 보안 공유등이 가능하고 페이징 보다 우월합니다.
그러나 세그멘트의 장점이 있지만 단점이 있어 사용하지 않고 paging을 일반적으로 사용함
-세그멘트로 자르면 코드 데이터 스택 등 크기가 각각다름
-2개의 조각난 메모리 공간을 합해야 메모리에 올릴 수 있는 상황이 발생 가능 >> 외부 단편화문제
프로세스를 잘라 메모리에 할당하는 것은 단편화 문제를 해결하기 위함인데 그 문제가 해결되지 않아 사용할 이유가 없어 게스멘트를 사용하지 않음
외부단편화
:세그먼트 크기는 고정이 아니라 가변적임
크기가 다른 각 세그멘트를 메모리에 두려면 >> 동적 메모리 할당
First-, best- worst-fit, compaction 등 문제
● 세그멘테에션 + 페이징 (paged segmentation)
세그멘테이션은 보호와 공유에서 효과적임
페이징은 외부 단편화 문제를 해결함
따라서 세그멘트를 페이징하자!
1)세그멘트를 페이징 함
2) 프로세스를 자를 때 처음에는 의미있는 세그멘트로 자르고 (코드, 데이터, 스택)
3) 그다음 코드 데이터 스택을 일정 간격(page)로 자른다
'대학교 공부 > 운영체제' 카테고리의 다른 글
가상 메모리 (0) | 2021.06.08 |
---|---|
페이징 Paging (0) | 2021.06.04 |
주기억장치 관리 (Main Memory Management) (0) | 2021.06.03 |