본문 바로가기
운영체제

운영체제 17장 - 메모리 관리(4) : 페이징(1) -

by ChocoPeanut 2017. 5. 2.

운영체제 17

- 페이징(1) -

 

메모리의 낭비 공간인 hole을 최소한으로 만들기 위해 앞 장에서 많은 방법을 사용하였다. 최초 적합과 최적 적합을 통해 메모리의 공간에 적재하는 방식에 변화를 주었는데 이를 통해서도 메모리 공간의 1/3 정도가 낭비가 되었다. 이렇기 때문에 다른 방식인 Compaction이라는 방식을 사용하였으나 프로세스나 hole을 메모리 공간에서 이동시키기 위해서는 메모리 계산의 부담이 발생하기 때문에 힘들었다. 그래서 사용한 방식이 바로 페이징이다.


페이징프로세스를 일정 크기인 페이지로 잘라서 메모리에 적재하는 방식이다. 프로세스는 항상 연속해서 들어가야 한다는 생각을 통해 메모리 공간 활용에 있어서 앞장에서는 연속 메모리 할당에 초점을 맞추었다. 이런 생각부터 뒤집어서 프로세스를 일정한 단위로 잘라서 사용하자는 방식이 페이징이다. hole과 프로세스를 모두 특정 페이지 단위로 잘라서 메모리 공간을 관리한다. 하지만 프로세스를 자르게 되면 실행이 될까? 에 대한 궁금증이 생긴다. 그러면 프로세스를 자르게 되더라도 실행을 할 수 있게 하는 방식은 무엇이 있을까?


앞에서 설명한 방식을 한 번 떠올려보자. 메모리 공간을 할당할 때 코드에서 명명한 메모리 주소 위치와 다르게 임의로 프로세스를 메모리에 적재하였다. 이렇게 할 수 있었던 이유는 바로 MMU재배치 레지스터의 값을 바꾸어 CPU를 속일 수 있었기 때문이다. 그러면 이왕 속이게 되는 거 재배치 레지스터를 많이 두어 각각의 페이지 단위의 프로세스를 활용할 수 있게 속이는 것은 어떻게 생각하는가? 프로세스를 나눈 페이지마다 재배치 레지스터를 만들어 놓으면 CPU는 마치 프로세스가 연속된 메모리 공간에서 동작하고 있다고 생각하게 될 것이다. 왜냐하면 재배치 레지스터에서 메모리 적재 공간의 값을 더해주어 CPU를 속이기 때문이다.



프로세스를 자르는 단위는 페이지이다. 이에 동일한 크기로 메모리를 자른 것을 프레임이라고 한다. 같은 크기로 페이지와 프레임으로 잘라져 있기 때문에 페이지를 프레임에 할당하면 딱 맞아 떨어진다. 이 때 페이지를 관리하는 MMU페이지 테이블이 된다. 페이지 테이블 안에 있는 개수는 프로세스를 몇 등분하는가에 따라 결정된다.


CPU가 내는 주소는 논리 주소(Logical address)라고 한다. CPU에서 보낸 논리 주소는 MMU인 페이지 테이블을 통해 물리 주소(Physical address)로 바뀌어서 메모리에서 찾게 된다. 논리 주소는 2진수로 표현된 m개의 비트이다. 하위 n비트는 오프셋 또는 변위를 나타내고 상위의 m-n비트는 페이지 번호를 나타낸다. n비트는 페이지를 어떤 크기로 나누는 정도에 따라 다르게 된다. 예를 들어 16바이트로 페이지를 나눈다고 생각하면 n4비트가 된다. 2진수로 표현된 값이기 때문이다. 페이지 테이블에서 페이지 번호를 가져와서 해당하는 프레임 번호를 가져오게 된다. 페이지 번호는 페이지 테이블의 인덱스 값으로 인식한다. 페이지 번호에 해당하는 페이지 테이블의 값과 n비트의 값을 가진 물리 주소로 바뀌게 된다.



예를 들어 50번지라는 논리 주소를 물리 주소로 바꾸고 싶다고 한다고 가정해보자. 이때 페이지의 크기는 16바이트이다. 50번지를 2진수로 바꾸게 되면 110010이 된다. 이때 페이지의 크기가 16바이트이므로 하위 4비트는 n비트가 되고 앞의 두 비트가 페이지 번호를 나타내는 인덱스 값이 된다. 그러면 페이지 테이블에서 11에 해당하는 3의 값을 가진 페이지 번호로 가게 되어 페이지 테이블 값을 읽는다. 만약 이 때의 페이지 테이블 값이 8이라고 하면 8n비트를 합쳐서 물리 주소를 가지게 된다. 그 값은 10000010 이라는 메모리 공간의 주소로 가게 되는 것이다. 10진수로 바꾸게 되면 130번지가 된다. 다시 해석하게 되면 테이블 값의 8128번지를 의미하게 되고 여기서 하위 n비트의 변위 값에 의해 130번지에서 이 프로세스의 페이지가 동작하게 되는 것이다.