운영체제(OSTEP)

OSTEP 16장

woohap 2024. 10. 31. 00:00
베이스와 바운드 레지스터는 메모리 낭비가 심함 
→ 스택과 힙 사이의 공간은 사용되지 않더라도 물리 메모리에 할당되기 때문

이 문제를 해결하기 위해 세그멘테이션 등장

세그멘테이션

특정 길이를 가지는 연속적인 주소 공간
→ MMU에논리적인 주소 공간인 세그먼트마다 베이스와 바운드 쌍이 존재 

주소 공간에는 코드, 스택, 힙 세 종류의 세그멘트가 있다.
세그멘테이션을 사용하면 운영체제는 각 세그멘트를 물리 메모리의 각기 다른 위치에 배치할 수 있다.
사용되지 않는 가상 주소 공간이 물리 메모리를 차지하는 것을 방지할 수 있다.

64KB 물리 메모리에 3개의 세그멘트(스택, 코드, 힙)과 운영체제용으로 예약된 16KB 영역이 존재

현재 사용 중인 메모리에만 물리 공간이 할당됨

바운드 레지스터에는 세그먼트의 크기를 저장

가상 메모리 100번지 읽기 과정

1. 하드웨어는 베이스 값에 세그먼트의 오프셋(100번지)을 더해 물리 주소를 구한다.
→ 100 + 32KB = 32868

2. 주소가 범위 내에 있는지 검사한다. 
→ 32KB(베이스) 보다 작거나 32KB + 2KB 보다 크다면 범위 내에 없는 것

3. 범위 내에 있다면 물리 메모리 주소 32868을 읽는다.

힙이나 스택에 접근할 때 조심

코드 세그멘트의 경우 가상 주소가 0에서 시작하기 때문에 
베이스 레지스터에 메모리 번지 주소만 더하면 됨
34KB + 100 = 32868

힙이나 스택 세그멘트의 경우 가상 주소가 0에서 시작하지 않기 때문에 
해당 세그먼트 시작 주소에서 해당 번지 수가 얼마나 떨어졌는지, 
즉 해당 세그먼트에서의 오프셋을 구해야 한다.
** 세그멘트 최대 크기 - 번지 수

34KB + 4200 = 39016 // X
4200 - 4096 = 104      // 힙 안에서의 오프셋
34KB + 104 = 34920   // O

세그멘트폴트

불법적인 주소 접근 시 발생
Ex) 힙의 마지막을 벗어난 7KB 같은 잘못된 주소 접근하는 경우 운영체제에서 트랩을 발생시킨다.

세그멘트 종류 파악

하드웨어는 변환을 위해 세그멘트 레지스터를 사용
하드웨어가 가상 주소가 어느 세그먼트를 참조하는지 오프셋은 얼마나 사용하지를 가상 주소에 저장
VAX/VMS 시스템에서는 3개의 세그먼트를 표현하기 위해 최상위 2비트는 세그먼트 표시를 위해 사용 
오프셋은 12비트를 사용하여 표시
최상위 비트 

00 - 코드 세그먼트

01 - 힙 세그먼트

10 - 스택 세그먼트

Ex) 4200 번지에 접근하는 경우 

최상위 비트 : 힙 세그먼트 이므로 01 
오프셋 비트 : 4200 - 4096 = 104 → 0000 0110 1000

결과 : 01 0000 0110 1000

오프셋은 바운드 검사도 쉽게 만든다.

→ 오프셋이 바운드 보다 작은지 여부만 검사하면 됨
4200 번지 접근 → 오프셋 104 → 4096 → 2048 값보다 작은지 검사 

최상위 비트를 2개 사용하면 발생하는 문제점

코드, 힙, 스택 3개의 세그멘트만 존재하므로 지정 가능한 세그먼트 하나는 미사용으로 남음
→ 예시에서는 전체 주소 공간의 1/4는 사용 불가

이 문제를 해결하고자 일부 시스템에서는 코드와 힙을 하나의 세그먼트에 저장하고 
세그멘트 선택을 위해 1비트만 사용한다.

하드웨어적으로 파악할 수도 있다.
→ 묵시적 접근 방식에서는 주소가 어떻게 형성되었나를 관찰하여 세그멘트를 결정

Ex) 
주소가 PC에서 생성 → 코드 세그멘트 내에 있을 것
→ PC에서 생성되는 주소는 실행 중인 코드와 연관됨 → 코드 세그멘트

주소가 스택 또는 베이스 포인터에 기반을 둔다면 주소는 스택 세그멘트 내에 있음
→ 스택 포인터나 베이스 포인터와 관련된 주소는 함수 호출과 지역 변수와 관련됨 → 스택 세그먼트

다른 주소는 모두 힙에 있어야 함 
→ 그 외의 주소 코드나 스택이 아님 → 힙 세그먼트로 간주

스택 - 주소가 반대 방향으로 확장됨(큰 주소 -> 작은 주소)

다른 방식의 변환이 필요
1. 간단한 하드웨어 추가
→ 베이스와 바운드 레지스터와 더불어 주소가 어느 방향으로 확장하는지도 저장해야 함 

2. 다른 방식으로 물리주소 계산 
→ 오프셋 구하기 = 접근 번지 - 세그먼트 최대 크기 Ex) 3KB - 4KB = -1KB
→ 오프셋 + 베이스레지스터값 Ex) -1KB + 28KB = 27KB

공유지원

세그멘테이션 기법 발전 → 간단한 하드웨어 지원으로 새로운 종류의 효율성 성취

메모리 절약 방법
주소 공간들 간에 특정 메모리 세그먼트를 공유하는 것 
- 특히 코드 공유가 일반적 // 현재 시스템에서도 광범위하게 사용중

메모리 절약 방법

하드웨어에 protection bit 추가 
→ 세그멘트를 읽거나 쓸 수 있는지 혹은 세그멘트의 코드를 실행 시킬 수 있는지를 나타냄 
→ 코드 세그먼트를 읽기 전용으로 설정하면 주소 공간의 독립성을 유지, 
  여러 프로세스가 주소 공간의 일부를 공유할 수 있다. 
-> 코드 세그먼트는 읽기 및 실행으로 설정되어 물리 세그먼트가 여러 가상 주소  공간에 매핑될 수 있음

protection bit를 사용하며 앞서 언급한 하드웨어 알고리즘 수정되어야 함

- 가상 주소가 범위 내에 있는가 ??
- 특정 액세스가 허용되는가 ??
사용자 프로세스가 읽기 전용 페이지에 쓰기를 시도하는 경우 또는 실행 불가 페이지에서 실행하려고 하면 
하드웨어는 예외를 발생시켜서 운영체제가 위반 프로세스를 처리

소단위 대 대단위 세그멘테이션

소수의 세그멘트만을 지원하는 시스템 - 대단위 
다수의 세그멘트를 지원하는 시스템 - 소단위

많은 수의 세그먼트를 지원하기 위해서는 세그멘트 테이블 같은 하드웨어 필요

운영체제 지원

세그멘테이션은 새로운 많은 문제를 제기한다.

첫 번째 : 문맥 교환시 세그먼트 레지스터의 저장과 복원
→ 각 프로세스는 자신의 주소 공간을 가지며, 
    운영체제는 프로세스가 다시 실행하기 전에 레지스터들을 올바르게 설정해야 함 

두 번째 : 미사용 중인 물리 메모리 공간의 관리 
→ 새로운 주소 공간이 생성되면, 이 공간의 세그멘트를 위한 비어있는 물리 메모리 영역을 찾을 수 있어야 함 
  많은 세그멘트를 가질 수 있고, 각 세그먼트는 크기가 다를 수 있음 // 이전에는 각 주소 공간 크기 동일
→ 일반적으로 물리 메모리가 빠르게 작은 크기의 빈 공간들로 채워진다. 
→ 이 작은 빈 공간들은 새로 생겨나는 세그멘트에 할당하기도 힘들고, 
  기존 세그먼트를 확장하는데 도움이 되지 않음 

즉, 외부 단편화가 발생할 수 있다.
→ 각 세그먼트를 물리 메모리의 연속된 공간에 할당해야 함 
→ 시간이 지나면 작고 불연속적인 빈 공간이 생김 (외부 단편화)
→ 힙 확장의 경우 힙 바로 다음 공간이 비어있지 않으면 힙 확장 불가능

압축기법으로 이를 해결

운영체제는 현재 실행 중인 프로세스를 중단하고 프로세스 데이터를 하나의 연속된 공간에 복사,
세그먼트 레지스터가 새로운 물리 메모리 위치를 가리키게 하여 자신이 작업할 큰 빈 공간을 확보 
**** 하지만 세그먼트 복사는 메모리에 부하가 큰 연산이고, 
     일반적으로 상당향의 프로세서 시간을 사용하기 때문에 압축은 비용이 많이 든다.

빈 공간 리스트를 관리하는 알고리즘 사용

빈공간 관리 알고리즘은 할당 가능한 메모리 영역들을 리스트 형태로 유지
최적 적합(Best Fit), 최악 적합(worst Fit), 버디 알고리즘(buddy algorithm) 등 수백 개의 알고리즘 존재
** 알고리즘이 아무리 정교해도 외부 단편화는 발생한다.

기타

세그멘테이션에 필요한 산술 연산이 쉽고 하드웨어 구현에 적합하여 속도가 빠름
코드가 별도의 세그먼트에 존재하면 실행 중인 여러 프로그램이 공유 가능 

현재 문제점

힙이 드문 드문 사용되는 경우 힙 전체가 여전히 물리 메모리에 존재해야 함 
즉, 주소 공간이 사용되는 모델과 이를 지원하기 위한 세그멘테이션의 설계 방법이 
정확히 일치하지 않으면 세그멘티이션이 제대로 동작하지 않을 수 있다.

'운영체제(OSTEP)' 카테고리의 다른 글

OSTEP 18장(페이징)  (0) 2024.11.10
빈 공간 관리  (1) 2024.11.09
OSTEP 14장  (0) 2024.10.19
OSTEP 8장  (0) 2024.10.11
OSTEP 6장  (0) 2024.10.10