전체 프로그램이 메모리에 들어가는 것을 Real Memory 라고 한다.
그런데, 프로그램이 점점 커지며 메모리에 들어갈 수 있는 프로그램의 수가 줄어들게 된다.
그래서 나온게 Virtual Memory 이다.
Virtual Memory는 프로그램 전체가 아니라, 일부만 메모리에 올라가고 나머지는 Hard Disk 에 넣어놓게 된다.
메모리 공간 + 하드디스크 공간 전체 를 모두 메모리라고 생각하고 관리하는 것이 Virtual Memory System 이다.
⇒ 동시에 실행 가능한 프로세스가 증가 하게 된다.
처음 프로그램을 시작 할 때, OS → 프로그램의 전체가 아니라 두, 세 page만 메모리에 올라간다.
전체 프로그램 중 현재 메모리에 올라와 있는 부분
Paging System
: 메모리에 있는 페이지의 번호Segmentation System
: 메모리에 있는 세그먼트의 번호일부 페이지를 가지고 프러세스를 실행하다가 A라는 Function 이 필요한데, A Function 이 들어있는 페이지나 세그먼트의 번호가 메모리에 없으면 인터럽트( Page Fault )가 발생한다.
Interrupt에 해당하는 프로세스는 일단 block 된다. (I/O 작업을 해야한다, I/O With Request)
→ OS 는 다른 프로세스를 실행시킨다.
→ 아까 block 됐던 프로세스의 I/O 작업 끝(원하던 페이지가 메모리로 올라옴)
→ I/O 인터럽트 발생
→ block됐던 프로세스가 Ready Queue 로 이동
Virtual Memory 의 가장 큰 걱정거리: Thrasing
프로세스마다 사용가능한 공간에 제한이 존재한다.
Paging System 으로 Virtual Memory 를 구현했는데, 한 프로세스당 세 페이지만 메모리에 있을 수 있다라고 한다면, 세페이지를 놓고 실행을 하다가 메모리에 없는 페이지가 필요하다. 그 페이지를 가져오면서 현재 메모리에 있는 것들 중 하나를 버려야 한다.
메모리가 아니라 page가 필요하다. ⇒ 뭘 버릴지 신중하게 고민을 해야한다.
↳ 버린게 바로 다시 필요해질 수 있다.
실행 1, 2 줄 → Swap Out(프로그램 바꾸기, Hard Disk)
⇒ 프로그램 실행 X → 버리고 가져오는데 시간을 다 쓴다.
⇒ 이런 상황을 Thrasing
이라고 한다.
Thrasing
때문에 시스템의 속도가 굉장히 저하가 되면, 이 Virtual Memory System 은 사용할 수 없다라고 생각했지만,
이걸 Reference Locality 덕분에 페이지 변경 횟수가 줄어들게 된다.
↳ Code 와 Data 는 연속된 공간에 위치하여 Threasing
이 거의 발생하지 않게 된다.
Page 가 없으면 프로세스가 하드디스크로 쫓겨나는 건가?
프로세스의 Swap Out 이 아니라, 프로세스가 가지고 있는 한 페이지가 Swap out 되는 것이고, 나머지 부분은 메모리에 있다.
페이지를 가져와야 하는 프로세스는 Running 상태에 있다가 Block 상태에 있다가 다시 Ready 상태가 된다.
⇒ Process가 Suspend 되는 것은 아니다.
Paging 시스템을 이용해서 Virtual Memory 구현이 가능하다.
← Paging + Segmentation 둘 다 사용해서 이용이 가능하다.