본문 바로가기
운영체제

운영체제 14장 - 메모리 관리(1) : 주기억장치(메인 메모리) 개요 -

by ChocoPeanut 2017. 4. 28.

운영체제 14

- 메모리 관리(1) : 주기억장치(메인 메모리) 개요 -

 

운영체제의 역할 중에 제일 큰 비중을 차지하는 부분이 프로세스 관리와 메모리 관리이다. 앞의 장들로 프로세스 관리에 대해서 배웠다. 이번 장부터는 메모리 관리에 대해서 학습을 할 것이다.



지금 메모리를 생각하면 반도체인 집적회로 메모리를 생각하게 된다. SRAM은 캐시 메모리에 사용되고 DRAM이 메인 메모리에 사용이 된다. 하지만 이전의 메모리는 한 칩 안에 넣는 것이 아니라 개별적으로 메모리를 가지고 있어서 하나의 메모리에 많은 용량을 넣을 수 없었다. 이러한 형태가 트랜지스터 메모리의 형태이다. 이보다 전의 형태는 진공관 메모리 형태로 크기는 크지만 데이터를 넣을 용량은 더 적은 메모리의 형태이다. 70년대에서는 8bit PC 64KB의 크기였다. 현재는 수 GB에 다라는 용량을 가지는 메모리가 나타나고 있다. 운영체제의 등장은 60년대부터인데 이 시대에는 운영체제의 역할이 프로세스 관리도 중요했지만 메모리 관리가 매우 큰 역할을 차지하였다. 메모리가 매우 비싼 자원으로 속하여 있었기 때문이다. 하지만 현재 메모리 용량이 매우 크게 증가하였는데 이로 인해 메모리 관리가 중요한 역할이 아닐 것이라고 생각할 수도 있다. 하지만 현재도 메모리를 관리하는 역할은 매우 중요하다. 메모리 용량이 증가하였지만 프로그램의 크기 또한 계속해서 증가하고 있기 때문에 메모리의 용량은 언제나 부족한 상태이다.


프로그램이 처음에 시작할 때는 기계어나 어셈블리언어로만 작성을 하는 형태가 많이 있었다. 하지만 시대를 넘어오면서 C언어를 사용하고 이를 넘어 수많은 다른 언어들을 사용하기 시작했다. 프로그램의 크기가 점차 커지기 시작하는 것이다. 요즘에는 숫자 처리, 문자 처리뿐만 아니라 멀티미디어 처리, 빅 데이터 처리 등을 위해 프로그램이 사용되므로 프로그램의 크기가 매우 커지고 있기 때문에 메모리에 큰 공간을 차지하게 된다. 이에 중요한 문제가 어떻게 하면 메모리를 효과적으로 사용할 수 있는가에 대한 질문이다. 메모리 사용의 낭비를 없애는 방법을 많이 찾게 되었다. 이러한 형태 중 하나가 가상 메모리라는 도구가 있다.


메모리는 주소데이터로 구성되어 있다. CPU가 원하는 데이터의 주소를 메모리에 보내주게 되면 메모리는 CPU에게 해당하는 데이터를 보내준다. 또한 CPU에서 계산된 결과를 메모리의 특정 주소에 저장하고 명령을 보내면 메모리에 해당 주소에 데이터를 저장한다.


프로그램을 개발할 때는 여러 가지의 파일 형태를 가진다. 소스 파일은 고수준언어 또는 어셈블리언어로 개발된 파일을 말한다. 소스 파일은 컴파일러와 어셈블러에 의해 목적 파일로 전환된다. 목적 파일은 소스 파일에 대한 컴파일 또는 어셈블 결과를 나타내는 파일로 기계어로 나타내어진다. 목적 파일을 링크가 실행파일로 바꾼다. 실행파일은 링크의 결과로 나타난 파일이다. 링크는 하드디스크에 들어가 있는 다양한 내장 함수(Library)들을 실행하기 위해 연결을 해주는 과정이다. 만들어진 실행 파일을 메모리에 적재하는 과정을 하는 것은 로더이다. 실행 파일은 로더에 의해 적재되어야만 실행이 가능하다.



하나의 프로그램이 실행되기 위해서는 코드와 데이터, 스택을 가지고 있어야한다. 코드의 경우에는 앞에서 작성한 파일들이 될 수 있다. 데이터의 경우는 프로그램이 실행될 때 넣어주어야 할 값이 된다. 예를 들어 두 수 중 큰 수를 나타내어 주는 프로그램이 있으면 큰 수를 나타내게 해주는 작업을 해주는 부분이 코드이고 두 수를 입력하는 값이 데이터이다. 스택은 함수를 호출 했을 때 돌아오는 주소와 지역변수를 저장하는 공간이다.


실행 파일이 만들어지면 로더에 의해 메모리에 올려 진다고 하였다. 운영체제는 이 실행 파일을 메모리의 어디 부분에 올릴지를 결정한다. 다중 프로그램의 환경에서 메모리에 프로그램을 넣어주고 다시 하드디스크로 보내주고 하는 과정들을 모두 운영체제에서 담당하여 처리를 한다. 사실 고수준언어를 작성할 때에는 주소를 사용하여 작성하지 않지만 목적 파일로 바뀌어 실행 파일을 사용하면 주소의 값을 통해 코드를 이동하고 작동을 하게 된다. 따라서 메모리에 적재할 때 적절한 메모리 위치에 프로그램을 넣지 않으면 문제가 발생할 수 있다. 이러한 문제를 해결하는 것이 MMU이다. MMU 운영체제의 역할을 설명할 때 같이 설명하였는데 주소의 영역을 정해주는 역할을 한다. MMU에는 재배치 레지스터가 존재하는데 이는 코드가 원하는 주소를 만들어주는 역할을 한다. 예를 들어 코드에서 0번지에 들어가야 하는 프로그램이 작성되어 있는데 메모리에서 빈 공간이 주소가 500번지 있다고 한다. 그러면 재배치 레지스터에서 500이라는 값을 더해주어 코드가 500번지에서 실행하는 것이 맞게 해주는 것이다.