운영체제(OSTEP)

OSTEP 21장

woohap 2024. 11. 12. 00:11

메모리 계층에 레이어의 추가 필요

- 지금까지 모든 페이지들이 물리 메모리에 존재한다고 가정
- 현재 크게 필요하지 않은 일부를 보관해 둘 공간이 필요
- 현대 시스템에서 보통 하드 디스크가 이를 담당

**
주소 공간이 충분히 크면, 프로그램의 자료구조들을 위한 충분한 메모리 공간이 있는지 걱정 X
필요 시 메모리 할당을 운영체제에게 요청하기만 하면 된다.

스왑공간은 실행되는 각 프로세스들에게 큰 가상 메모리가 있는 것 같은 환상을 줌 
- 멀티 프로그래밍 시스템이 발명되면서 많은 프로세스들의 페이지를 물리 메모리에 전부 저장하는 것은 불가능
- 일부 페이지를 스왑 아웃하는 기능이 필요
- 멀티 프로그래밍과 사용 편의성 등의 이유로 실제 메모리보다 더 많은 용량의 메모리가 필요

스왑공간

디스크(HDD)에 페이지들을 저장할 수 있는 일정 공간을 확보하는 것 
- 메모리 페이지를 읽어서 디스크에 쓸 수 있다.(Swap Out)
- 디스크에서 페이지를 읽어 메모리에 탑재할 수 있다.(Swap In)
- 일반적으로 스왑 공간의 입출력 단위는 페이지를 사용
- 운영체제는 스왑 공간에 있는 모든 페이지들의 디스크 주소를 기억해야 함 
- 스왑 공간의 크기는 중요, 시스템이 사용할 수 있는 메모리 페이지의 최대 수를 결정하기 때문

스왑 예제

 

- 세 개의 프로세스(p1, p2, p3)가 물리 메모리를 공유
- 세 프로세스는 몇 개의 유효한 페이지들만 메모리에 올려 놓았고, 나머지는 스왑 아웃되어 있음
- 네 번째 프로세스의 모든 페이지들은 디스크로 스왑 아웃 됨 
- 스왑 영역에 하나의 블록이 비어 있음

**
스왑 공간에만 스왑하 수 있는 것은 아니다.
Ex)
코드 영역의 페이지들은 즉시 다른 페이지가 사용할 수 있음(스와핑 X)
- 디스크에 원본이 있으므로 언제든디 다시 스왑 인 가능하기 때문

present bit

present Bit를 사용하여 물리 메모리에 존재 여부를 표현 
present bit가 1이면 물리 메모리에 존재한다는 것 
present bit가 0이면 물리 메모리에 존재하지 않고, 디스크 어딘가에 존재하는 것 

**
물리 메모리에 존재하지 않는 페이지를 접근하는 행위를 일반적으로 페이지 폴트라고 한다.
페이지 폴트가 발생하면, 페이지 폴트를 처리하기 위해 운영체제로 제어권이 넘어간다.
그리고 페이지 폴트 핸들러가 실행된다.

페이지 폴트

- 일반적으로 하드웨어 기반 TLB든 소프트웨어 기반 TLB든 페이지 폴트가 발생하면 
  운영체제가 그 처리를 담당한다.
- 페이지 폴트 핸들러가 그 처리 메커니즘을 규정한다.
- 만약 요청된 페이지가 메모리에 없고 디스크로 스왑됐다면, 
  운영체제는 해당 페이지를 메모리로 스왑해온다.

스왑공간에서 원하는 페이지의 위치를 어떻게 파악하는가 ??

일반적으로 페이지의 위치를 페이지 테이블에 저장한다.
운영체제는 PFN과 같은 PTE 비트들을 페이지 디스크 주소를 나타내는 데 사용할 수 있음 

- 페이지 폴트 발생 시 , 운영체제는 페이지 테이블 항목에서 해당 페이지 위치를 파악하여 메모리로 탑재
- 메모리 탑재 완료 후 PTE의 PFN 값을 탑재된 페이지의 메모리 위치로 갱신
- I/O 작업을 완료하면 페이지 폴트를 발생시킨 명령어가 재실행됨 
  재실행으로 인해 TLB 미스가 발생할 수 있음
  이 경우, TLB 미스 처리 과정에서 TLB 값이 갱신 됨

****
스와핑도 I/O 작업이므로 전송 중에 해당 프로세스는 블록(Blocked)된다. 

물리 메모리 부족한 경우

물리 메모리 공간이 부족한 경우 탑재하는 페이지들을 위한 공간을 확보한 뒤 탑재된다.
즉, 하나 또는 그 이상의 페이지들을 스왑 아웃한 뒤 새 페이지들을 스왑 인 시킨다.
교체 페이지를 선택하는 것을 페이지 교체 정책이라고 한다.

- 희생자 페이지를 잘못 선택하면 성능에 큰 악영향을 미친다.
  잘못된 선택을 하는 경우 프로그램이 메모리 속도가 아진 디스크 속도로 동작할 수 있음

페이지 폴트의 처리

// 페이지 오류 제어 흐름의 알고리즘(하드웨어)
VPN = (VirtualAddress & VPN_MASK) >> SHIFT
(Success, TlbEntry) = TLB_Lookup(VPN)
if (Success == True) 
    if (CanAccess(TlbEntry.ProtectBits) == True)
        Offset = VirtualAddress & OFFSET_MASK
        PhysAddr = (TlbEntry.PFN << SHIFT) | Offset
        Register = \gndx{AccessMemory} (\gndx{PhysAddr})
    else 
        RaiseException(PROTECTION_FAULT)
else                          // TLB 미스 
    PTEAddr = PTBR + (VPN * sizeof(PTE))
    PTE = \gndx{AccessMemory} (\gndx{PTEAddr})
    if (PTE.Valid == False) // 셋째 경우 
        RaiseException(SEGMENTATION_FAULT)
    else 
        if (CanAccess(PTE.ProtectBits) == False)
            RaiseException(SEGMENTATION_FAULT)
        else if (PTE.present == True) // 첫째 경우 
            // 하드웨어 기반으로 한 TLB를 가정
            TLB_Insert(VPN, PTE.PFN, PTE.ProtectBits)
            RetryInstruction()
        else if (PTE.Present == False) //둘째 경우 
            RaiseException(PAGE_FAULT)
세 가지 중요한 경우가 있음 

- 첫째, 페이지가 존재하며, 유효한 경우 
  TLB 미스 핸들러가 PTE에서 PFN을 가져와 명령어를 재시도
- 둘째, 페이지가 유효하지만 존재하지 않는 경우
  페이지 폴트 핸들러가 반드시 실행되어야 한다.프로세스가 사용할 수 있는 제대로 된 페이지이기는 하지만, 물리 메모리에 존재하지 않기 때문
- 셋째, 페이지가 유효하지 않은 경우 
  프로그램 버그 등으로 잘못된 주소를 접근하는 경우를 처리한다. 
  하드웨어는 이 무효한 접근이 운영체제의 트랩 핸들러에 의해 처리되도록 함 
  이 때 문제를 일으킨 프로세스는 종료될 수 있다.
// 페이지 오류 제어 흐름의 알고리즘(소프트웨어)
PFN = FindFreePhysicalPage()
if (PFN == -1)                                // 비어있는 페이지 못 찾음
    PFN = EvictPage()                           // 교체 알고리즘 실행
    \gndx{DiskRead} (\gndx{PTE.DiskAddr, pfn})  // 대기(I/O를 기다리기)
    PTE.present = True                          // 존재한다고 페이지 테이블에 갱신
    PTE.PFN = PFN                               // 비트와 변환(PFN)
    RetryInstruction()                          // 명령어 재시도 
운영체제가 페이지 폴트를 처리하는 과정을 대략적으로 보여준다.

- 운영체제는 탑재할 페이지를 위한 물리 프레임을 확보한다.
- 물리 메모리가 여유가 없으면 교체 알고리즘을 실행하여 여유 공간 확보
- 이후 I/O 요청을 통해 스왑 영역에서 페이지를 읽어온다.
- 작업을 마치면, 운영체제는 페이지 테이블을 갱신하고, 명령어를 재실행
- 재실행 시 TLB 미스가 발생하여 또 한 번의 재시도를 할 때 TLB 히트 발생

교체는 실제 언제 일어나는가 ??

메모리에 여유 공간이 고갈된 후에 교체 알고리즘이 작동하는 것은 효율적이지 않음 
다양한 이유로 운영체제는 항상 여유 메모리 공간을 확보하고 있어야 함
대부분의 운영체제는 여유 공간과 관련된 최댓값, 최솟값을 설정하여 교체 알고리즘 작동에 활용 

- 여유 공간의 크기가 최솟값보다 작아지면 여유 공간 확보를 담당하는 백그라운드 쓰레드가 실행 됨
  이 쓰레드는 여유 공간의 크기가 최댓값에 이를 때까지 페이지를 제거 
  이 백그라운드 쓰레드를 스왑 데몬, 페이지 데몬이라고 부른다. 
  여유 공간을 확보하면 해당 쓰레드는 슬립 모드로 들어간다.

'운영체제(OSTEP)' 카테고리의 다른 글

OSTEP 22장  (1) 2024.11.14
OSTEP 18장(페이징)  (0) 2024.11.10
빈 공간 관리  (1) 2024.11.09
OSTEP 16장  (0) 2024.10.31
OSTEP 14장  (0) 2024.10.19