3 분 소요

본 글은 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

  • 만일 프로그램을 일부분만 메모리에 올려놓고 실행할 수 있다면 다음과 같은 많은 이점이 있다.
  1. 프로그램은 물리 메모리 크기에 의해 더는 제약받지 않게 된다.
  2. 각 프로그램이 더 작은 메모리를 차지하므로 더 많은 프로그램을 동시에 수행할 수 있게 된다.
    • 이에 따라 응답 시간은 늘어나지 않으면서도 CPU 이용률(utilization)과 처리율(throughput)이 높아진다.
  3. 프로그램을 메모리에 올리고 스왑(swap)하는 데 필요한 I/O 회수가 줄어들기 때문에 프로그램들이 보다 빨리 실행된다.


  • 따라서, 프로그램의 일부만을 메모리에 올려놓고 실행하게 되면, 시스템과 사용자 모두에게 이득이 된다.
  • 가상 메모리는 실제의 물리 메모리 개념과 개발자의 논리 메모리 개념을 분리한 것이다.


image


  • 한 프로세스의 가상 주소 공간(virtual address space)은 그 프로세스가 메모리에 저장되는 논리적인 뷰(view)를 말한다.
  • 일반적으로, Fig 10.2에서와 같이 특정 논리 주소(0번지)에서 시작하여 연속적인 공간을 차지한다.
  • 물리적인 페이지 프레임을 논리적인 페이지로 맵핑하는 것은 MMU가 결정한다.

image


  • 가상 메모리는 페이지 공유를 통해 파일이나 메모리가 둘 또는 그 이상의 프로세스들에 의해 공유되는 것을 가능하게 한다.

image

  • 이는 다음과 같은 장점이 있다.
  1. 시스템 라이브러리가 여러 프로세스들에 공유될 수 있다.
    • 각 프로세스는 라이브러리가 자신의 가상 주소 공간 일부라고 생각하지만, 실제로는 라이브러리가 존재하는 물리 메모리 페이지들은 모든 프로세스에 공유되고 있다.
  2. 프로세스들이 메모리를 공유할 수 있다.
    • 가상 메모리는 한 프로세스가 다른 프로세스와 공유할 수 있는 영역을 만들 수 있도록 해준다.
  3. 페이지는 fork() 시스템 콜을 통한 프로세스 생성 과정 중에 공유될 수 있기 때문에 프로세스 생성 속도를 높일 수 있다.



10.2 Demand Paging

  • 실행 프로그램을 보조저장장치에서 메모리로 적재할 수 있는 전략으로 필요한 페이지만 적재하는 방법이 있다.
  • 이 기법을 요구 페이징(demand paging)이라고 하며 가상 메모리 시스템에서 일반적으로 사용된다.
  • 요구 페이징 가상 메모리를 사용하면 프로그램 실행 중 필요할 때만 페이지가 적재된다.


10.2.1 Basic Concepts

  • 요구 페이징을 통해 프로세스가 실행되는 동안 일부 페이지는 메모리에 있고 일부는 보조저장장치에 있다.
  • 따라서 이 둘을 구별하기 위해 하드웨어 지원이 필요하다.
    • 메모리에 올라오는 페이지에 대해서는 유효(valid)로 설정하며, 현재 메모리에 올라와 있지 않은 페이지의 페이지 테이블 항목은 무효(invalid)로 설정하기만 하면 된다.

image


  • 그러나 프로세스가 메모리에 올라와 있지 않은 페이지에 접근하려고 하면 페이지 폴트 트랩(page-fault trap)을 발생시킨다.
  • 페이징 하드웨어는 페이지 테이블을 이용한 주소 변환 과정에서 무효 비트를 발견하고 운영체제에 트랩을 건다.
  • 페이지 폴트를 처리하는 과정은 다음과 같다. (Fig. 10.5)

image

  1. 운영체제에 트랩을 요청한다.
  2. 레지스터들과 프로세스 상태를 저장한다.
  3. 인터럽트 원인이 페이지 폴트임을 알아낸다.
  4. 페이지 참조가 유효한 것인지 확인하고, 보조저장장치에 있는 페이지의 위치를 알아낸다.
  5. 저장장치에 가용 프레임으로의 읽기 요구를 낸다.
  6. 기다리는 동안에 CPU 코어는 다른 사용자에게 할당된다.
  7. 저장장치가 다 읽었다고 인터럽트를 건다.(I/O 완료)
  8. 다른 프로세스의 레지스터들과 프로세스 상태를 저장한다.
  9. 인터럽트가 보조저장장치로부터 왔다는 것을 알아낸다.
  10. 새 페이지가 메모리로 올라왔다는 것을 페이지 테이블과 다른 테이블들에 기록한다.
  11. CPU 코어가 자기 차례로 오기까지 다시 기다린다.
  12. CPU 차례가 오면 위에서 저장시켜 두었던 레지스터들, 프로세스 상태, 새로운 페이지 테이블을 복원시키고 인터럽트 되었던 명령어를 다시 실행한다.

순수 요구 페이징(pure demand paging)은 어떤 페이지가 필요해지기 전에는 결코 그 페이지를 메모리로 적재하지 않는 방법이다.


  • 요구 페이징을 위한 필수적인 요구 사항은 페이지 폴트 오류 처리 후에 명령어 처리를 다시 시작할 수 있어야 한다는 것이다.
  • 페이지 폴트가 발생하여 중단된 프로세스 상태(registers, condition code, instruction counter)를 보관해 두면, 같은 상태에서 프로세스를 다시 수행할 수 있다.


10.2.2 Free-Frame List

  • 페이지 폴트가 발생하면 운영체제는 요청된 페이지를 보조저장장치에서 메인 메모리로 가져와야 한다.
  • 페이지 폴트를 해결하기 위해 대부분의 운영체제는 이러한 요청을 충족시키기 위해 사용하기 위한 가용 프레임의 풀(pool)인 가용 프레임 리스트(free-frame list)를 유지한다. (Fig 10.6)
    • 프로세스의 스택 또는 힙 세그먼트가 확장될 때도 가용 프레임이 할당되어야 한다.

image

  • 운영체제는 일반적으로 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
  • 이때 공유되는 페이지를 쓰기 시 복사 페이지라고 표시한다.
    • 둘 중 한 프로세스가 공유 중인 페이지에 쓸 때 그 페이지의 복사본이 만들어진다는 의미이다.
    • 자식 프로세스는 개인용으로 따로 만들어준 페이지에 수정을 가한다.
    • 이렇게 하면 프로세스가 수정을 하는 페이지들에 대해서만 복사본이 생기게 된다.

image

image





References

댓글남기기