Shine's dev log

Demand paging 의 개념 본문

운영체제

Demand paging 의 개념

dong1 2020. 7. 16. 20:22

1. Swapping

 

swapping

 

swapping이란, 원래 컴퓨터에 돌고 있는 프로세스 중 쓰지 않는 프로세스는 메인 메모리에서 Backing store(SSD, HDD)에 넣는것/빼오는 것이다. 하지만 위의 경우처럼 프로세스 전체를 swap하는 방식은 지금은 쓰지 않는다.

 

요즘 swapping이라고 하면 프로세스 전체를 바꾸는 것이 아니라 page를 swapping하는 경우를 말한다. 그리고 이를 Demand Paging이라고 한다.

 

 

 

2. Demand Paging

 

앞서 말했듯이 Demand Paging은 page 단위로 swaping을 하는 것이다.

 

demand paging은 다음 과정을 통해 실행된다.

 

1) OS가 swap out할 victim page를 고른다.

2) disk에 swap out 한다.

3) 내용 뺀 page 대한 PTE를 업데이트한다.

4) 빈 page에 새로운 프로세스의 page를 할당한다.

 

즉, OS는 메인 메모리를 cache처럼 사용하는 방식이다.

 

Demand paging을 이용하면, OS가 알아서 프로세스들의 메모리를 잘 관리해주므로, 최근 대부분의 컴퓨터들을 demand paging을 이용한다.

 

page table entry (PTE)

 

만약 특정 page가 evicted 되면, OS는 PTE를 바꾼다. 먼저 Valid bit를 꺼주고, PFN부분에 스왑파일의 어디에 넣을지를 기록한다. 이후에 MMU가 page table을 읽다가 invalid 한 PTE를 만나면, OS에게 문제를 해결해달라고 page fault라는 exception을 날린다.

 

OS는 page fault handler를 통해 swap해줘야 한다고 판단하면, 메모리에 공간 만들고, swap entry를 만든 메모리에  넣어주는 등의 과정을 수행한다.

 

이와같은 demand paging이 가능한 이유는 principle of locality 때문이다.

temporal locality는 최근에 사용된 놈이 다시 사용될 가능성이 높다는 것이고, spatial locality는 최근에 사용된 놈의 가까운 곳에 있는 놈이 다시 사용될 가능성이 높다는 것이다.

 

이런 principle of locality 때문에 demand paging이 높은 효율성을 자랑하고, 잘 쓰일 수 있다.

 

 

 

3. Virtual Memory system

 

앞서 계속해서 설명했던 Logical Memory를 Physical Memory로 mapping해서 메모리를 관리하는 것을 Virtual Memory System이라고 한다.

 

VM의 장점 

1) 유저용 메모리(Logical memory)와 컴퓨터용 메모리(Physical memory) 분리가능

2) address space를 많은 프로세스들과 공유 가능해진다. (demand paging)

3) 더 많은 프로세스를 메모리를 효율적으로 관리하며 돌릴 수 있다.

4) 원래는 프로세스가 사용하는 모든 메모리가 다 main memory에 올라와야 하는데, VM쓰면 필요한 부분만 불러오기가 가능해진다.

 

 

 

4. Shared Memory in VM

 

VM 시스템에서 메모리를 share 하는것은 굉장히 간단하다.

 

memory share in VM

 

위의 그림처럼 두 프로세스가 하나의 메모리를 공유할 때, 각각의 LA가 하나의 PA를 가리키면 간단하게 공유가 된다.

 

참고로 운영체제가 담겨있는 메모리 영역은 모든 프로세스가 공유하고 있다. 각 프로세스가 운영체제 프로그램이 저장된 page frame을 동시에 참조하고 있다.

 

 

 

5. Copy-on-Write

 

Copy-on-Write는 VM 시스템에서 process fork 할 경우 쓰는 방법이다.

 

fork 할 때, 프로세스의 모든 메모리를 복사하면 오버헤드가 너무 크고, shared 하면 독립적으로 메모리가 동작하지 못한다. 그래서 고안해낸 방법이 CoW이다.

 

CoW는 우선 fork를 하면, shared 하여 복사하고 해당 Logical memory의 write permission을 끈다. 이후에 만약 그 Logical memory에 두 프로세스 중 누군가가 write 하려하면 그제서야 새로운 Physical memory를 할당해주는 방법이다.

 

1. 처음 fork 했을 때

 

2. 다 복사하지 않고 share 한다.

 

3. shared 프로세스의 virtual page하나가 write 하려 한다.

 

4. write 하려 하면 그제서야 새로운 page frame 할당해주고, Write 비트 킨다.

 

위의 3. 과정에서 Write 권한이 없는 virtual page에 write 하려고 하면, page fault가 발생하고 핸들러는 이 page fault가 권한이 없는데 접근해서 생긴 fault인지, CoW 과정에서생긴 fault인지 판단하고 상황에 따라 처리를 해준다.

 

위와 같은 CoW 는 많이 사용된다. 대표적으로 malloc으로 메모리 동적 할당을 했을 때, 컴퓨터는 실제로 모든 메모리를 준비해놓는것이 아니라, CoW를 통해 모두 shared 해놓은 뒤, 필요시마다 새로 메모리를 할당해주는 식으로 동작한다.

 

 

오늘 배운 내용을 정리해보면,

 

1. Demand paging은 기존의 swapping에서 페이지 단위로 swap하는 방식이다.

 

2. Virtual Memory System은 장점이 많아 널리 쓰인다.

 

3. Copy-on-Write는 프로세스 fork시 보다 효율적으로 메모리를 관리해준다.

 

본 내용은 공부하며 정리한 것으로, 오류가있을 수 있습니다.