메모리 Swapping에 대해서 알아보자
Swap : 필요한 주소 공간 전체를 메모리에 올려 두는 것이 아니라 그때그때 필요한 것들만 메모리에 올리고, 필요 없어지면 하드디스크로 내보내는 동작
Swap을 구현하는 방법들
- Overlays : 코드의 일부분, 데이터의 일부분을 가져오고 내보내는 동작을 프로그래머가 수동으로 구현하는 방법
- Process-level swapping : Process의 주소공간 전체가 메모리에 올라왔다가, 다른 process가 동작할 때 다시 제자리로 돌아가는 방법.
- Page-level swapping : Page단위로 디스크에서 가져왔다가 내려보내는 방법
Swap을 하기위한 공간 : swap space
- 디스크의 일부분을 swap space로 미리 설정을 해줌
- swap space의 크기는 사용할 수 있는 메모리 page의 최대 개수로 결정 가능
- Block size와 page size는 같은 의미이다. 동일하게 생각하자
- 파일시스템에서 swap공간을 파일로 생각할 수 있다.
Physical memory가 4개의 page를 가지고 있다.
PFN 0에는 process0의 VPN 0 을 가지고 있고, PFN 1에는 process1의 VPN 2가 있고,.... 이런 식으로 매핑되어있다.
그럼 그림에 나타나있지 않은 process1의 VPN 0, VPN 1은 어디에 있을까?
바로 Swap Space에 있을 것이다.
Swap Space에는 각 process의 VPN중에서 물리 메모리에 존재하지 않는(당장 필요없는) VPN들이 존재한다.
물리 메모리가 부족하더라도 Swap space를 활용해서 필요한 데이터를 그때 그때 가져와서 사용할 수 있다.
따라서 물리 메모리의 제한적인 공간을 늘릴 수 있는 효과를 얻게 되어 다양한 process를 사용할 수 있다.
CPU가 메모리에 접근하기 위해서는 코드에 있는 VPN(page table number + offset)을 page table을 이용해서 PFN으로 바꾸고 PFN을 offset과 더해서 physical address를 만들어서 접근한다.
내가 접근하고자 하는 page가 현재 메모리에 있는지, swap space에 있는지를 확인하는 bit가 존재한다.
이를 present bit라고 한다.
만약 present bit가 0일 때 발생하는 trap을 page fault라고 한다.
page fault : 사용하고자 하는 page는 지금 메모리가 부족해 swap space에 있다, 혹은 아직 디스크에서 올라오지 않았다는 trap이다.
아무리 Swap space를 사용한다고 하더라도 메모리가 가득 차서 더 이상 data를 받을 수 없는 상황이 발생한다.
이때 page replacement policy에 따라서 어떤 page를 swap space로 내려보낼지 정한다.
Page Fault가 어떤 방식으로 작동하는지 Pseudo code를 통해서 알아보자
// 가상 주소로부터 VPN을 구하는 과정
VPN = (VirtualAddress & VPN_MASK) >> SHIFT
// VPN으로부터 TLBTable을 뒤져서 TlbEntry를 구하는 과정
(Success, TlbEntry) = TLB_Lookup(VPN)
if(Success == True) // TLB hit
if(CanAccess(TlbEntry.ProtectBits) == True)
Offset = VirtualAddress & OFFSET_MASK
// offset과 PFN을 통해서 물리주소를 구한다.
Physaddr = (TlbEntry.PFN << SHIFT) | Offset
// 물리주소를 통해서 메모리에 접근한다.
Register = AccessMemory(Physaddr)
else RaiseException(PROTECTION_FAULT)
else // TLB Miss
// 해당 page의 page entry address를 찾는다
PTEAddr = PTBR + (VPN * sizeof(PTE))
// 할당 받지 못하거나 커널의 주소를 접근하는 등의 아예 잘못된 주소 참조
PTE = AccessMemory(PTEAddr)
if(PTE.Valid == False)
RaiseException(SEGMENTATION_FAULT)
else // PTE가 있는경우
if(CanAccess(PTE.ProtectBits) == False)
RaiseException(PROTECTION_FAULT)
else if((PTE.Present) == True)
// PTE가 존재할 경우 TLB에 넣어준다
TLB_Insert(VPN, PTE.PFN, PTE.ProtectBits)
RetryInstruction()
else if(PTE.Present == False)
RaiseException(PAGE_FAULT)
// PFN에서 빈 공간을 찾는다
PFN = FindFreePhysicalPage()
if(PFN == -1)
// 공간이 없다면 replacement policy를 수행한다
PFN = EvictPage()
DiskRead(PTE.DiskAddr, pfn)
PTE.Present = True
PTE.PFN = PFN
RetryInstruction()
Page replacement가 언제 작동할까?
- 메모리가 꽉 찰 때까지 기다렸다가 가득 차게 되면 replace를 수행한다
- 메모리에서 내보낼 page를 읽고 들여올 page를 읽는 작업이 한 번씩 수행된다.
- 때문에 기존에는 메모리에 들일 page를 읽는 작업만 수행하면 되었지만 이러한 방식은 메모리를 총 2번 읽기 때문에 느리고 비효율적이다.
- Swap Daemon, Page Daemon 방식 : 항상 일정 공간을 메모리에 남겨두는 방식
- LW pages : page replace를 시작해야 할 기준점.
- HW pages : page replace를 마무리할 기준점
- physical memory의 free page숫자가 LW pages보다 작아지게 되면 replacement를 수행한다.
- 이왕 replace를 시작했으니 replacement를 계속 수행한다. free page의 숫자가 HW pages와 같아질 때까지
어떤 데이터를 Swap 할까?
Dropped : 삭제한다는 뜻이다
'CS > OS' 카테고리의 다른 글
[운영체제] Locks #2 (0) | 2021.06.11 |
---|---|
[운영체제] Locks #1 (2) | 2021.06.11 |
[운영체제] Page Replacement Policy (페이지 교체 알고리즘) (0) | 2021.06.09 |
[XV-6 운영체제] Copy-on-Write #2 구현 (1) | 2021.06.04 |
[XV-6 운영체제] Copy-on-Write #1 (0) | 2021.06.04 |