메모리는 주소를 통해 접근하는 매체입니다. 그렇기 때문에 메모리를 찾아가기 위해서 메모리별로 주소가 매겨집니다. 이 주소는 크게 2가지로 나뉩니다.
1. 논리적(Logical) 주소 vs 물리적(Physical) 주소
논리적 주소
프로그램이 실행되면 프로그램 별로 독자적인 주소 공간이 형성됩니다. 이처럼 프로그램마다 가지고 있는 주소를 논리적 주소(가상 주소)라고 합니다. 프로세스마다 0번지부터 시작하는 독자적인 주소 공간입니다.
물리적 주소
물리적인 주소는 말 그대로 실제 물리적인 메모리의 주소를 말합니다. 메모리에 실제 올라가는 위치를 의미합니다. 물리적인 메모리는 하나임으로 모든 프로그램 주소를 0번지부터 통으로 관리합니다. 그래서 물리적인 메모리 주소의 아랫부분에는 운영체제 커널, 상위에는 여러 프로그램들이 섞여있습니다.
주소 변환
프로그램마다 독자적인 주소가 있지만 프로그램 실행을 하기 위해서는 실제 메모리에 올라가야 합니다. 이것을 주소 변환이라고 합니다.
그리고 실제 물리적인 메모리의 어디에 올라갈지, 주소를 결정하는 것을 주소 바인딩이라고 합니다.
주소 바인딩은 Symbolic Address -> Logical Address -> Physical Address 순으로 이루어지는데, 이 논리적인 주소가 물리적인 주소로 언제 결정되는지에 대한 방법이 세 가지가 있습니다. 아래에서 그 방법들에 대해 살펴보겠습니다.
( + Symbolic Address : 프로그래머가 코드를 작성할때, 특정 변수에 값을 저장해 그 변수를 메모리에 올리지는 않습니다. 프로그래머 입장에서는 숫자가 아닌 심볼로 된 주소를 사용합니다.)
2. 주소 바인딩(Address Binding)
논리적 주소에서 물리적 주소로 변환되는 주소 바인딩이 이루어지는 시점은 크게 세 가지로 나눌 수 있습니다.
주소 변환이 컴파일 시에 이루어지면 Compile Time Binding, 프로그램이 시작될 때 이루어지면 Load Time Binding, 프로그램이 시작되고 바뀔 수 있으면 Run Time Binding 또는 Excution Time Binding입니다.
주소 바인딩이 무엇인지 그림으로 쉽게 살펴보겠습니다.
왼쪽의 소스코드는 사용자가 작성한 코드입니다. Symbolic Address로 주소가 표현이 되어있는 것을 볼 수 있습니다. A위치에 있는 값과 B 위치에 있는 값을 더해 C로 점프하도록 작성되어있습니다.
이처럼 프로그래머는 Symbolic Address로 메모리 주소를 사용합니다. 이후 컴파일되어 실행 파일이 만들어지게 되면 Symbolic Address에서 Logical Address로 바뀌게 됩니다. 즉 각각의 문장들이 숫자로 구성된 메모리 주소에 올라가, 메모리의 0번지, 10번지, 20번지.. 식으로 바뀌게 됩니다.
이후 실행 파일이 실행이 되려면 Physical Memory에 올라가야 하고 Physical Memory의 주소가 결정되는 것이 바로 주소 Binding 입니다.
(1) Compile time binding
주소 변환이 컴파일 시에 이루어지는 것입니다. 컴파일 시 이미 물리적인 주소가 결정되어야 하기 때문에, 논리적 메모리 그대로 물리적 메모리로 올려야합니다. 물리적 메모리에 공간이 많은데도 불구하고 항상 0번지부터 논리적인 메모리 그대로 올려야하기 때문에 굉장히 비효율적입니다. 컴파일 시 물리적인 주소가 고정되기 때문에 Compile time binding으로 만들어진 코드는 절대 코드라고 부르고, 메모리의 위치를 바꾸고 싶다면 컴파일을 다시 해야합니다. 컴퓨터에서 프로그램 하나만 사용할 때 사용되었고 현재는 사용하지 않는 방법입니다.
(2) Load time binding
주소 변환이 실행될 때 이루어지는 것입니다. 컴파일 시에는 논리적인 주소만 결정됩니다. 만약 프로그램을 시작할 때 물리적인 메모리가 500번지 부터 비어있다면 논리적 메모리 주소 0번지를 물리적 메모리 주소 500번지에 올리게 됩니다.
(3) Execution time binding ( = Run time binding)
프로그램이 시작된 이후에도 실행 중간에 물리적인 메모리 주소가 바뀔 수 있는 것입니다. 논리적 메모리 주소 0번지가 물리적 메모리 주소 300번에 올라와 있다가, 실행 도중 경우에 따라 메모리 300번지에서 쫓겨나고, 300번지의 내용이 700번지로 이동하는 방식입니다. 이는 현재 사용되는 시스템 방식입니다.
Compile Time Binding과 Load Time Binding은 프로그램이 시작되고 주소가 바뀌지 않지만, Run Time Binding은 CPU가 메모리 주소를 요청할 때마다 Binding을 체크해 주소 변환을 그때마다 해주어야 합니다. 그래서 하드웨어 지원이 필요합니다. 이 주소 변환을 지원해주는 하드웨어를 MMU(Memory-Management Unit)라고 부릅니다.
현재 프로그램 실행이 되는 상황에서는 필요한 부분만 메모리에 올라가고 필요 없는 내용은 디스크로 쫓겨나 메모리에 올라가는 부분도 나뉘어져 올라가게끔 처리해야 하는데 이러한 일들은 현대 OS가 합니다.
이번 포스팅에서는 프로그램의 논리적 주소가 통째로 물리적 주소로 올라간다는 가정하에서의 주소 변환을 살펴보겠습니다.
3. Memory-Management Unit(MMU)
위에서 설명한대로 MMU란 logical 주소를 physical 주소로 매핑해주는 하드웨어 장치입니다. 기본적인 MMU에서는 Relocation Register(base register)와 Limit Register의 2개 레지스터를 통해 변환합니다. Relocation Register는 접근할 수 있는 물리적 메모리 주소의 최소 값을 말하고 Limit Register는 논리적 주소의 범위를 말합니다.
MMU scheme은 사용자 프로세스가 CPU에서 수행되며 생성해내는 모든 주소 값에 Relocation Register(base register)의 값을 더합니다.
어떻게 주소 변환이 이루어지는지 아래의 사진을 통해 살펴보겠습니다.
CPU가 메모리 346번지에 있는 내용을 요청한 것입니다.
좌측 하단의 그림은 프로세스 1의 논리적 메모리 주소(가상 메모리)를 나타냅니다. 독자적인 주소로 0번지부터 3000번지까지 있고, CPU가 346번지를 요청했기 때문에 0에서부터 346번쨰 떨어진 주소 내용을 CPU가 요청한 것입니다.
그리고 우측의 물리적 메모리에서는 14000번지부터 올라간 상황입니다. 논리적 메모리 주소를 물리적 메모리 주소로 변환하기 위해 시작 위치(14000)과 논리 주소(346)을 더해 14346만큼 떨어진 위치의 내용을 읽어 CPU에게 알려줍니다.
그래서 MMU에서는 MMU scheme에 프로그램의 시작 위치(14000)을 저장해놓습니다. 이후 주소 변환시에는 여기에 논리주소를 더해 주소 변환을 하게 됩니다.
그리고 Limit register는 3000으로 설정되어있는 것을 볼 수 있습니다.
Limit register는 프로그램의 크기를 담고 있는 것입니다. 위 사진에서는 프로그램의 메모리를 3000으로 갖고 있습니다.
만약 자신의 크기가 3000인데도 불구하고 4000번지를 요청하게 되면 해당 영역은 자신 프로세스의 영역을 벗어난 것이고, 그 영역은 다른 프로그램의 영역입니다. 남의 프로그램을 엿볼 수 있는 문제가 생기기에 이를 방지해야합니다. 그러기 위해 프로그램 크기보다 더 큰 논리적 주소를 요청한 것은 아닌지를 매번 체크해야합니다.
만약 Limit Register 값을 넘어가는 주소를 요청한다면 Trap이 걸리게 됩니다. Trap에 걸리면 하던 일을 잠시 멈추고 CPU 제어권이 운영체제에 넘어갑니다. 그럼 운영체제는 Trap이 왜 걸렸는지 확인한 후 프로그램을 종료시키는 등의 조치를 취하게 됩니다.
Logical address가 프로그램 크기 이내에 있는 요청이었다면, Logical Register 값을 더해 주소 변환을 한 후, 물리적인 메모리의 데이터를 읽어 CPU에 전달합니다.
사용자 프로그램 입장에서는 Logical Address만 다루는 것을 볼 수 있습니다. 사용자 프로그램은 실제 Physical Address는 볼 수도 없고, 알 필요가 없습니다. CPU도 마찬가지로 Logical Address만 다룹니다.
즉 Physical Address는 요청이 되었을 때, MMU가 그때마다 주소 변환을 해서 얻게 되는 개념입니다.
참고자료
[KOCW 이화여대 반효경 교수님 - Memory Management 1]
https://core.ewha.ac.kr/publicview/C0101020140425151219100144?vmode=f
[ Operating System Concepts - Abraham Silberschatz ]
https://www.yes24.com/Product/Goods/89496122