[Operating System Concepts 10th] 10. Virtual Memory 리뷰 (1)
본 글은 Operating System Concepts 10th (운영체제) 책을 보며 내용을 개인 공부에 목적으로 정리했습니다.
이전에 운영체제 관련 강의들을 들으면서 정리한 시리즈 글들이 있는데,
지식을 습득하는 데 있어 가장 느리지만 가장 빠른 방법이 원본책을 자세히 보는 것이라 생각됩니다.
책 내용들을 최대한 이해하기 위해 거의 모든 내용을 담고 있습니다.
책 pdf 링크 : Operating System Concepts 10th Edition by Abraham Silberschatz Peter B Galvin Greg Gagne pdf free download
연습 문제 정답지 : Solutions of Practice Exercises, Tenth Edition of Operating System Concepts, AVI SILBERSCHATZ
10. Virtual Memory
- 메모리 관련 많은 전략들의 목적은 멀티 프로그래밍을 실현하기 위해 메모리에 많은 프로세스를 동시에 유지하기 위함에 있다.
- 그러나 지금까지의 접근 방식은 프로세스 전체가 실행되기 전에 메모리로 올라와야 한다고 전제했다.
- 가상 메모리(virtual memory)는 프로세스 전체가 메모리 내에 올라오지 않더라도 실행이 가능하도록 하는 기법이다.
- 이는 사용자 프로그램이 물리 메모리보다 커져도 된다.
- 또한, 가상 메모리는 파일과 라이브러리의 공유를 쉽게 해주고 공유 메모리 구현을 가능하게 한다.
- 목표
- 가상 메모리를 정의하고 그 이점을 설명한다.
- 요구 페이징을 사용하여 페이지가 메모리에 적재되는 방법을 설명한다.
- FIFO, 최적 및 LRU 페이지 교체 알고리즘을 적용한다.
- 프로세스의 작업 집합을 설명하고 프로그램 지역성과 어떤 관련이 있는지 설명한다.
10.1 Background
- 만일 프로그램을 일부분만 메모리에 올려놓고 실행할 수 있다면 다음과 같은 많은 이점이 있다.
- 프로그램은 물리 메모리 크기에 의해 더는 제약받지 않게 된다.
- 각 프로그램이 더 작은 메모리를 차지하므로 더 많은 프로그램을 동시에 수행할 수 있게 된다.
- 이에 따라 응답 시간은 늘어나지 않으면서도 CPU 이용률(utilization)과 처리율(throughput)이 높아진다.
- 프로그램을 메모리에 올리고 스왑(swap)하는 데 필요한 I/O 회수가 줄어들기 때문에 프로그램들이 보다 빨리 실행된다.
- 따라서, 프로그램의 일부만을 메모리에 올려놓고 실행하게 되면, 시스템과 사용자 모두에게 이득이 된다.
- 가상 메모리는 실제의 물리 메모리 개념과 개발자의 논리 메모리 개념을 분리한 것이다.
- 한 프로세스의 가상 주소 공간(virtual address space)은 그 프로세스가 메모리에 저장되는 논리적인 뷰(view)를 말한다.
- 일반적으로, Fig 10.2에서와 같이 특정 논리 주소(0번지)에서 시작하여 연속적인 공간을 차지한다.
- 물리적인 페이지 프레임을 논리적인 페이지로 맵핑하는 것은 MMU가 결정한다.
- 가상 메모리는 페이지 공유를 통해 파일이나 메모리가 둘 또는 그 이상의 프로세스들에 의해 공유되는 것을 가능하게 한다.
- 이는 다음과 같은 장점이 있다.
- 시스템 라이브러리가 여러 프로세스들에 공유될 수 있다.
- 각 프로세스는 라이브러리가 자신의 가상 주소 공간 일부라고 생각하지만, 실제로는 라이브러리가 존재하는 물리 메모리 페이지들은 모든 프로세스에 공유되고 있다.
- 프로세스들이 메모리를 공유할 수 있다.
- 가상 메모리는 한 프로세스가 다른 프로세스와 공유할 수 있는 영역을 만들 수 있도록 해준다.
- 페이지는
fork()
시스템 콜을 통한 프로세스 생성 과정 중에 공유될 수 있기 때문에 프로세스 생성 속도를 높일 수 있다.
10.2 Demand Paging
- 실행 프로그램을 보조저장장치에서 메모리로 적재할 수 있는 전략으로 필요한 페이지만 적재하는 방법이 있다.
- 이 기법을 요구 페이징(demand paging)이라고 하며 가상 메모리 시스템에서 일반적으로 사용된다.
- 요구 페이징 가상 메모리를 사용하면 프로그램 실행 중 필요할 때만 페이지가 적재된다.
10.2.1 Basic Concepts
- 요구 페이징을 통해 프로세스가 실행되는 동안 일부 페이지는 메모리에 있고 일부는 보조저장장치에 있다.
- 따라서 이 둘을 구별하기 위해 하드웨어 지원이 필요하다.
- 메모리에 올라오는 페이지에 대해서는 유효(valid)로 설정하며, 현재 메모리에 올라와 있지 않은 페이지의 페이지 테이블 항목은 무효(invalid)로 설정하기만 하면 된다.
- 그러나 프로세스가 메모리에 올라와 있지 않은 페이지에 접근하려고 하면 페이지 폴트 트랩(page-fault trap)을 발생시킨다.
- 페이징 하드웨어는 페이지 테이블을 이용한 주소 변환 과정에서 무효 비트를 발견하고 운영체제에 트랩을 건다.
- 페이지 폴트를 처리하는 과정은 다음과 같다. (Fig. 10.5)
- 운영체제에 트랩을 요청한다.
- 레지스터들과 프로세스 상태를 저장한다.
- 인터럽트 원인이 페이지 폴트임을 알아낸다.
- 페이지 참조가 유효한 것인지 확인하고, 보조저장장치에 있는 페이지의 위치를 알아낸다.
- 저장장치에 가용 프레임으로의 읽기 요구를 낸다.
- 기다리는 동안에 CPU 코어는 다른 사용자에게 할당된다.
- 저장장치가 다 읽었다고 인터럽트를 건다.(I/O 완료)
- 다른 프로세스의 레지스터들과 프로세스 상태를 저장한다.
- 인터럽트가 보조저장장치로부터 왔다는 것을 알아낸다.
- 새 페이지가 메모리로 올라왔다는 것을 페이지 테이블과 다른 테이블들에 기록한다.
- CPU 코어가 자기 차례로 오기까지 다시 기다린다.
- CPU 차례가 오면 위에서 저장시켜 두었던 레지스터들, 프로세스 상태, 새로운 페이지 테이블을 복원시키고 인터럽트 되었던 명령어를 다시 실행한다.
순수 요구 페이징(pure demand paging)은 어떤 페이지가 필요해지기 전에는 결코 그 페이지를 메모리로 적재하지 않는 방법이다.
- 요구 페이징을 위한 필수적인 요구 사항은 페이지 폴트 오류 처리 후에 명령어 처리를 다시 시작할 수 있어야 한다는 것이다.
- 페이지 폴트가 발생하여 중단된 프로세스 상태(registers, condition code, instruction counter)를 보관해 두면, 같은 상태에서 프로세스를 다시 수행할 수 있다.
10.2.2 Free-Frame List
- 페이지 폴트가 발생하면 운영체제는 요청된 페이지를 보조저장장치에서 메인 메모리로 가져와야 한다.
- 페이지 폴트를 해결하기 위해 대부분의 운영체제는 이러한 요청을 충족시키기 위해 사용하기 위한 가용 프레임의 풀(pool)인 가용 프레임 리스트(free-frame list)를 유지한다. (Fig 10.6)
- 프로세스의 스택 또는 힙 세그먼트가 확장될 때도 가용 프레임이 할당되어야 한다.
- 운영체제는 일반적으로 zero-fill-on-demand 기법을 사용하여 가용 프레임을 할당한다.
- zero-fill-on-demand 프레임은 할당되기 전에 0으로 모두 채워져 이전 내용이 지워진다.
- 시스템이 시작되면 모든 가용 메모리가 가용 프레임 리스트에 넣어진다.
10.2.3 Performance of Demand Paging
- 요구 페이징은 컴퓨터 시스템의 성능에 큰 영향을 줄 수 있다.
- 페이지 폴트의 확률이 $p$라 하면, 실질 접근 시간은 다음과 같다.
- $실질 접근 시간 = (1-p) \times ma + p \times $ $페이지\ 폴트\ 시간$
- 실제 접근 시간은 페이지 폴트율(page fault rate)에 비례한다.
- 따라서 페이지 폴트율을 낮게 유지하는 것이 상당히 중요하다.
10.3 Copy-on-Write
fork()
는 부모 프로세스와 똑같은 자식 프로세스를 만들어 준다.- 쓰기 시 복사(copy-one-write) 방식에서는 자식 프로세스가 시작할 때 부모의 페이지를 당분간 함께 사용하도록 한다.
- Copy-On-Write : 리소스가 복제되었지만 수정되지 않은 경우에 새 리소스를 만들 필요 없이 복사본과 원본이 리소스를 공유하고, 복사본이 수정되었을 때만 새 리소스를 만드는 리소스 관리 기법을 말한다. 1
- 이때 공유되는 페이지를 쓰기 시 복사 페이지라고 표시한다.
- 둘 중 한 프로세스가 공유 중인 페이지에 쓸 때 그 페이지의 복사본이 만들어진다는 의미이다.
- 자식 프로세스는 개인용으로 따로 만들어준 페이지에 수정을 가한다.
- 이렇게 하면 프로세스가 수정을 하는 페이지들에 대해서만 복사본이 생기게 된다.
댓글남기기