본문 바로가기
운영체제

운영체제 15장 - 메모리 관리(2) : 메모리 낭비 방지 -

by ChocoPeanut 2017. 4. 29.

운영체제 15

- 메모리 낭비 방지 -

 

하드디스크에 존재하는 프로그램들은 메모리의 특정 부분에 적재되어 실행이 된다. 프로그램이 만들어지기 까지 소스 파일, 목적 파일, 실행 파일을 거쳐 로더에 의해 메모리에 올려 지게 되는데 적절한 위치에 적재를 해야 실행을 시킬 수 있다. 앞 장에서 MMU의 재배치 레지스터를 이용하면 부분적으로 적절한 위치에 프로그램을 올릴 수 있다. 이번 장에는 이를 더 넘어가서 어떻게 하면 더 효율적으로 프로그램을 올릴 수 있는지, 메모리 보호를 위해서 메모리를 낭비하는 것을 방지하는 어떤 방법을 사용해야 하는지에 대해 학습 할 것이다.


MMU가 메모리 관리를 하는 방법에 대해서 조금 더 상세히 들어가 보자. MMU는 프로그램이 동작할 때 필요한 데이터나 동작들을 메모리의 특정 주소 위치로부터 가지고 와야 하는데 이는 프로그램이 만들어질 때 코드화 되어 있다. 따라서 항상 같은 위치의 메모리 주소로부터 데이터를 불러오게 된다. 하지만 메모리에 프로그램을 적재할 때 항상 같은 위치에 프로그램을 올릴 수는 없다. 어떤 날에는 0번지에 올리기도 하고 다른 날에는 500번지에 올리기도 한다. 이는 메모리 공간에서 빈 공간을 찾아 프로그램을 올리기 때문에 알 수가 없다. 그래서 이를 맞추어 조절해주는 역할을 하는 것이 바로 MMU재배치 레지스터이다. 재배치 레지스터는 CPU가 프로그램을 실행시킬 때 코드를 읽어 들어가는데 코드에서 특정 위치의 메모리 주소로부터 데이터를 가지고 오라는 동작을 할 때 도움을 준다. CPU는 분명 특정 위치를 가르쳐 주었는데 재배치 레지스터는 이의 주소에서 메모리에 프로그램이 있는 위치 주소를 더해서 계산을 해서 CPU에서 원하는 데이터 위치와 메모리상에 프로그램의 위치를 맞게 맞추어 준다. 여기서 CPU에서 MMU로 보내는 주소를 논리 주소라고 하고 MMU에서 메모리로 보내는 주소는 물리 주소라고 한다.



동적 적재프로그램 실행에 반드시 필요한 루틴/데이터만 적재하는 것을 의미한다. 적재는 프로그램을 메인 메모리에 올리는 동작을 의미한다. 우리가 프로그램을 작성할 때 다양한 코드를 작성한다. 실제 실행이 되는 부분도 있지만 예외의 상황을 처리하는 경우 실행이 되지 않는 부분이 있을 수도 있다. 모든 루틴이 다 사용되는 것이 아니고 모든 데이터가 다 사용되는 것도 아니다. 따라서 프로그램의 모든 동작을 메인 메모리에 다 적재를 하면 차지하는 공간이 많아지게 된다. 동적 적재는 이런 문제를 해결하기 위해 실제 실행되는 반드시 필요한 루틴/데이터만 적재를 하는 것이다. 예시로 오류처리나 사용하지 않는 데이터와 같은 부분은 사용을 할 경우에만 메모리로 적재를 하고 아닐 경우에는 적재시키지 않는다. 이를 통해 메모리의 효율을 높일 수 있다.


동적 연결여러 프로그램에 공통 사용되는 라이브러리를 관리하는 방법이다. 여러 가지의 프로그램이 메모리상에 존재할 때 공통으로 사용하는 라이브러리가 존재한다. 예를 들면 C언어로 만들어진 프로그램이 여러 가지가 있는데 여기서 prinf()와 같은 C언어에서 사용하는 공통 라이브러리가 존재한다. 하지만 동적 연결을 하지 않으면 각각의 프로그램에 필요한 라이브러리가 각각 메모리에 적재되게 된다. 공통 라이브러리 루틴을 메모리에 중복으로 올리는 것은 메모리에 낭비가 된다. 라이브러리 루틴 연결을 실행 시까지 미루고 오직 하나의 라이브러리 루틴만 메모리에 적재해서 이 루틴과 연결을 하도록 하는 방법을 해서 적용시키는 방식인 동적 연결을 하게 되면 이렇게 낭비되는 메모리를 줄여 효율을 높일 수 있다.



Swapping이라는 기술은 메모리에 적재되어 있으나 현재 사용되지 않고 있는 프로세스를 관리하는 역할을 한다. 메모리 활용도 높이기 위해 Swapping을 이용하면 현재 사용되지 않는 프로세스를 Backing store로 몰아낸다. Backing store는 하드디스크의 일부분이다. 이런 과정을 swap-out 이라고 한다. 이와 반대로 필요한 부분이 생기면 그 부분에 대해 메모리로 적재해서 올려주는 swap-in이라고 한다. MMU의 재배치 레지스터를 사용하므로 적재 위치는 메모리의 빈 공간 어디에도 적재가 가능하다. 이런 작용으로 메모리의 활용도를 높일 수 있어 효율이 높아진다. 하지만 프로세스의 크기가 크면 Backing store 입출력에 따른 부담이 크다