운영체제(OSTEP)

OSTEP 18장(페이징)

woohap 2024. 11. 10. 10:19

페이징

프로세스의 주소 공간을 고정된 크기의 단위로 분할하여, 가상 메모리와 물리 메모리를 관리하는 기법

페이지

각각의 고정된 크기의 단위를 [페이지]라고 한다.
상응하여 물리 메모리도 각각의 고정된 크기의 단위로 나눈 것을 [페이지 프레임]이라고 부른다.
-> 고정 크기의 슬롯의 배열이라고 생각

가상 주소 공간의 페이지들은 물리 메모리 전체에 분산 배치되어 있다.

페이징 장점

- 프로세스의 주소 공간 사용 방식과는 상관없이 효율적으로 주소 공간 개념을 지원
  → 힙과 스택이 어느 방향으로 커지는가, 어떻게 사용되는가에 대한 가정을 하지 않아도 됨

- 빈 공간 관리의 단순함
  → 모든 비어 있는 페이지의 빈 공간 리스트를 유지하고, 할당 시 페이지들을 선택하여 배치

주소 공간 페이지 0 - 물리 프레임 3
가상 페이지 1 - 물리 프레임 7
가상 페이지 2 - 물리 프레임 5
가상 페이지 3 - 물리 프레임 2
** 1, 4, 6 물리 프레임은 비어있음

페이지 테이블

운영체제는 각 가상 페이지에 대한 물리 메모리 위치를 기록하기 위하여 
프로세스마다 페이지 테이블이라는 자료구조를 유지한다.

- 주소 공간의 가상 페이지 주소 변환 정보를 저장하는 것 
→ 각 페이지가 저장된 물리 메모리의 위치가 어디인지 알려준다.

**
각 프로세스마다 페이지 테이블이 존재함 

**
페이지 테이블의 구조와 동작 방식은 하드웨어와 운영체제 간의 협력에 의해 결정된다. 
페이지 테이블의 기본적인 형식과 지원 방식은 MMU에 의해 정의
운영체제가 그 형식에 맞춰 페이지 테이블을 관리하고 운영

주소변환

가상 주소를 가상 페이지 번호와 페이지 내의 오프셋으로 분할한다
Ex) 가상 주소 공간 크기가 64 바이트 이므로 가상 주소는 6비트가 됨 // 2^6 → 64 // 6비트 
페이지 크기가 16byte이므로 4개의 가상 페이지를 가질 수 있음 // 64 / 16 = 4
그러므로 페이지 번호를 위한 비트는 2비트만 필요 // 2^2 = 4

나머지 비트는 오프셋을 위해 사용됨 
가상 페이지 비트 2비트, 오프셋 비트 4비트 

**
프로세스가 가상 주소를 생성하면 운영체제와 하드웨어가 의미 있는 물리 주소로 변환 

21을 이진수로 변환 01 0101
01은 가상 페이지 번호
0101은 오프셋 

이 때 페이지 테이블에서 가상 페이지에 해당하는 프레임 번호 혹은 물리 페이지 번호를 가지고 온다.
→ 여기서는 111이 프레임 번호

물리주소 : 111 0101 
→ 계산된 물리주소는 데이터가 저장된 정확한 물리 메모리 위치

페이지 테이블은 어디에 저장되는가 ??

각 프로세스를 위한 페이지 테이블의 크기가 크기 때문에 MMU 내부에 저장할 수 없음
-> 메인 메모리에 저장해야 함 

**
각 프로세스의 페이지 테이블은 [커널 메모리 영역]에 저장된다.
페이지 테이블은 운영체제 가상 메모리에 저장할 수 있고, 필요한 경우 디스크 영역으로 스왑될 수도 있다. 

** 커널 영역 자체를 위한 페이지 테이블도 존재
커널의 가상 주소에 해당하는 페이지가 현재 물리 메모리에 존재하지 않으면 주 페이지 폴트 발생 

페이지 테이블 구성

[페이지 테이블]은가상 주소를 물리 주소와 매핑하는데 사용하는 자료구조
가장 간단한 형태는 선형 페이지 테이블 (단순 배열)
운영체제는 물리 프레임 번호를 찾기 위해, 
가상 페이지 번호(VPN)로 배열의 항목에 접근한다.
그 항목의 페이지 테이블 항목(PTE)을 검색한다.
[구성]
PFN | 기타비트 

[Valid Bit]
특정 변환 유효 여뷰를 나타내기 위하여 포함 
PTE가 Valid Bit가 1이라는 것은 가상 메모리 주소가 할당되었다는 뜻 // lazy loading의 경우 가상 메모리 주소만 할당

Valid Bit가 0이라는 것은 inValid 상태이므로 접근 시 [세그멘테이션 폴트]가 발생한다.

[protection bit]
페이지를 읽을 수 있는지, 쓸 수 있는지, 실행할 수 있는지를 표시하는 비트 
protection bit가 허용하지 않는 방식으로 페이지에 접근하면 운영체제가 트랩을 발생시킨다.

[dirty bit]
메모리에 반입된 후 페이지가 수정되었는지 여부를 나타낸다.

[reference bit]
페이지가 얼마나 자주 사용되는지 추적하기 위해 사용 
최근 접근 여부 추적, 
일정 주기마다 운영체제는 Reference bit를 확인하고
필요에 따라 다시 0으로 초기화

희생자 페이지를 선택하는 페이지 교체 알고리즘에서 활용

[사용자/슈퍼바이저 비트]
사용자 모드 프로세스가 페이지에 액세스 할 수 있는지를 결정

페이징 : 너무 느림

페이지 테이블의 크기가 메모리 상에서 매우 크게 증가할 수 있음
-> 페이지 테이블로 인해 처리 속도가 저하될 수 있다.

movl 21, %eax

당분간 하나의 페이지 테이블 베이스 레지스터가
페이지 테이블의 시작주소(물리주소)를 저장한다고 가정

VPN = (VirtualAddress & VPN_MASK) >> SHIFT
PTEAddr = PageTableBaseRegister + (VPN * sizeof(PTE))

VPN_MASK와 SHIFT 사용하여 전체 가상 주소에서 VPN 비트만 골라낸다. // VPN_MASK - 0x30
SHIFT는 오프셋 비트 수, 올바른 정수 가상 페이지번호를 형성하기 위해 VPN 비트를 오른쪽으로 이동
가상 주소 21에 마스킹 하면 010000이 되고 오른쪽으로 쉬프트 연산을 수행하면, 01 값을 얻게 됨
즉, 가상 페이지 1로 변환됨,

→ 이 값을 페이지 테이블 베이스 레지스터가 가리키는 PTE 배열에 대한 인덱스로 사용
→ 페이지 프레임 번호를 얻은 후, 가상 주소의 오프셋과 연결하여 물리 주소를 구함

offset = VirtualAddress & OFFSET_MASK
PhysAddr = (PFN << SHIFT) | offset
// 가장 주소에서 VPN 추출
VPN = (VirtualAddress & VPN_MASK) >> SHIFT;
// 페이지 테입르 항목의 주소 형성
PTEAddr = PTBR + (VPN * sizeof(PTE));
// PTE 반입
PTE = AccessMemory(PTEAddr);
// 프로세스가 페이지를 접근할 수 있는지 확인
if(PTE.Valid == False)
    RaiseException(SEGMENTATION_FALUT);
else if (CanAccess(PTE.ProtectBits) == False) 
    RaiseException(PROTECTION_FAULT)
else 
    // 접근 가능하면 물리 주소 만들고 값 가져오기 
    offset = VirtualAddress & OFFSET_MASK
    PhysAddr = (PTE.PFN << PFN_SHIFT) | offset
    REGISTER = AccessMemory(PhysAddr)

문제점

하드웨어와 소프트웨어의 신중한 설계 없이는 페이지 테이블로 인해 시스템이 매우 느려질 수 있으며, 
너무 많은 메모리를 차지한다. 

** 페이지 테이블 때문에 속도 저하 및 많은 메모리 차지

이를 해결하기 위해서 TLB라는 주소 변환 캐시가 등장

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

OSTEP 22장  (1) 2024.11.14
OSTEP 21장  (0) 2024.11.12
빈 공간 관리  (1) 2024.11.09
OSTEP 16장  (0) 2024.10.31
OSTEP 14장  (0) 2024.10.19