본문 바로가기
컴퓨터공학기초 개념/운영체제

32. 가상메모리 - 다중 단계 페이징 시스템

by devraphy 2021. 7. 8.

1. 다중단계 페이징 시스템이란?

- 페이지를 4kb 단위로 설정하면, 이를 보관하는 Page table의 범위도 그만큼 넓어지게 된다.

- 리눅스를 예로 들어보자면, 4GB의 메모리 영역을 갖는 프로세스에서 0~3GB의 영역이 응용 프로그램이 갖는 영역이다. 

- 그러나 프로세스 당 실제 실행 코드의 크기는 커봤자 10kb 정도일 것이다. 그러면 나머지 약 3GB의 영역은 사용하지 않는 비효율적인 영역이 되는데, 이만큼의 메모리 영역이 page table에도 올라가게 된다. 

    ▶ 4kb(= 32bit)의 페이지에서 하위 12bit는 오프셋(=변위)을, 상위 20bit는 페이지 번호를 담당한다. 

    ▶ 상위 20bit는 2의 20승으로 총 1048576개의 페이지 정보를 필요로 한다.  

- 이러한 메모리의 누수를 방지하기 위해 나온 방법이 다중단계 페이징 시스템이다. 

 

a) 다중단계 페이징 시스템의 특징

- 페이지 정보를 단계로 나누어 실제로 데이터를 담고있는 페이지를 구분한다. 

- 필요없는 페이지는 생성하지 않는다. 이를 통해 공간을 절약한다. 

- 즉, 실제로 데이터가 존재하지 않는 영역에 대해서는 page table을 생성하지 않는 것이다.  

- 위의 사진처럼, 페이지 정보를 단계별로 나눈다. 

     ▶ 31bit ~ 21bit: page directory, 실제 데이터를 담고 있는 페이지를 등록하여 구분함

      20bit ~ 11bit: page table

     ▶ 10bit ~ 0bit: 변위값      


2. MMU와 TLB

- 다중 단계 페이징 시스템도 페이징 시스템도, 메모리에 접근하여 데이터를 가져오는 과정은 다음과 같다. 

클릭하면 확대됩니다.

 

a) 문제점

- 위의 사진처럼, 기존의 가상 메모리를 통해 물리 데이터를 받아오는 방식은 다음과 같다.

- MMU에서 CR3라는 레지스터를 통해 물리주소를 반환 받고, 

- 반환받은 물리주소를 이용해 다시한번 메모리에 있는 실제 데이터를 찾는다. 

- 기존의 방식에서 한가지 문제점이 있다면, 데이터를 가져오는 과정의 처리속도에 있다. 

- 위의 사진에서 알 수 있듯이, 메인 메모리에 접근하여 데이터를 가져오는데 걸리는 시간이 많이 걸린다.

 

b) 해결책

- 이와 같은 문제점을 해결하기 위해서, TLB라는 별도의 캐쉬 하드웨어를 사용한다. 

     ▶ TLB(Translation Lookaside Buffer): 페이지 정보 캐쉬

클릭하면 확대됩니다.

- 한번 변환된 가상주소에 대한 물리주소 값을 TLB에 저장한다. 

- 즉, 이전에 검색된 가상주소에 대한 물리주소 값이 재검색 되면 TLB에서 바로 반환해 주는 것이다. 


3. 페이징 시스템과 공유메모리

- 여기서 등장하는 공유메모리의 개념은 이전 포스팅에서 다룬 IPC에서 등장한 공유메모리와 동일한 개념이다.

- 다음 사진을 참고하여 알아보자. 

- 프로세스 A와 B가 다른 가상주소를 가지고 있지만 동일한 데이터를 가리킨다고 가정해보자. 

- 그렇다면 물리 메모리에는 하나의 데이터에 대한 하나의 물리주소 값만을 적재하는 것이 더 효율적이지 않겠는가? 

- 이것이 공유 메모리를 사용한 페이징 시스템의 구조다. 

- 이를 이용해 다음과 같은 기술이 가능해진다.  

 

 

a) 프로세스의 커널코드(운영체제 코드)

- 이전에 배운 바에 따르면, 각 프로세스마다 3 ~ 4GB의 주소 영역에는 운영체제 코드를 갖고 있다. 

- 모든 프로세스가 운영체제 코드를 갖고 있다면, 동일한 코드도 존재할 수 있어, 메모리 공간의 효율성이 떨어지기 마련이다.

- 그러나 만약 3~4GB의 주소 영역에 존재하는 운영체제 코드가 공유 메모리에 존재한다면 어떨까? 훨씬 효율적이지 않은가?

- 실제로 프로세스의 커널영역 코드는 공유메모리에 의해 관리되기 때문에 프로세스가 새로 생성되어도 1GB의 메모리 영역이 추가적으로 필요하지 않은 것이다.

 

 

b) Fork

- 리눅스 OS의 경우, 프로세스를 새로 생성할 때 완전히 새롭게 생성하는 것이 아니라 fork() 메소드를 사용한다. 

- fork() 메소드는 일종의 복붙인데, 기존의 프로세스를 복사하여 새로운 프로세스를 만들어 내는 것이다. 

- 하지만 프로세스는 4GB의 크기를 갖는다. 4GB의 데이터를 USB에 복사하는 것도 시간이 꽤 걸리지 않는가? 

- 그러므로 내부적으로는 4GB의 프로세스를 전부 복사하는 것이 아닌, 필요한 일부분만 복사해서 새로운 프로세스를 형성하게 된다. 

- 이것 또한 공유메모리 덕분에 가능한 기술이다. 

 

 

c) 물리 주소의 데이터를 변경한다면

- 프로세스 A와 B가 동일한 물리 메모리의 데이터를 사용한다고 가정해보자. 

- 이전에 말한 바와 같이, 가상 주소는 다를 수 있어도 동일한 물리주소를 가리키기에 물리 메모리에는 하나의 물리주소만이 존재한다. 

- 하지만, 프로세스 B에서 해당 물리주소에 있는 데이터 값을 변경해야 한다면 어떻게 할까? 

- 이 경우에만 해당 물리주소의 데이터를 복사하여 새로운 물리주소를 생성하게 된다. 

 

 

d) 결론

- 공유 메모리를 사용하므로써, 동일한 물리주소에 대한 별도 공간이 필요 없어진다. 

- 공유 메모리를 사용하므로써, 새로운 프로세스를 생성할 때 별도의 공간과 처리 시간을 필요로 하지 않는다.

- 즉, 페이징 시스템과 공유메모리를 함께 사용하므로써, 메모리 공간 절약이 가능해진다. 

댓글