allocation을 하게 될 경우 address mapping이라는 개념이 따라옴
❗ Non-continuous allocation
대부분의 운영체제는 공간 관리 문제를 해결할 때 두 가지 중 하나를 사용한다.
첫 번째 방법으로는 가변 크기의 조각들로 분할하는 Segmentation이다.
그러나, 이 방법은 공간을 다양한 크기의 Chunk로 분할할 때 공간 자체가 단편화 될 수 있고, 할당은 점점 더 어려워진다.
두 번째 방법인 공간을 동일 크기의 조각으로 분할하는 페이징을 고려해 볼 필요가 있다.
프로세스의 주소 공간을 몇 개의 가변 크기의 논리 세그먼트 (ex. code, heap, stack)로 나누는 것이 아닌 고정 크기의 단위로 나눈다.
이 각각의 고정 크기 단위를 페이지(page) 라고 부르며, 물리 메모리도 페이지 프레임(page frame) 이라고 불리는 고정 크기의 슬롯의 배열이라고 생각한다.
이 프레임 각각은 하나의 가상 메모리 페이지를 저장할 수 있다.
그렇다면, 페이지를 사용하여 어떻게 메모리를 가상화할 수 있을까?
페이징은 이전 방식에 비해 많은 장점을 가지고 있다.
그 중 가장 큰 장점은 유연성 일 것이다.
페이징을 사용하면 프로세스의 주소 공간 사용 방식과는 상관없이 효율적으로 주소 공간 개념을 지원할 수 있다. 예를 들어, 힙과 스택이 어느 방향으로 커지는가, 어떻게 사용되는가에 대한 가정을 하지 않아도 된다.
또 다른 장점은 페이징이 제공하는 빈 공간 관리의 단순함 이다.
예를 들어, 운영체제가 우리의 작은 64바이트 주소 공간을 8페이지 물리 메모리에 배치하기를 원한다고 할 때, 운영체제는 비어 있는 4개의 페이지만 찾으면 된다.
이를 위해 운영체제는 모든 비어 있는 페이지의 빈 공간 리스트를 유지하고 리스트의 첫 네 개 페이지를 선택할 것이다.
Virtual address : v = (p, d)
- p : page number
- d : displacement (offset)
Address mapping
- PMT(Page Map Table) 사용
📖 Page Table (page map table)에 대해 논하자면 다음과 같다.
주소 공간의 각 가상 페이지에 대한 물리 메모리 위치 기록을 위하여 운영체제는 프로세스 마다 페이지 테이블이라는 자료 구조룰 유지한다.
페이지 테이블의 주요 역할은 주소 공간의 가상 페이지 주소 변환 (address translation) 정보를 저장하여 각 페이지가 저장된 물리 메모리의 위치가 어디인지 알려준다.
페이지 테이블은 프로세스마다 존재한다.
✨ 그렇다면, 페이지 테이블은 어디에 저장될까?
페이지 테이블은 작은 세그멘트 테이블이나 베이스-바운드 쌍에 비해 매우 커질 수 있다. 예를 들어, 4KB 크기의 페이지를 가지는 전형적인 32비트 주소 공간을 상상해 보자. 이 가상 주소는 20비트 VPN(virtual page number) 과 12비트 오프셋으로 구성된다. (1KB 페이지 크기를 위해 10비트가 필요하며, 4KB 페이지를 위해서는 두 비트만 추가하면 된다.)
20비트 VPN은 운영체제가 각 프로세스를 위해 관리해야 하는 변환의 개수가 2^20(1,048,576)이라는 것을 의미한다.
물리 주소로의 변환 정보와 다른 필요한 정보를 저장하기 위하여 페이지 테이블 항목(page table entry, PTE) 마다 4바이트가 필요하다고 가정하면, 각 페이지 테이블을 저장하기 위하여 4MB의 꽤 커다란 메모리가 필요하게 된다. 프로세스 100개가 실행 중이라고 가정하면, 주소 변환을 위해서 운영체제가 400MB의 메모리를 필요로 하는 것을 의미한다.
컴퓨터가 Giga byte 단위의 메모리를 가지고 있는 요즘이라도 변환을 위해서 이런 큰 청크를 사용한다는 것은 매우 비정상적이다. (64비트 주소 공간을 위한 페이지 테이블의 크기는 얼마지?)
그래서 어디에 저장이 되나...?
페이지 테이블은 매우 크기 때문에 현재 실행 중인 프로셋스의 페이지 테이블을 저장할 수 있는 회로를 MMU 안에 유지하지는 않을 것이다.
페이지 테이블은 운영체제 가상 메모리에 저장할 수 있고 심지어 디스크에 스왑될 수 있다. 그러나 현재로선 매우 혼란스럽기 때문에 일단 무시하고,
대신 각 프로세스의 페이지 테이블을 메모리에 저장한다고 가정을 해두자!
📌직접 사상 순서
해당 프로세스의 PMT가 저장되어 있는 주소 b에 접근
해당 PMT에서 page p에 대한 entry 찾음
❗p의 entry 위치 = b + (p * entrySize)
찾아진 entry의 존재 비트 검사
3.1 Residence bit = 0인 경우, (Page Fault)
swap device에서 해당 page를 메모리로 적재
PMT를 갱신한 후 3-2 단계 수행
✨ Page Fault?
Page Fault는 소프트웨어 프로그램이 시스템의 RAM에 현재 저장되지 않은 메모리 블록에 액세스하려고 할 때 발생하는 interrupt입니다. 이 exception은 운영 체제가 가상 메모리에서 블록을 검색하여 장치의 스토리지(SSD 또는 HD)에서 RAM으로 보낼 수 있도록 합니다.
3.2 Residence bit = 1인 경우,
해당 entry에서 page frame 번호 p'를 확인
p'와 가상 주소의 변위 d를 사용하여 실제 주소 r 형성
❗ r = p' * (pageSize + d)
실제 주소 r로 주기억장치에 접근
직접 사상의 문제점?
해결 방안
📌 연관 사상 (Association Mapping)
📌 hybrid direct/associative mapping
📖 Hybrid Direct/Associative Mapping의 순서
여러 프로세스가 특정 page를 공유 가능
- Non-continuous allocation
공유 가능 page
1. Procedure pages (pure code (reenter code))
2. Data page : Read-only data, Read-write data(병행성(concurrency) 제어 기법 관리 하에서만 가능)
Example
프로그램을 고정된 크기의 block으로 분할 (page) / 메모리를 block size로 미리 분할 (page frame)
- 외부 단편화 문제 없음
- 메모리 통합/압축 불필요
- 프로그램의 논리적 구조 고려하지 않음 then, Page sharing/protection이 복잡
필요한 page만 page frame에 적재하여 사용
- 메모리의 효율적 활용
Page mapping overhead
- 메모리 공간 및 추가적인 메모리 접근이 필요
- 전용 HW (TLB) 활용으로 해결 가능 -> HW 비용 증가
페이지 테이블의 크기가 메모리 상에서 매우 크게 증가할 수 있어 처리 속도가 저하될 수 있다.