과거 수 MB~수십 MB의 용량을 가지던 메모리는 용량이 적으면서 비쌌기 때문에 메모리 관리가 매우 중요했다. 현재 우리가 사용하는 메모리의 용량은 수 GB ~ 수백 GB까지 용량의 크기가 대폭 증가 했음에도 여전히 메모리 관리가 중요하다. 그 이유는 과거에 사용하던 프로그램보다 현재 사용하는 프로그램의 크기가 크기 때문이다.
메모리는 기본적으로 주소(Address)와 데이터(Data)로 구성되어 있다.
CPU가 메모리의 특정 부분을 읽고 싶을 때 CPU는 메모리에게 주소(Address)를 보내고, 주소를 받은 메모리는 CPU에게 주소 범위의 데이터를 전송한다.
이렇게 주소를 입력 데이터를 출력하는 방법은 2개의 버스가 필요하지만, CPU에서 데이터를 계산한 뒤 메모리에 저장할 때는 쌍방향의 Data Bus 1개만 필요하다.
프로그램의 개발 과정은 원천 파일(소스 파일) -> 목적 파일 -> 실행 파일 순으로 생성되어 최종적으로 메모리에 적재된다.
프로그램을 메모리에 올릴 때 어느 위치(주소)에 올릴 것인지 고민하는 것은 다행히도 사람이 아닌 운영체제가 처리해준다. 그렇기 때문에 고수준의 언어로 만들어진 프로그램은 주소를 고려하지 않고 개발할 수 있다.
주소를 고려하지 않고 프로그램을 개발하기 때문에 운영체제는 프로그램을 적재할 때 고정적인 자리에 프로그램을 적재하지 않고 상황에 따라 프로그램을 적재한다. 유도리 있게 프로그램을 적재할 수 있도록 도와주는 시스템이 바로 MMU의 재배치 레지스터(Relocation register)이다.
간단한 예제
작업요청이 들어온 A 프로그램은 30번지 주소에서 작업을 진행해야 한다(프로그램 개발 시 지정 주소를 설정함). 하지만 해당 자리에 B 프로그램이 먼저 와서 작업을 진행하고 있으면, A 프로그램은 재배치 레지스터(Relocation register)를 사용하여 작업을 통하여 남는 자리(300번지)에 가서 작업을 실행할 수 있다.
CPU는 A 프로그램이 30번지에서 작업을 하고 있다고 생각하지만, MMU에서 주소를 재배치했기 때문에 실제로는 메모리의 300번지에서 작업을 하고 있다.
즉 CPU는 프로그램이 설정한 주소를 계속 사용하고 있지만 MMU를 통해 실제 메모리에 할당받아 사용하는 주소는 다르게 사용할 수 있다.