운영체제(OS)

Operating Systems - 10. Virtual Memory

아뵹젼 2021. 10. 15.

Background

실행되는 코드는 메모리에 있어야 하는데, 이를 위해선

1. 프로그램의 전체 논리 주소 공간을 물리 주소로 맵핑 후 실행

2. 동적 loading 

3. 가상 메모리 사용

의 방법이 존재한다. 

 

만약 한번에 모든 논리 주소를 물리 주소로 매핑 한다면, 바로 매핑이 가능하고 page fault 가 발생하지 않는다는 장점이 있지만, 메모리 효율이 매우 떨어진다.

드물게 사용되는는 코드들 (에러코드, 특별한 루틴들, 큰 자료구조)이 메모리에 들어 있기 때문이다.

 

 

따라서 모든 code 가 동시에 메모리에 올라올 필요는 없으며, 이를 위해 구현한 방법이 가상 메모리 사용이다.

가상 메모리는 실행에 필요한 부분만 물리 메모리에 위치하게 한다. 

가상메모리의 특징

- 가상메모리는 프로그램의 논리 메모리와 물리적 메모리를 분리한다. 

- 실행에 필요한 부분만 메모리에 적재하면 된다.

- 논리 주소 공간은 물리 주소 공간에 비해 훨씬 클 수 있기 때문에, 가상 메모리는 실제 메모리보다 크기가 큰 공간을 제공한다.

- 여러 프로세스에 의해 주소 공간이 공유될 수 있다.

 

가상 메모리를 구현하는 방법에는 Demand paging, Demand segmentation 이 존재한다.

 

 

 

Virtual-address Space

보통 논리 주소 공간의 스택 영역은 논리 주소의 Max 주소부터 시작해서 아래로 확장될 수 있고, heap 영역은 반대로 위로 확장될 수 있다.

따라서 stack heap 사이의 공간은 논리적 주소 공간으로는 존재하지만, heap과 stack 이 그만큼 확장되었을 때만 실제로 물리적 공간을 필요로 한다.

 따라서 이러한 공백을 포함하는 가상 주소 공간을 Sparse 주소 공간이라고 한다.

Sparse address space 의 공백은 스택이나 힙이 확장될 때 사용되거나, 프로그램 실행 중 동적으로 library를 link 할 필요가 있을 때 사용된다.

이렇듯이 가상 메모리를 통해 라이브러리나 메모리를 공유할 수 있고, fork() 에 의해 부모와 자식 프로세스가 페이지 공유를 할 수 있다.

 

 

 

Shared Library Using Virtual Memory

 

Demand Paging

프로그램의 전체가 로드될 때 메모리에 적재될 필요는 없다.

따라서 Demand Paging 은 실제로 필요할 때만 page 들이 적재되는 것이다.

이는 swapping + paging 의 개념으로 볼 수 있다.

여기서 Swaper 의 단위는 프로세스였지만, Pager 의 단위는 page로, page 단위로 swap을 해주는 프로그램이다.

demand paging 은 시스템 내부에서 지원을 해주는 것이다.

MMU가 demand paging 을 구현할 수 있는 기능을 가져야 할 뿐이며, 사용자가 코드를 바꾸거나 액션을 취하는 것이 아니다.

 

 

Valid-Invalid Bit in Page Table
Demand Paging 을 사용하면 어떤 page 는 메모리에 있지만, 어떤 page 들은 disk 에 존재할 것이다.

그러므로 지금 현재 메모리에 있는 page 와 아닌 것들을 구분해주는 것이 필요하다.

 

따라서 각 page table 에는 valid-invalid bit가 포함되어 있다. valid(v) 는 메모리에 있다는 뜻이고, invalid(i) 은 메모리에 없다는 뜻이다.

 

page table 에서 접근하였을 때 invalid bit (i) 라면, page fault 상태이며 trap 이 발생한다.

 

 

위와 같은 demand paging 상황이 발생했다고 가정하자. 논리주소 0번의 data 를 가져오려고 한다.

page table 에 0번이 valid 이므로, 매핑되는 4번의 physical 주소에 접근할 수 있다.

 

 

만약, 논리주소 1번의 data 를 가져오려고 한다면?

1. page table 의 1번 index 의 값이 invalid 임을 알 수 있다.

2. trap (page fault) 를 발생시켜 OS 에게 알린다.

3. OS 는 free frame 을 확보한다.

4. disk 에서 B에 해당하는 page 를 찾고 물리주소의 frame 에 적재한다.

5. page table 의 1번 index 에 넣은 공간의 frame 번호를 저장하고, invalid -> valid 로 변경한다.

6. 다시 명령어가 실행할 수 있게끔 재개한다.

 

 

 

댓글