운영체제의 메모리 관리는 단순히 “데이터를 저장하는 공간” 그 이상입니다.
프로세스의 실행, 보호, 효율성에 직결되는 핵심 기술입니다.
이 글에서는 메모리 주소 체계와 주소 바인딩 방식을 중심으로
메모리 관리의 개념을 탄탄하게 정리해보겠습니다.
이때 프로세스 입장에서는 메모리를 독차지하려 하고, 메모리 관리자 입장에서는 되도록 관리를 효율적으로 하고 싶어합니다.
메모리의 주소를 표현할때 물리주소와 논리주소로 나눠서 구분한다.
사용자 입장에서 바라본 주소? 뭔가 쉽게 와닿는 표현은 아닌거 같다.
좀 더 자세하게 설명 해보겠다.
실제 주소랑 별개로 프로세스 사용할 수 있는 공간부터 0번지로 판단하고 계산한다. 그렇다면 논리주소를 어떻게 실제 물리주소로 변환 하는 걸까?
프로그램 P1 실행 시작
P1 → 40번지 접근 요청
CPU는 이 요청을 '논리 주소 40'으로 처리
논리 주소 40
을 MMU로 전달메모리 관리자는 '재배치 레지스터'를 확인
360
이 설정되어 있음주소 변환 수행
360 + 40 = 400
400
으로 변환메모리 접근
물리 주소 400
의 메모리 공간에 접근함40
처럼 보이지만,용어 | 설명 |
---|---|
논리 주소(Logical Address) | 프로그램(P1)이 CPU에 요청하는 주소 (ex. 40) |
물리 주소(Physical Address) | 실제 메모리 상의 주소 (ex. 400) |
재배치 레지스터(Relocation Register) | 논리 주소에 더해질 시작 주소가 기록 된 곳 (ex. 360) |
메모리 관리자(Memory Management Unit) | 주소 변환을 수행하는 하드웨어/소프트웨어 컴포넌트 |
프로세스는 메모리에 직접 접근하지 않는다. 프로세스는 논리주소를 CPU에 전달하면, 논리 주소를 MMU(메모리 관리 장치)를 통해 변환되어서 물리주소로 변경하고, 그 물리 주소를 통해 실제 메모리에 접근을 한다.
기능 | 설명 |
---|---|
고정 분할 | 메모리를 일정 크기로 나누고 프로그램을 넣는 방식 |
동적 분할 | 프로그램 크기에 맞게 메모리 공간을 동적으로 배정 |
페이징(Paging) | 고정된 크기의 페이지 단위로 메모리를 나눠 관리 |
세그먼테이션 | 논리적 의미를 갖는 단위(코드/데이터/스택 등)로 분할 |
페이지화된 세그먼테이션 | 위 두 기법의 결합 (실무에서 가장 많이 쓰임) |
※ 바인딩은 본래 "주소를 연결하는 행위"이지만, 운영체제에서는 이 연결을 "언제 수행하는지"에 따라 분류하는 것이 핵심입니다. 그렇기 때문에 바인딩과 매핑이 용어가 비슷해서 헷갈릴 수 있으나, 바인딩은 "언제 주소를 결정할지", 매핑은 "그 주소를 실제로 어떻게 바꿀지" 이렇게 생각하는게 편하다고 합니다.
바인딩은 총 3가지 시점 중 하나에서 발생할 수 있음:
프로그램이 실행되기 위해서는 작성된 코드가 메모리에 올라가야 하며, 이 과정에서 논리 주소를 물리 주소에 연결하는 작업이 필요합니다. 이 연결 작업을 "주소 바인딩(Address Binding)"이라고 하며, 그 바인딩이 언제 수행되느냐에 따라 크게 세 가지 방식으로 나뉩니다.
컴파일 시간 바인딩은 컴파일 시점에 프로그램의 메모리 적재 위치가 결정되는 방식입니다.
즉, 프로그램이 실행되기도 전에 어느 메모리 주소에 로드될지 컴파일러가 이미 알고 있어야 합니다.
이 방식은 논리 주소와 물리 주소가 사실상 동일하게 처리되며, 별도의 주소 변환 장치(MMU)는 필요하지 않습니다. 하지만 위치가 고정되기 때문에 프로그램의 재배치가 불가능하고, 전체 프로그램을 메모리에 한 번에 로드해야 하기 때문에 유연성이 매우 떨어집니다.
이 방식은 일반적인 운영체제보다는 임베디드 시스템이나 마이크로컨트롤러처럼 메모리 구조가 단순하고 고정된 환경에 적합합니다.
적재 시간 바인딩은 프로그램이 메모리에 로드되는 시점에 실제 물리 주소가 결정되는 방식입니다.
컴파일러는 물리 주소를 모르기 때문에 상대 주소(relocatable address)를 생성하며, 실행 시 운영체제가 해당 프로그램을 메모리의 어느 위치에 올릴지를 결정하고, 그 시작 주소를 재배치 레지스터에 저장합니다.
이 방식은 실행 중에는 메모리 위치가 바뀌지 않지만, 로드 시점에는 다양한 위치에 프로그램을 재배치할 수 있어 컴파일 시간 바인딩보다는 유연합니다. 이때부터 MMU가 필요하게 됩니다.
실행 시간 바인딩은 프로그램이 실제로 CPU에 의해 실행되는 도중에 "주소 변환이 일어나는 방식입니다. 즉 명령어가 실행될 때마다 변환된다.
프로그램은 항상 상대 주소를 사용하고, CPU가 명령어를 실행할 때마다 MMU가 그 논리 주소를 물리 주소로 실시간 변환합니다.
이 방식은 현대의 대부분 운영체제에서 사용되는 방식으로, 메모리 보호, 프로세스 간 격리, 가상 메모리 등과 같은 고급 기능 구현에 필수적입니다.
또한 실행 중에도 메모리 위치를 자유롭게 바꿀 수 있어, 프로세스 스케줄링, 페이징, 스와핑 등의 기법과 잘 어울립니다.
바인딩 시점 | 주소 결정 시점 | 위치 변경 가능성 | MMU 필요 여부 | 유연성 |
---|---|---|---|---|
Compile Time | 컴파일 시 | ❌ | ❌ | 낮음 |
Load Time | 적재 시 | ❌ | ✅ | 중간 |
Run Time | 실행 중 | ✅ | ✅ | 높음 |