오늘은 메모리를 효율적으로 관리할 수 있도록 해주는 아주 중요한 개념인 가상 메모리. Virtual Memory에 대해서 다뤄보겠습니다.
Virtual Memory
가상 메모리 방법이란 프로세스가 메모리와 디스크를 하나의 장치로 인식하여 필요할 때, 메모리에 로드하고, 그렇지 않을 때는 보조 기억 장치에 저장하는 방식입니다.
이러한 기법을 메모리를 조금 더 효율적이게 사용할 수 있습니다.
우리가 정말 예전에 들었던 우체국 예시를 들어보려고 합니다.
우체국 직원은 프로세서 즉 CPU를 의미합니다. 우체국에서 자신의 차례가 되길 기다리거나, 현재 서비스를 받고 있는 고객을 프로세스라고 합시다.
(a)에서는 가상 메모리를 사용하지 않는 환경입니다. (b)는 가상메모리를 활용합니다. 고객들이 자신의 머리만 내밀고 고객에세 서비스를 받습니다.
우체국 직원은 고객의 일부분만으로 서비스를 진행하고 있는 것이 마치 가상 메모리와 같다고 볼 수 있겠습니다.
Advantages of Virtual Memory
가상 메모리를 통해 취할 수 있는 이점은 크게 두 가지로 보입니다.
- 프로세스가 메인 메모리의 크기에 구애받지 않습니다.
- 더 많은 프로세스들이 메인 메모리에 올라가게 됩니다.
이러한 장점은 사실 컴퓨터의 기능적인 측면에서 매우 중요한 부분이 되며, 이러한 장점만으로도 충분히 사용할 수 있는 기법입니다.
Execution of Program
그렇다면 가상 메모리를 사용하였을 때 어떠한 방식으로 진행되는지 살펴보겠습니다.
1. OS는 프로세스의 일부분을 메인 메모리로 읽어옵니다.
프로세스의 부분들 중 메인 메모리에 로드된 부분을 Resident set이라고 부릅니다.
2. 만약 메인메모리에 존재하지 않는 주소에 접근하려고 한다면 CPU는 interrupt를 생성합니다.
메인 메모리에 있지 않다는 것은 해당 프로세스의 page가 보조 기억 장치에 존재함을 의미합니다.
3. OS는 interrupt를 보내고 해당 프로세스를 block 상태로 변경합니다.
interrupt는 disk I/O에게 메인 메모리에 존재하지 않는 부분을 메모리로 로드하도록 요청하며 page fault라는 interrupt를 보냅니다.
4. disk가 해당 page를 읽어와 메모리에 올리는 동안 OS는 다른 프로세스를 실행합니다.
만약 I/O에서 해당 요청을 모두 완수했다면 CPU에게 interrupt를 보내 작업을 완료했음을 알리고 OS는 해당 프로세스를 ready 상태로 보냅니다.
5. OS의 스케쥴러 정책에 의해 아까의 프로세스가 배정되면 page fault는 해결되며 해당 page를 읽어올 수 있습니다.
이러한 흐름으로 가상 메모리를 이용할 수 있습니다.
Locality
Virtual Memory를 사용했을 때 단점을 생각해봅시다. 만약 우리가 프로세스 하나의 관점에서 생각해보면, 보조 기억 장치에서 프로세스의 정보를 불러와서 메모리에 write하는 작업의 횟수가 기존 virtual memory를 사용하지 않았을 때보다 더 많습니다.
I/O의 작업을 하는 것은 굉장히 속도가 느리므로 이는 프로세스 하나의 관점에서는 불리하게 작용할 수 있고 프로세스 성능을 낮추는 요인이 될 수 있습니다. 따라서 trun around(프로세스의 시작부터 끝까지 걸리는 시간)의 성능이 떨어집니다.
하지만 우리가 만든 프로세스들은 모두 코드를 기반으로 동작합니다. 우리의 코드는 위에서 아래로 쭉 내려가는 것이라고도 볼 수 있지만 반복적인 작업을 할 때가 더 많습니다. 이러한 특성을 Locality라고 하는데, 이런 Locality 특성 덕분에 Virtual memory의 성능이 극적으로 차이가 나지 않습니다.
실제 좌측에서 우측으로 진행되는 프로세스의 흐름을 보면 한 곳에서 반복되는 부분이 많이 보임을 알 수 있습니다.
지금까지 virtual memory에 대해서 알아봤습니다. 감사합니다.
'CS > OS' 카테고리의 다른 글
[운영체제] 다계층 페이지 테이블 (0) | 2023.12.09 |
---|---|
[운영체제] Demand Paging (2) | 2023.12.08 |
[운영체제] Paging (3) | 2023.12.08 |
[운영체제] Address Binding (0) | 2023.11.28 |
[운영체제] 메모리 관리 - Memory Partitioning (4) | 2023.11.27 |