본문 바로가기
운영체제

운영체제 19장 - 메모리 관리(6) : 페이징(3) -

by ChocoPeanut 2017. 5. 4.

운영체제 19

- 페이징(3) -

 

모든 프로그램들은 실행되기 전에 하드디스크에 보관된다. 그리고 사용을 하고자 하는 프로그램들이 메인 메모리에 적재되어서 CPU를 할당받아 기능을 수행하게 된다. 처음에 메인 메모리에 프로세스의 적재를 배울 때에는 프로세스들이 연속적으로 하나씩 메모리에 적재되는 것으로 알고 있었다. 하지만 이런 방법은 메모리의 공간을 매우 낭비시켜 효율을 떨어뜨린다는 것을 배웠다. 이를 해결하기 위해 프로세스를 페이지라는 단위로 나누어서 메모리에 적재하는 방법인 페이징 기법을 사용하였다. 재배치 레지스터를 사용하여 페이지 테이블에 맞는 주소로 논리 주소를 물리 주소로 변환시켜 프로세스의 메모리 주소 위치를 파악하는 방법이다.


운영체제는 프로세스 관리와 메모리 관리 외에도 다양한 일을 수행한다. 그 중에서 보호라는 기능도 수행을 하는데 해킹 등을 방지하는 것을 말한다. 그런데 메모리 관리를 하면서 왜 보호에 대해서 이야기를 하는가? 모든 프로세스는 CPU에서 요구하는 논리 주소에 의해 기능을 수행한다. 다른 말로 모든 주소는 페이지 테이블을 경유해서 메인 메모리로 들어가게 된다. 따라서 페이지 테이블에서 메모리에 대한 해킹을 할 수 없도록 장치를 만들어 놓으면 보호의 기능이 매우 높아질 것이다. 이렇게 하는 방법이 바로 페이지 테이블 엔트리마다 r, w, x 비트를 두는 방식이다. 3개의 비트를 통해서 해당 페이지에 대한 접근 제어를 가능하게 만들어 준다. 특정 비트를 가지면 내용을 읽을 수만 있고 다른 비트를 가지만 내용을 읽고 쓰는 것을 모두 가능하게 한다. 따라서 해커가 읽을 수만 있는 비트를 가진 프로세스에 접근해서 내용을 수정하려고하면 바로 프로세스를 종료하도록 만들어 보호의 기능을 수행하는 것이다.


메모리를 활용하면 공유의 기능을 수행할 수 있다. 다중 프로그래밍을 지원하는 환경에서 메인 메모리에는 다양한 프로세스들이 동시에 올라와서 동작을 할 수 있다. 그런데 같은 프로그램을 지원하는 여러 가지 프로세스들이 올라오면 어떻게 될까? 예를 들면 한글 오피스를 3개의 파일을 실행시킨다고 생각해보자. 같은 프로그램인데 각각 다른 작업을 수행하기 위해 복수 개의 프로세스가 올라올 수 있다. 하지만 같은 프로그램이기 때문에 복수 개의 프로세스는 공통된 기능을 지원받을 수 있을 것이다. 그런데 메인 메모리에 적재될 때 각각 따로 프로그램이 지원하는 기능을 메모리에 올린다면 메모리의 낭비가 될 것이다. 이런 경우를 위해 운영체제는 code의 영역에는 공유가 가능하게 만들었다. code 영역은 읽는 것만 가능하고 수정하는 것이 불가능하다. 따라서 임계구역 문제가 발생하지 않는다. 페이징 기법을 통해 프로세스의 부분이 페이지의 단위로 나뉘어져 있으므로 code를 이용하는 페이지를 따로 공통으로 사용하는 메모리 주소에 넣는 방법을 수행한다. 만약 같은 프로그램의 복수 개의 프로세스가 올라올 경우 공통으로 사용하는 코드부분을 특정 메모리에 하나만 적재시킨다. 그리고 프로세스의 페이지 테이블에서 코드 영역으로 가는 부분을 같은 곳을 가리키게 하여 각각 따로 사용을 하지만 메모리에는 하나의 공간만 차지하게 만드는 것이다. 물론 CPU는 프로세스들이 연속된 환경에서 움직이고 있다고 생각할 것이다.