요즈음 대부분의 컴퓨터들은 Virtual Memory를 이용하여 메모리를 할당한다.
메모리에 완전히 로딩되어 있지 않은(존재하지 않는) 프로세스를 실행할 수 있도록 허가해주는 기술
프로세스 이미지를 여러 조각으로 분할하고, 실행 중에 각 시기에 필요한 블록들을 메모리에 로딩한다.
Logical Memory와 Physical Memory를 완전히 분리시키는 효과가 발생한다. 즉 Logical Memory가 Physical Memory에 의해 제한을 받거나, 영향을 받지않는다.
1) 프로그래밍이 쉬워진다.
프로그래머는 총 메모리 용량을 고려하면서 코딩할 필요가 없다.
2) Multiprogramming Degree가 더 높아진다.
메모리를 할당받는 프로세스의 개수가 더 많아진다. 한 프로세스가 사용하는 메모리 공간의 양이 더 작아지기 때문이다.
3) CPU의 활용도와 Throughput이 높아진다.
다만, 한 프로세스의 기준으로 봤을 때 response time과 turnaround time은 좋지 않을 수 있다.
4) 프로세스를 swapping 할 때 걸리는 시간이 줄어든다.
Virtual Memory에서 프로세스의 일부만 메모리에 들어 있으므로, swapping과 loading에 걸리는 시간이 줄어든다.
1) Address Mapping Overhead가 존재한다.
Contiguous Allocation에선 오버헤드가 적지만, Virtual Memory나 Discontiguous Allocation에서는 페이지 테이블을 이용해야 하고 mapping해야 하므로 오버헤드가 존재한다.
2) Page Fault Handling Overhead
✔ 내가 원하는 프로세스 조각이 현재 메모리에 없는 현상
프로세스 이미지가 메모리에 전부 들어있지 않은 상태에서 프로세스를 실행시키는데, address를 generation했는데 메모리에 현재 없는 경우이다.
-> 디스크 스토리지에서 해당 조각을 읽고 들어와야 하는데, disk I/O 가 발생하므로 CPU에서 Context Switching이 발생한다. 이 또한 오버헤드로 작용한다.➡ 따라서 Real Time이나 embedded 시스템에서는 Virtual Memory 기법을 아주 신중히 사용해야 한다.
1) Demand Paging
사용자 프로그램을 같은 사이즈의 블록으로 나누는 것
2) Segmentation
사용자 프로그램을 다른 사이즈의 논리적 블록으로 나누는 것
3) Hybrid paging/segmentation
위 방법들을 믹스한 방법