10. Paging
#페이지 #페이지프레임 #PFN #VPN
운영체제는 메모리공간을 두가지 방법으로 관리해왔다. 첫번째는 세그멘테이션이다. 그런데 세그멘테이션은 단편화문제가 발생한 것을 앞장에서 배웠다. 두번째 방법인 페이징은 프로세스의 주소공간을 가변이 아닌 고정된 크기로 나눈다. 이 고정 크기 단위를 페이지라고 부른다. 또 그에 상응하는 물리메모리를 페이지 프레임이라 부른다. 그렇다면 이 페이지를 사용해 어떻게 메모리를 가상화 할 수 있을까? 알아보쟝~~
🔗 페이징
- 메모리를 고정된 크기의 조각들로 자르고, 메모리를 할당할 때 페이지 단위로 할당해 준다.
장점
- 힙과 스택에 대해 따로 세그멘테이션처럼 관리하지 않아도 된다.
- 빈 공간 관리가 단순하다. (free-list)
하나의 페이지는 물리적으로 연속적이다. 그런데 그림에서 보다시피 가상주소공간의 페이지들은 물리공간에서 연속적이지 않고 뒤죽박죽 섞여있다.
🔗 주소변환
세그먼트에서는 베이스와 바운드 레지스터를 사용해 주소변환을 해왔다. 페이지에서는 가상공간의 페이지 번호에서 물리공간의 페이지 번호로 맵핑해주는 page table이 필요하다.
Virtual address
virtual address는 어떻게 구성되어있을까. virtual address를 줄여서 va라고 하겠다. va는 가상주소 0번지부터 max번지까지 numbering이 될텐데 내부적으로는 virtual page number(VPN)와 offset으로 구성되어있다. cpu마다 VPN과 offset을 할당하는 비트수는 다르다. 간단한 예로 6-bit addressing을 보자. 6비트 이므로 주소를 표현하는데 6비트가 사용되는것이다. 2^6만큼의 address를 가질 수 있고, address는 byte마다 할당되므로 64바이트의 주소공간을 갖고있는 셈이다.
예제에서는 2비트를 vpn으로, 4비트를 offset으로 활용했다. 이 구성을 통해 우리가 알 수 있는게 2가지가 있다. 1. 한 address space는 4개의 page로 구성된다. VPN이 2비트이므로. 2. 한 페이지 프레임은 offset이 4비트니까 2^4로 16바이트이다.
Address 21
21을 물리메모리 주소로 바꿔보자. offset은 페이지 내에서 우리가 원하는 위치를 가리키는 정보이다. 한 페이지는 물리메모리에서도 연속하니까 offset은 그대로 유지한다. 그러나 VPN은 virtual page의 number이므로 이를 physical frame의 number(PFN)로 바꿔줘야한다. 그에대한 정보를 갖고있는 곳이 page table이다.
그림에서 pfn은 3비트로 구성된것을 볼 수 있다. 이는 물리메모리의 page frame이 8개로 구성되어 가상메모리보다 크다는 것을 알 수 있다.
💭 이쯤에서 우리가 궁금해할 점들이 있다.
- page table의 크기는 얼마일까?
- page table은 어디에 저장되어있는가?
- page table에는 뭐가 쓰여있을까?
- 페이징이 시스템을 느리게 하진 않을까?
계속 해서 알아보도록 하자.
❓ page table의 크기
32-bit시스템이고 페이지 프레임 사이즈는 4KB라고 가정해보자. 32비트중 20비트가 VPN, 12비트가 offset이다. 사실 4KB 페이지 크기를 위해서는 12비트가 필요하다.(1KB면 10비트, 4KB이니까 12비트) 나머지 20비트가 VPN이므로 Page table의 entry개수는 2^20개가된다. 즉, 운영체제가 주소변환을 위해 20비트의 VPN을 대입할 개수가 2^20개라는 것이다. page table에서 맵핑을 위해 VPN, PFN을 다 저장하지 않고 VPN은 index로 사용한다. 따라서 PFN만 저장하게 된다.각 entry는 page table entry(PTE)라고 한다. 각 entry는 PFN이외에 추가적인 정보도 저장한다. 그래서 일반적으로 PTE의 크기가 32비트, 즉 4바이트가 된다. 그런 PTE가 2^20개 있으므로 page table의 전체크기는 4MB라고 짐작할 수 있다.(꽤 큰거)
❓ page table은 어디에 저장되어있는가?
page table은 레지스터처럼 저장하면 너무 크니까 메모리에 존재하고 운영체제가 관리한다.
❓ page table에는 뭐가 쓰여있을까?
위에서 언급했듯이 VPN과 PFN을 맵핑하기 위해 PFN과 기타 정보를 갖는 PTE 여러개로 구성되어있다. 기타 정보는 다음과 같다.
- Valid bit : 현재 맵핑된적이 있는지 없는지
- Protection bits : 해당 페이지가 읽을 수 있는지, 쓸 수 있는지, 실행될 수 있는지
- Present bit : 해당 페이지가 메모리에 있는지(스왑 아웃 되었는지.. 스왑은 다다음장에)
- Dirty bit : 메모리에 맵핑된 후 페이지가 변경되었는지
- Reference bit : 페이지가 접근되었는지 추적하기 위해 사용(페이지 교체에 중요함.. 페이지 교체도 다다다음장에)
❓ 페이징이 시스템을 느리게 하진 않을까?
페이징을 지원하기위해 cpu가 메모리에 있는 page table을 가리키기 위한 레지스터가 따로 존재한다. page table base register(ptbr)이라고 한다. 이 ptbr은 페이지 테이블의 시작주소를 저장하고있다. 레지스터를 접근하기 때문에 상당히 느리다고 볼 수 있다. 이 점을 어떻게 해결할지는 다음장에..