1. Virtual Memory
- 메인메모리의 크기는 한정적이다.
- 더 큰 메모리의 수요를 만족시키기 위해 무한에 가까운 메모리를 사용하는 듯 해주는 방법이다.
- 만약 프로세서가 참조해야하는 데이터가 Secondary Memory에 있다면 그 부분을 메인메모리로 옮겨와 작업을 하도록 한다. 결국 사용자는 무한한 메모리를 가진 것 처럼 느낀다.
- 이전 장에서 프로세스는 paging, segmentation으로 여러 조각으로 나뉘어 비 연속적인 메모리 공간에 저장이 되고 매번 logical adress를 physical address로 run time에 변환하여 접근한다고 했다.
- 위 조건들이 보장된다면 사실 page와 segment들은 굳이 메모리에 항상 존재해야할 필요가 없다.
- 여기서 가상 메모리 개념이 시작된다.
- 메인 메모리에 올라간 프로세스를 resident set이라고 한다.
- 이전 장에서 process state를 공부할 때 프로세서가 참조해야 하는 주소가 메인메모리에 없다면 interrupt가 발생해 프로세스가 block된다고 했다.
- 즉 이렇게 block되어 disk로 이동한 프로세스에 대해서 page 혹은 segmentation table을 관리하다가 프로세서의 참조 요청이 들어오면 그 부분을 메인메모리로 옮겨와 작업을 하는 것이다.
- 이 것을 Virtual Memory라고 한다.
- 물론 필요한 page를 disk에서 main memory로 옮겨오는 과정에서 부하가 생기는데 이를 thrashing이라고 한다.
- 계속 요청하는 참조 주소가 disk를 가리킨다면 swapping이 빈번하게 일어날 것이고 이는 성능에 영향을 미칠 것이다.
- 한번 데이터를 요청했을 때, 이어서 필요한 데이터는 그 주변에 있을 확률이 높다는 "메모리 지역성"의 원리를 활용하여 page fault를 줄인다.
- 즉 page fault로 인해 한번 page를 main memory로 이동시키면 다음 요청하는 주소는 그 페이지에 있을 확률이 높다는 것이다. 이는 운영체제 별로 채택하는 정책에 따라 알고리즘이 다를 수 있다.
2. Virtual Memory Paging
- 프로그램 안에서는 가상주소(논리주소)로 모든 데이터의 위치를 표현하고 있다. 이를 실제 물리주소로 변환하여 프로세서가 메모리를 접근하게 되는데 이 과정을 살펴보자.
- virtual address는 page#와 offset으로 이루어져 있다. page#로 page table을 통해 해당 frame의 주소를 찾고 여기에 offset을 붙여서 실제 메모리 주소를 찾아간다.
- 이 주소 변환 과정은 cpu 한 클럭에 처리된다.
- 한 프로세스 마다 페이지 테이블이 생성되면 양이 어마어마하기 때문에 이를 효율적으로 관리하기 위해 계층 구조로 page table을 관리한다.
- Two-level paging System이다.
- 첫번재 10bit로 root table에서 frame number를 찾으면 4KB page table에서 두번째 10비트로 최종 frame#를 찾아 offset을 덧붙여 실제 주소를 찾는다.
- 해쉬를 활용해 page table을 관리하는 방법도 있다.
- 이를 Inverted Page Table이라고 한다.
- 프로세스당 페이지 테이블을 하나씩 만들면 양이 너무 많으니 메모리 전체에 대한 테이블을 하나 만들어서 관리하는 것이다.
- page#의 hash 값을 찾아 page table을 접근하는데 이 해쉬값이 실제 frame#가 된다. 이 값을 offset과 결합하는 방식이다
3. Translation Lookaside Buffer (TLB)
- 페이지들이 계층 구조를 이루어 메모리에 저장되면 가상주소를 실제 주소로 변환하는데 더 많은 시간이 든다.
- 예를들어 2계층 구조라면 한번 메모리 주소를 변환하기 위해 최소 두번의 테이블 탐색을 해야하고 결국 메모리 접근을 최소 두번 하게 된다.
- 따라서 메모리 접근 시간을 줄이기 위해 cache같은 역할을 해주는 TLB를 활용한다.
- 가상주소의 page#에 해당하는 Frame#가 TLB에 이미 있다면 TLB hit가 되어 page table을 거치지 않고도 Frame#의 주소를 바로 알 수 있게 된다.
- 즉 page table접근을 위해 메모리에 접근할 필요가 없게 된다.
- 애초에 page fault가 발생했다면 secondary memory에서 페이지를 메모리로 load하고 주소를 변환하여 해당 영역에 접근하게 된다.
4. Paging + TLB 동작 순서도
- 위의 순서도를 따라가면서 paging과 TLB를 활용한 virtual memory의 동작방식을 살펴보자.
- cpu는 가장먼저 page의 실제 주소가 TLB에 있는지 확인한다. 만약 있다면 offset과 결합하여 바로 물리 주소를 만들어낸다.
- 반대로 TLB에 없다면 page table을 접근하여 페이지가 메인 메모리에 올라와 있는지 확인을 한다. 확인이 되었다면 TLB를 업데이트하고 실제 물리주소를 계산하게 된다.
- 그러나 메인 메모리에 해당 page가 없다면 page fault가 일어난다. disk에 있는 page를 메인 메모리로 load하는 과정이 필요하고 load가 완료되면 다시 주소 변환을 거쳐서 해당 page에 접근하게 된다.
5. TLB + Cache Model
- 마지막으로 cache operation이 추가된 모습을 살펴보자.
- 가상주소를 실제주소로 변환하여 메인 메모리에 접근하기 전에 cache에 해당 내용이 있는지 확인하고 miss가 발생하면 메인 메모리로 데이터 접근을 시도한다.
6. Page Size
- page size를 작게하면 internal fragmentation이 줄어 남아도는 메모리 공간을 줄일 수 있지만 한 프로세스에 많은 page가 필요하게 된다. 그만큼 page table도 커질 것이다.
- 반대로 page size가 커지면 fragmentation은 커질 수 있지만 swapping이 일어날 때 한번에 큰 크기를 메인 메모리로 읽어올 수 있기 때문에 page fault를 줄일 수 있다.
- 위 그래프를 보면 page size가 어느시점 이상으로 커지고 프로세스에게 할당된 page수가 많아질 수록 page fault는 줄어든다.
- 보통은 운영체제에서 page 크기를 4KB정도로 정하고 있다.
'ComputerScience > Operating System' 카테고리의 다른 글
OS - 8.2 Virtual Memory (0) | 2021.07.29 |
---|---|
OS 7 - Memory Management (0) | 2021.07.20 |
OS - 6 Concurrency: Deadlock and Starvation (0) | 2021.07.20 |
OS - 5.2 Concurrency: Mutual Exclusion and Synchronization (0) | 2021.07.14 |
OS - 5.1 Concurrency: Mutual Exclusion and Synchronization (0) | 2021.07.13 |