본문 바로가기
운영체제

운영체제 18장 - 메모리 관리(5) : 페이징(2) -

by ChocoPeanut 2017. 5. 3.

운영체제 18

- 페이징(2) -

 

다중 프로그래밍 환경으로 바뀌면서 다양한 프로그램들이 메인 메모리 공간에 올라가서 프로세스로 되어 동작하기 시작했다. 프로그램들은 필요할 때 메인 메모리로 적재되고 사용이 다 되면 다시 하드디스크로 돌아가게 된다. 이런 작동이 반복되면서 메모리 공간에는 hole이라고 하는 빈 공간이 만들어지게 된다. 이런 빈 공간이 흩어져 있게 되어 총 합으로는 충분한 공간의 빈 메모리 공간이 있을지라도 사용할 수 없는 공간이 되어버린다. 왜냐하면 프로세스는 연속된 공간에서 존재해야 동작했기 때문이다. 이러한 문제를 외부 단편화라고 했다. 그리고 외부 단편화를 해결하고자 노력을 많이 하였다. 연속 메모리 할당을 하는 방식에 차이를 두기도 하고 compaction 기법을 사용하기도 하였다. 하지만 여전히 메모리 공간이 낭비가 되고 그렇지 않으면 고비용이 들게 되었다. 그래서 나온 해결 방법이 바로 페이징이다.


페이징은 프로세스가 연속된 메모리 공간에 할당되어야 한다는 이론을 부셔버린 개념이다. 프로세스를 무조건 메모리 공간에 연속해서 적재하는 것이 아니라 프로세스를 일정한 단위인 페이지로 쪼개어 적재를 하는 것이다. 물론 메모리의 영역도 프레임으로 쪼개어 준비를 시켜놓는다. 프레임과 페이지는 같은 크기를 가지게 한다. 그러면 어떠한 프레임 공간에 페이지를 넣었는지 기억을 하게 되면 메모리 공간을 다 활용할 수 있게 되는 것이다.



CPU가 동작을 할 때 메인 메모리에 주소를 요구한다. 모든 계산의 기반은 주소를 통해서 진행되기 때문이다. 그래서 프로세스가 코딩이 되는 과정에서 각각의 프로세스는 주소 기반으로 작성이 되어 지게 된다. 몇 번지의 메모리 공간 주소에 적재될 것인지 그 이후의 명령어들은 몇 번지에 들어가는지가 이미 지정이 되어 있다. CPU는 이를 이용하여 메모리 공간에 들어가서 찾게 된다. 하지만 메모리 공간은 항상 특정 프로세스를 위해 공간을 비워놓지 않는다. 만약 비워 놓게 된다면 메모리 공간의 크기보다 프로그램들의 크기들의 합이 크기 때문에 프로그램을 사용할 수 없을 것이다. 따라서 임의로 메모리 공간에 적재를 하고 MMU라는 도구를 사용하여 메모리 공간의 위치를 조절한다.


MMUCPU와 메인 메모리 사이에서 존재하는데 재배치 레지스터를 가지고 있다. 이는 논리 주소물리 주소의 변환을 주관한다. 논리 주소는 CPU가 요구하는 주소 값이고 물리 주소는 메인 메모리가 인식하여 찾는 주소 값이다. 메인 메모리는 임의의 공간에 프로그램의 적재하고 이 메모리 주소 값에 맞게 재배치 레지스터 값을 설정하여 CPU가 이 프로세스에 대한 논리 주소를 요구할 때 물리 주소로 바꾸어 맞는 메모리 공간 주소를 지칭하게 해준다.


페이징은 재배치 레지스터를 페이지의 수만큼 만드는 것이다. 프로세스를 페이지 단위로 자른 후 이에 해당하는 페이지마다 재배치 레지스터를 통해 적절한 위치에 있도록 만든다. 그러면 CPU가 논리 주소를 요구할 때 논리 주소를 분석해서 적절한 물리 주소로 갈 수 있게 해준다. 프로세스가 메인 메모리에서 페이지 단위로 나뉘어 있지만 CPU는 항상 같은 논리 주소를 요구하므로 프로세스가 연속된 것처럼 보이게 된다. 이 과정에서 MMU는 페이지 테이블을 가지게 된다.



예시를 통해 주소 변환을 하는 과정을 살펴보자. 자세한 계산 방법은 앞 장을 참고하면 좋을 것이다.(운영체제 17) 페이지 사이즈가 4바이트이고 페이지 테이블에 페이지 번호 당 5, 6, 1, 2를 가진다고 한다. 그러면 페이지 번호가 0번이면 51번이면 6으로 가는 것으로 인식하면 된다. CPU가 논리 주소로 13번지를 요구한다면 메인 메모리의 어디의 물리 주소 위치로 가야하는가? 13을 이진수로 표현하면 1101이 된다. 이 주소 값에서 페이지 사이즈가 4바이트이므로 변위는 하위 2비트가 된다. 그러므로 나머지 상위 2비트는 페이지 번호가 된다. 페이지 번호가 11이므로 3이 된다. 그러므로 3에 해당하는 2라는 물리 주소 값으로 가게 된다. 2는 이진수로 10이고 하위 비트 01을 붙여 물리 주소가 1001로 바뀌게 된다. 따라서 9번지에 실제 프로세스의 페이지가 위치하게 되는 것이다.


하지만 페이징 과정을 진행하면 내부 단편화가 발생할 수 있다. 페이징은 프로세스를 특정 단위인 페이지 단위로 나누어 주고 된다. 하지만 프로세스의 크기가 페이지 크기의 배수가 아니라면 마지막 프로세스의 페이지는 한 프레임을 다 채울 수 없다. 따라서 이런 공간이 메모리 안에서 빈 공간으로 남아 낭비되게 된다. 이런 문제를 내부 단편화라고 한다. 예를 들어 프로세스가 15바이트인데 페이지를 4바이트 단위로 나눈다고 생각해보자. 그러면 3묶음의 4바이트 페이지가 나오지만 마지막 페이지는 3바이트의 크기가 만들어 진다. 프레임은 4바이트 크기인데 3바이트 크기의 페이지가 들어오면 1바이트의 메모리 낭비가 생기게 되는 것이다. 하지만 외부 단편화에 비해 낭비되는 내부 단편화의 메모리 공간이 매우 미비하다.