고정 분할 메모리의 절대 적재와 재배치 가능 적재
고정 분할 메모리에서 절대 적재와 재배치 가능 적재가 주소 바인딩, 파티션 활용, 메모리 보호에 미치는 차이를 정리한다.
2026-08-14 · 최초 발행 2026-01-04
주소를 미리 고정할 것인가, 적재할 때 결정할 것인가
고정 분할은 메모리를 미리 정한 크기의 파티션으로 나누는 방식이다. 이때 프로그램의 주소를 언제 확정하는지에 따라 절대 적재(Absolute Loading)와 재배치 가능 적재(Relocatable Loading)로 나뉜다.
절대 적재는 프로그램을 특정 파티션에 묶는다. 반면 재배치 가능 적재는 여러 파티션 중 비어 있는 위치를 선택하고, 그 위치에 맞춰 주소를 변환한다. 두 방식의 차이는 주소 바인딩 시점, 메모리 활용도, 보호 기능으로 이어진다.
특정 파티션을 전제로 하는 절대 적재
절대 적재에서는 컴파일러가 특정 시작 주소를 가정해 코드를 만든다. 명령어와 데이터는 절대 주소(Absolute Address)로 표현되며, 로더는 이를 변환하지 않고 해당 메모리 위치에 배치한다.
예를 들어 프로그램이 0x1000번지부터 적재되도록 컴파일됐다면 실행 시에도 그 위치를 사용해야 한다. 주소 바인딩은 컴파일 타임(Compile-time)에 끝나며, 실행 중에는 변경할 수 없다.
주소 변환 하드웨어가 필요 없고, 로더는 실행 파일을 메모리에 그대로 복사하면 된다. 실행 중에도 주소 변환이 없으므로 배치 위치가 명확하다.
대신 지정된 파티션이 사용 중이면 다른 빈 파티션이 있어도 프로그램은 대기해야 한다. 다른 파티션에서 실행하려면 재컴파일이 필요하며, 다중 프로그래밍 환경에서는 파티션별 실행 파일이 필요해질 수 있다.
단순한 임베디드 시스템, ROM에 고정된 펌웨어, 메모리 맵이 명확히 정의된 환경, 실시간 시스템의 일부 구성 요소가 이 방식에 맞는다.
빈 파티션에 맞춰 주소를 옮기는 재배치 가능 적재
재배치 가능 적재에서는 프로그램을 상대 주소(Relative Address) 또는 논리 주소로 컴파일한다. 프로그램은 적재 시점이나 실행 시점에 실제 물리 주소로 변환되므로, 빈 파티션이 어디인지에 따라 적재 위치를 고를 수 있다.
상대 주소 100에 기준 주소 0x3000을 더하면 물리 주소는 0x3100이 된다. 이처럼 프로그램은 실행할 때마다 다른 위치에 적재될 수 있다.
컴파일러는 0번지를 기준으로 코드를 생성하고, 로더는 빈 파티션에 프로그램을 적재한다. 이후 재배치 레지스터에 해당 파티션의 시작 주소를 설정하면 실행 중 논리 주소를 물리 주소로 바꿀 수 있다.
재배치 레지스터가 맡는 역할
재배치 레지스터(Relocation Register)는 프로그램의 시작 주소를 저장하는 특수 레지스터다. 베이스 레지스터(Base Register)라고도 하며, MMU(Memory Management Unit)의 일부로 사용된다. 프로세스마다 서로 다른 값이 설정될 수 있다.
주소 변환은 다음과 같이 표현한다.
물리 주소 = 논리 주소 + 재배치 레지스터
Physical Address = Logical Address + Relocation Register
재배치 레지스터가 0x3000이고 논리 주소가 0x0100이면, 물리 주소는 0x3000 + 0x0100 = 0x3100이다.
한계 레지스터로 접근 범위를 검사한다
한계 레지스터(Limit Register)는 프로세스가 할당받은 메모리 영역 밖으로 접근하지 못하게 하는 데 쓰인다. 파티션 크기를 한계 레지스터에 저장한 뒤, 논리 주소가 그 범위 안에 있는지 먼저 확인한다.
범위를 넘으면 인터럽트를 발생시키고, 범위 안이라면 재배치 레지스터를 더해 물리 주소를 만든다.
// 주소 변환 알고리즘
if (logical_address >= limit_register) {
generate_interrupt(MEMORY_ACCESS_VIOLATION);
} else {
physical_address = logical_address + relocation_register;
access_memory(physical_address);
}
재배치 가능 적재는 여러 파티션에 프로그램을 올릴 수 있어 빈 메모리를 활용하기 쉽고, 하나의 실행 파일을 모든 파티션에서 사용할 수 있다. 한계 레지스터를 함께 사용하면 메모리 보호도 가능하다.
그 대가로 재배치 레지스터와 한계 레지스터가 필요하며, 주소 변환 연산이 추가된다. 구현은 절대 적재보다 복잡하고, 정적 재배치만 사용하면 적재 후 프로그램을 옮기기 어렵다.
적재 시점과 실행 시점의 재배치
적재 시 재배치(Load-time Relocation)는 로더가 프로그램을 올릴 때 모든 주소를 물리 주소로 계산하는 방식이다. 실행 중 주소 변환 오버헤드는 없지만, 적재가 끝난 뒤에는 프로그램을 이동할 수 없다.
실행 시 재배치(Execution-time Relocation)는 메모리에 접근할 때마다 주소를 변환한다. 재배치 레지스터를 활용하므로 프로그램을 옮길 때 레지스터 값만 바꾸면 되며, 현대 시스템의 주류 방식이다.
적재 방식별 차이
| 구분 | 절대 적재 | 재배치 가능 적재 |
|---|---|---|
| 바인딩 시점 | 컴파일 타임 | 적재/실행 타임 |
| 주소 형태 | 절대 물리 주소 | 상대/논리 주소 |
| 파티션 선택 | 고정 (특정 파티션만) | 유연 (여러 파티션 가능) |
| 하드웨어 요구 | 불필요 | 재배치/한계 레지스터 |
| 주소 변환 | 없음 | 있음 |
| 실행 오버헤드 | 없음 | 있음 (주소 변환) |
| 메모리 효율 | 낮음 | 높음 |
| 융통성 | 없음 | 있음 |
| 메모리 보호 | 어려움 | 용이 (한계 레지스터) |
| 구현 복잡도 | 낮음 | 중간 |
운영체제 메모리 관리로 이어진 흐름
임베디드 환경에서는 단순 마이크로컨트롤러와 부트로더에 절대 적재를 적용할 수 있고, 실시간 OS의 태스크 관리는 재배치 가능 적재와 연결된다.
초기 메인프레임은 절대 적재 방식으로 시작해 점차 재배치 가능 방식으로 발전했다. IBM OS/360에는 재배치 레지스터가 도입됐다.
현대 운영체제는 이 개념을 페이징과 세그먼테이션으로 발전시켰다. 가상 메모리 환경에서 MMU는 더 복잡한 주소 변환을 수행하지만, 논리 주소를 실제 메모리 위치에 연결하고 접근 범위를 제한한다는 출발점은 재배치 가능 적재에 있다.