프로세스들이 메모리를 쓰고 있었을 때, 메모리를 추가적으로 쓰고싶다면?

Swapping을 쓴다. 

 

스와핑 (Swapping)

: 페이지 하나씩 backing store로 내보내는 page out과는 달리, 프로세스 전체를 backing store로 내보낸다.
   - 즉, Page out으로도 메모리 부족을 해결하지 못할 경우 프로세스를 선택하여 전체를 backing store로 내보낸다. "swap out"

 

Backing store에 swap out (빼놓고)한다.

 


 

프로레스 2기가 짜리 하나를 swap out 시키면 시간이 오래걸린다.


 Demand Paging 

Demand Paging : Page 단위로 swapping 하는 것

 

내가 필요한 내용만 부르고 나머지는 디스크로 빼논다.

필요할 때 쓴다.

메모리 덜 차지하고 빠르게 수행 가능하다.

 


프로세스가 사용하는, 최근에 자주 참조되는 것만 메인 메모리에 쓸 수 있다.

잘 사용되지 않은 것은 Swap file로 빠져있을 수도 있다.


 

프로세스를 다 받아서 Physical Frame은 다 사용한 상태이다.

이때 P2가 더 페이지가 필요하다면?

 


 

메모리에 있던 내용을 Swap file 이라는 저장장치에 빼버린다.

 


너 메모리에 없고 Swap file에 있어! 

너 swap 해서 디스크에서 빼버렸어.

Page Table Entry 값을 바꾼다. Swap Entry로

 


 

그리고 그 자리를 P2에게 준다.

 


프로세스는 메모리에 있는 정보만 읽는다. 디스크를 바로 읽을 수 없다.

 

만약 P0가 원하는 내용을 읽으려는데 그게 메모리에 있지 않고 Disk 안의 Swap file에 있다?


다시 victim을 정해서 Swap file에다가 가져다 놓고

Swap file에 있던 P0가 원하는 정보를 다시 메모리로 끌어온다.


운영체제의 스와퍼(Swapper)는 물리 메모리에 동작하고 있는 모든 프로세스를 로드하진 않는다. 게다가 운영체제의 페이저(Pager)는 프로세스의 모든 페이지를 물리메모리에 로드하지 않는다.(물리 메모리를 효율적으로 사용하기 위해서이다.)  그러므로 프로그램의 페이지가 물리 메모리에 부재할 수 있는데, 이것을 페이지 폴트(Page Fault)라고 한다.

 페이지 폴트가 발생하면, 해당 페이지를 가상 메모리에서 찾아야한다. 이 때 운영체제가 페이지 폴트를 해결하는 과정을 요구 페이징(Demand Paging)이라고 한다. 

 

MMU : "야 나 translate 못해. Swap out 돼 있어. Page fault 날릴게."

 

그러면 운영체제가 어디있는지 찾는다.

 

운영체제 : "원래 Physical Frame에 매핑이 되어 있었는데 메모리가 부족해서 내가 얘를 빼버리고, invalid로 만들고 swap entry를 써놨어!"

 

1. 메모리 과다 할당 상태 (Over-allocating of memory)  

 1) 메모리 과다 할당 상태에 대한 설명 
    (1) 멀티 프로그래밍 시스템에서, 메모리 내에 위치한 사용자 프로세스의 수가 증가함에 따라 메모리 과다 할당 상태가 발생한다. 
    (2) 모든 사용자 프로세스가 사용하는 페이지 수보다 물리 메모리의 프레임 수가 적은 상황   
    - 즉, free frame이 없는 상황이다. 
 2) 메모리 과다 할당 상태에 대한 해결 방법  
    - 페이지 폴트 처리 (Page fault handling)에 페이지 교체 (Page replacement)를 추가한다. 

2. 페이지 교체 (Page Replacement ) 

 1) 페이지 교체의 정의   
   - 물리 메모리에 위치한 페이지를 디스크에 저장하고, 요구된 페이지가 해당 프레임을 할당 받도록 하는 방법을 말한다.
 2) Page Fault with Page Replacement 
    (1) 디스크에서 요구된 페이지의 위치를 찾는다. 
    (2) 물리 메모리에서 Free frame을 찾는다.   
        - Free frame이 있다면 사용한다.  
        - 없다면, 페이지 교체 알고리즘을 사용하여 교체할 프레임(victim frame)을 선택한다.    
        - 교체할 프레임을 디스크에 저장하고, 페이지 테이블, 프레임 테이블을 변경한다.  
    (3) 요구된 페이지를 2에서 선택된 Free frame으로 읽어 들이고 해당 페이지 테이블, 프레임 테이블을 적절하게 변경한다. 
    (4) 유저 프로세스를 재시작 한다.

 


빠져야 되는 애들 : victim frame, victim page



Pure demand paging : 내가 메모리가 필요할때, 그때그때 맞춰서 로딩하자.

Page fault와 Page fault handler가 수행한다.


Demand Paging은 principle of locality를 기반으로 작동된다.

 

The principle of locality : 사용된 애들이 더 자주 사용 될 것 같다.

Temporal locality : 시간상 이때 다시 일어날 것 같다. 좀 이따가 또 발생할거 같다.

Spatial locality : 그 주변에서 다시 일어날 것 같다.

 

swap으로 나가 있다가 다시 참조될 것 같으면 Temporal locality에 의해서 다시 참조가 될 수 있다.


 

운영체제가 메모리를 관리하는 핵심 아이디어는 일정크기의 Page를 잘라서 Paging을 하는 것이고

Page Table을 통해서 Translation을 해가면서

MMU가 Translate 해서 동작을 시키는 거고

거기에 약간 양념을 가미해서 Page Table을 운영체제가 일부 고쳐서

Swap, Demand Paging을 통해 필요한 것만 넣게한다.

PTE가 invalid하면 Page fault를 날리고 하드웨어가 그것을 알아서 처리해준다.

 

이 모든 것을 Virtual Memory를 사용한다고 말한다.


 Virtual Memory 




 Shared Memory 

두개 이상의 프로세스가 같은 내용을 쓰게 하려면? 같은 페이지를 사용하게 하면 된다!


 

서로 다른 프로세스가 Address Space가 다른데 서로 같은 내용을 공유하려면?

두개가 같은 Page Frame을 보게 만든다.


 

프로세스는 원래 각각 자신의 Address space를 가지고 있다.

User address space와 Kernel address space가 있다.

 

Kernel Address Space는 모든 프로세스들이 같은 하나의 (운영체제의) 데이터를 share 한다.

ex) system call이나 scheduler 

 


 Copy-on-Write 

 

fork가 완료된 시점에서 child가 자기의 값을 바꿔도 부모한테 전파되면 안된다.

Shared Memory로 하긴 애매하고 그냥 하자니 성능이 너무 안 나올거 같다.

이때 Copy-on-Write 를 쓴다.

 

Page allocation을 최대한 미뤄놓고 같은 내용을 최대한 공통적으로 사용하게 만들어보자.

 


fork를 하면 child와 parent와 똑같이 공유해서 시작을 한다.

만약 child가 바뀌어야 한다면 그 부분만 새로 Page를 allocation 해서 따로 쓰자.

모든 Page를 Copy 할게 아니라 부모에 있는 Page

 



이렇게 쓰지 말고

 

이렇게 쓰자.

두개가 같은 내용을 보고 있다.


 

근데?

어? 내가 부모랑 자식을 같이 mapping 해논 상태에서, 한 쪽을 업데이트 해버리면 부모도 바뀌는데?

그래서 Write 기능을 꺼버린다.

 


 

Write를 하려고 하면 원래 있던 값을 다른데로 복사해서 거기에 갖다 넣자!

 

정리 :

Page Table에는 Write 못하게 막아놨어. 어떡해? 너가 처리해줘

Page fault가 발생한다.

그러면 운영체제가 Page fault handler를 사용해서 

야 이거 Copy-on-Write 때문에 꺼져 있는거야!

새로운 페이지 하나 할당 받아서 원래 내용 복사해놓고 Page Table도 Write 할 수 있게 만들어 준다.


 

Page 마다 map count를 관리를 해야 한다.

왜?

제일 마지막에 그 Page를 가리키고 있는 애가 하나밖에 없을 때, 그 Page를 갖다 쓰면 되는 것을 환기하기 위해서.

Page fault handler에서 fault가 났을 때 그것을 고려해서 Page를 복사할지 말지 새로운 것을 가지고 갈지 말지를 결정하기 위해.


 

Zero page에다가 Read permission은 키고 Write permission은 끄고 할당해 놓는다.


 

 

 

 

 

 

 

 

 

 

'🚦 Server > Operating System' 카테고리의 다른 글

23. Page Replacement  (0) 2020.06.24
22. VM Features  (0) 2020.06.23
20. Page Tables  (0) 2020.06.20
19. Paging and Page Tables  (0) 2020.06.14
18. Address Spaces  (0) 2020.06.14
복사했습니다!