728x90

지금까지 가상 주소 공간이 비현실적으로 작아서 모두 물리 메모리에 탑재가 가능한 것으로 가정하였다. 사실 실행 중인 프로세스의 전체 주소 공간이 메모리에 탑재된 것으로 가정하고 있었다. 이제 !! 가정을 없어지는 순간!!!

우리는 이를 위해서 메모리 계층에 레이어의 추가가 필요하다. 지금까지는 모든 페이지들이 물리 메모리에 존재하는 것을 가정하였다. 하지만 큰 주소 공간을 지원하기 위해서 운영체제는 주소 공간 중에 현재는 크게 필요하지 않는 메모리 일부를 보관해둘 공간이 필요하다. 보통 HDD, SDD가 이용된다.

한 가지 짚고 넘어가야하는 것, 왜 프로세스에게 굳이 큰 주소 공간을 제공해하는가?
→ 편리함과 사용 용이성, 주소 공간이 충분히 크면, 프로그램의 자료구조들을 위한 충분한 메모리 공간이 있는지 걱정하지 않아도 된다. 필요시 메모리 할당을 OS에게 요청하기만하면 된다.

멀티프로그래밍과 사용 편의성 등의 이유로 실제 물리 메모리보다 더 많은 용량의 메모리가 필요하게 되었다. 이것이 현대 Virtual Memory의 역할이다. 이제 그 방식을 배워보자.

즉, 현대 Vritual Memory의 역할은 멀티 프로그램과 사용 편의성에 의해서 물리 메모리보다 더 많은 용량의 메모리를 필요로 한다.

OS는 어떻게 Disk,Ssd를 사용하면서

                         커다란 주소 공간이 있다고 착각을 주게 해줄까?

Swap Space

가장 먼저 할 일은 1. 디스크에 페이지들을 저장할 수 있는 일정 공간을 확보하는 것이다.
이 일정 공간을 → swap space라고 한다. os는 swap space에 있는 모든 페이지들의 디스크 주소를 기억해야한다. → 잊어버리면 안되는게 당연

Swap space의 크기는 매우 중요하다. 시스템이 사용할 수있는 메모리 페이지의 크기를 결정하기 때문이다. 문제를 단순화하기 위해서 ↓
Assumption: Swap space는 매우 가정하자.

예: 물리 메모리와 swap space에는 각각 4개의 페이지와 8개의 페이지를 위한 공간이 존재한다. 이 예에서는 3개의 프로세스 0, 1, 2가 물리 메모리를 공유하고 있다. 이들 세 프로세스는 몇개의 유효한 페이지들만 메모리에 올려 놓았으며 나머지 페이지들은 디스크에 swap out되어있다. 4번째 프로세스 Proc3의 모든 페이지들은 disk로 swap out되어 있어 현재 실행 중이 아니다. swap space 내의 하나의 블럭이 비어있다. 예제를 통해 swap space를 이용하면, 실제 물리적으로 존재하는 메모리 공간보다 더 많은 공간이 존재하는 것처럼 가장할 수 있다는 사실을 알 수 있다.

The Present Bit

디스크에 swap space을 확보했으니 이제 page swap을 위한 기능을 다루자.
Assumption: A hardware기반의 TLB를 사용하는 시스템이 존재한다.

  1. 먼저 메모리를 참조되는 가정을 기억해보자.
  2. 프로세스가 가상 메모리 참조를 생성한다.
  3. (명령어 탑재, 데이터 접근 등) 하드웨어는 메모리에서 원하는 데이터를 가져오기 전에, 우선 가상 주소를 물리 주소로 변환한다.
  4. 하드웨어는 먼저 가상 주소에서 VPN을 추출한 후에 TLB에 해당 정보가 있는지 검사한다.(TLB HIT)
    3-1.만약 HIT가 되면 물리 주소를 얻은 후에 메모리에 가져온다.
    3-2.만약 VPN을 TLB에서 찾을 수 없다면?(TLB MISS).
    3-2-1.하드웨어는 페이지 테이블의 메모리 주소를 파악하고, VPN을 인덱스로 하여 원하는 페이지 테이블 항목(PTE)을 추출한다.
    3-2-2.해당 페이지 테이블 항목이 유효하고 관련 페이지가 물리 메모리에 존재하면 하드웨어는 PTE에서 PFN 정보를 추출하고 그 정보를 TLB에 탑재한다.
    3-2-3.TLB 탑재 후 명령어를 재실행한다. 이번에는 TLB에서 HIT된다.

페이지가 디스크로 Swap되는 것을 가능케하려면 많은 기법을 추가되어야한다. ⇒ 그 중 특히, 하드웨어가 PTE에서 해당 페이지가 물리 메모리에 존재하지 않다는 것을 표현해야한다.
하드웨어는 present bit를 사용하여 각 PTE에 어떤 페이지가 존재하는지를 표현한다.
Present bit = 1로 설정되어 있다면, 물리 메모리에 해당 페이지가 존재한다는 것이고 위에 설명한대로 동작한다.
Present bit = 0으로 설정되어있다면, 해당 페이지가 존재하지 않고 디스크 어딘가에 존재한다는 것을 나타낸다. 존재하지 않는 페이지를 접근행위를 일반적으로 PAGE FAULT라한다.
Page fault가 발생하면, Page fault를 처리하기위해 os로 제어권이 넘어간다. page-fault handler가 실행된다.!

The Page Fault!

TLB 미스의 처리 방법에 따라 두 종류의 시스템이 있었다.

  1. 하드웨어 기반의 TLB(하드웨어가 페이지 테이블을 검색하여 원하는 변환 정보 찾기)
  2. 소프트웨어 기반의 TLB(OS가 처리하는 것)이다.
    둘 중 어느 것이던, page fault가 발생하면 os가 그 처리를 담당한다. os의 page fault handler가 그 처리 매커니즘을 규정한다.

만약 요청된 페이지가 메모리에 없고, 디스크로 스왑되었다면, 운영체제는 해당 페이지를 메모리로 스왑해 온다. → 자연적으로 등장하는 질문이 있다. 원하는 페이지의 위치를 어떻게 파악할까?

많은 시스템들에서 해당 정보 즉 해당 페이지의 스왑 공간상에서의 위치를 페이지 테이블에 저장한다. 운영체제는 PFN과 같은 PTE비트들을 페이지의 디스크 주소를 나타내는 데 사용할 수 있다.
페이지 폴트 발생 시, 운영체제는 페이지테이블 항목에서 해당 페이지의 디스크 상 위치를 파악하여, 메모리로 탑재한다.

디스크I/O가 완료가 되면 운영체제는 해당 페이지 테이블 항목(PTE)의 PFN값을탑재된 페이지의 메모리 위치로 갱신한다. 이 작업이 완료되면 페이지 폴트를 발생시킨 명령어가 재실행된다.

재실행으로 인해 TLB미스가 발생될 수 있다. TLB미스 처리과정에서 TLB값이 갱신된다(이를 피하기 위한 대안으로 페이지 폴트를 처리 시 함께 TLB를 갱신하도록 할 수도 있다).
최종적으로, 마지막 재실행 시에 TLB에서 주소 변환정보를 찾게 되고, 이를 이용하여 물리 주소에서 원하는 데이터나 명령어를 가져온다.

I/O전송 중에는 해당 프로세스가차단된(blocked) 상태가 된다는 것을 유의해야한다. 페이지 폴트 처리 시 운영체제는 다른 프로세스들을 실행할 수 있다. I/O실행은매우 시간이 많이 소요되기 때문에 한 프로세스의I/O작업(페이지 폴트)과 다른 프로세스의 실행을 중첩(overlap)시키는 것은 멀티 프로그램된 시스템에서 하드웨어를최대한 효율적으로 사용하는 방법 중 하나다.

Page Fault Control Flow

  1. 페이지가 존재하며 유효한가? 18-21

1-1. TLB 미스 핸들러가 PTE에서 PFN을 가져와 명령어를 재시도(여러번) 한다. → TLB HIT

  1. 22-23 페이지가 유효하지만 존재하지 않는 경우→ 페이지 폴트 핸들러가 반드시 실행
    프로세스가 사용할 수 있는 제대로 페이지 이기는 하지만 물리 메모리에 존재하지 않을 수 있다.
  2. 페이지가 유효하지 않는 경우
    프로그램 버그 등으로 잘못된 주소에 접근하는 경우의 처리를 나타냄. 13-14
    ptE의 다른 비트는 의미가 없다. 이 경우 os의 트랜 핸들러로 처리한다.

운영체제가 PAGE FAULT 처리

  1. OS는 LODE할 페이지를 위한 물리 프레임을 확보한다. 만약 여유 프레임이 없다면 교체 알고리즘을 실행하여 메모리에서 페이지를 내보내고 여유 공간을 확보한다.
  2. 물리 프레임을 확보한후, I/O 요청을 통해 스왑 영역에서 페이지를 읽어온다.
  3. 이 느린 작업이 완료되면 OS는 페이지 테이블을 갱신하고 명령어를 재시도한다. 재시도 하게 되면 TLB 미스가 발생하고 또한번 재시도하면 TLB히트가 된다.
반응형

+ Recent posts