-
8. Vitrual MemoryCS/OS 2022. 6. 23. 01:42
Virtual Memory
가상 메모리는 프로세스의 virtual memory(logical memory)와 physical memory를 분리하기 위해 생겨난 것
모든 프로세스는 자신만의 가상 주소 공간을 가지고 있다.
32비트/64비트 프로세스는 각 비트수에 맞게 최대 4GB/16EB의 주소 공간을 가진다.
모든 프로세스들은 자신만의 주소 공간을 가지기 때문에, 특정 프로세스 내에서 쓰레드가 수행될 때 해당 쓰레드는 프로세스가 소유하고 있는 메모리에 대해서만 접근이 가능하다.OS Memory는 숨겨져 있다. 쓰레드가 OS의 Data에 Access하는 것이 불가능하다.따라서, A 프로세스가 0x12345678 주소에 무엇인가를 저장하였지만, B 프로세스 역시 0x12345678 주소에 무엇인가를 저장할 수 있으며, 이 주소들은 완전히 독립되어 있는 것이다.아래 그림에서 Process A의 Page7과 Process B의 Page7은 실제 PFN(Physical Memory)에서 다른 Address를 가르킨다.1. Why need Virtual Memory?
Physical Memory는 일반적으로 4GB ~ 16GB로 요즘 흔히 말하는 배틀그라운드 게임을 실행하려고 하려면 용량이 40GB이런데 어떻게 실행이 가능할까?
Each Process 들은 Process들의 Vitural Memory 를 가짐으로써, Process 별 메모리를 따로 가지고 있는 것처럼 인식한다.
아래 그림과 같이 Process A가 있고 Process B가 있다고 한다면, Page 0의 시작점은 Process A , B 둘 다 0부터 시작한다.
이 중 필요한 부분만 Memory에 올려 처리하도록 하게한다.
-> 즉, 실제 필요한 부분만 Physical Memory에 올리는 식으로 동작한다.
CPU는 Physial Memory에 접근하여 해당 Memory에 연산을 처리한다.
위 같은 상황을 만들기 위해서는 Vitrual Memory 와 Physical Memory를 연결시켜주어야 하는데, 이 때 필요한 것이 Page Table이다.
2. Page
Virtual Memory를 사용하는 최소 단위 크기 (일반적으로 4KB)
가상 메모리를 조금 더 효율적으로 관리 하기 위해 나온 개념으로 Memory를 쪼개서 관리한다는 개념으로 생각하면 된다.
Page File에서 Physical Memory로 Data Load 시 아무 위치에 아무 크기로 Load한다면 Fragmentation이 발생
Memory 공간이 있음에도 불구하고 Load하지 못하는 상황이 발생 가능하다. (External Fragmentation)
물론 Paging을 함으로써, Internal Fragmentation이 발생 할 수 있다.
3. Page Table
Virtual Memory를 Physical Memory로 Mapping 시켜 동작하도록 만들어주었다.
Process A가 0~3000번의 Address를 가지고 있다고 가정해보자. 처음 시작하는 위치는 Virtual Memory에 0이다. 하지만 Process는 Scheduling(Context Swithching)에 의해 조금씩 실행된다. 그 다음 실행되는 위치가 346이라고 한다면, 우리는 CPU에게 346번째에서 시작할거에요 라고 알려주어야한다. 하지만 실제 위치를 어떻게 알 수 있을까?
이는 Page Table을 이용하여 Phyiscal Memory의 시작 위치를 알려주면 된다.
4. Binding(MMU)
생각해보면, Process가 시작하는 Address 및 종료되는 Address를 알려주면 된다. 그렇지 않으면, 다른 Process로 넘어갈 수 있기 때문이다. 이때 나오는 개념이 MMU이다. MMU는 Baisc Register + Limit Register를 가지고 있어 실제 Physical Memory의 시작점과 끝나는 지점을 알려주면서 해당 범위를 벗어나게 되면 이상함을 눈치채고 Trap을 발생시켜 OS에게 확인해보라고 넘겨준다. 아래 그림을 보면 이해가 쉬울 것이다.
5. SWAPPING(Page In/Out)
Physical Memory에 공간이 이미 가득 차서 추가적으로 오는 Process의 요청을 어떻게 처리해야 하는가이다.
물론 Physical Memory에 있는 Process 중 하나를 Memory에서 내리고 요청받은 Process를 올리면 된다.
하지만 그럼 기존에 동작하고 있던 Process의 정보는 어떻게 처리할까?
Disk의 일부분을 이용하여 Page 관련된 정보를 저장한다이다. Physical Memory에 있는 Page를 Disk로 일시적으로 내리는 것이다. 이 때 Physical Memory와 Disk의 차이를 구별하기 위해 Page Table에는 Valid bit 로 구별한다.
Swap Out
Physical Memory에 있는 Page 중 하나를 Disk로 내린다.
Swap In
Physical Memory로 Data를 Load
6. Page Fault
여기에 추가적으로 문제가 발생한다.
생각해보면, Page Table을 통해 Physical Memory에 접근하였지만, Physical Memory에 없는 상태이다.
이 때에는 다음과 같이 동작한다.
- Disk(페이징 하드웨어)는 page table를 보고 valid인 것을 확인한 후 OS에게 trap으로 알린다.
- OS는 정말로 메모리에 없는 것인지 아니면 잘못된 접근인지 확인한 후 잘못된 접근이었으면 종료시킨다.
- Empty frame (free page)을 얻는다.
- Page를 frame으로 swap한다.
- 프로세스의 page table과 TLB를 page-in/page-out 된 것을 토대로 재설정한다.
- Page fault를 야기했던 인스트럭션부터 다시 수행한다.
3번에서 empty frame을 얻어와야 하는 상황에서 Physical Memory가 이미 모두 사용중이라면, 사용중인 frame 중 하나를 선택해서 swap(page-out) 시키고, 그 frame을 사용해야 한다.다음 장에서는 결국 Virtual Memory의 장점과 단점 및 어떤 Page를 교체해야 하는가?에 대해서 알아볼 것이다.
'CS > OS' 카테고리의 다른 글
10 . File System (0) 2022.08.08 9. Virtual Memory advantages and paging algorithm (0) 2022.06.23 xv6 Test code (0) 2022.06.02 xv6 (linux Init) (0) 2022.06.02 7.Posix thread(Pthread) (0) 2022.05.25