-
[OS] 주소 변환(Address Translation)과 Base-and-BoundsCS/OS 2025. 10. 4. 18:30
우리는 가상화(Virtualization) 를 통해 물리적인 한계를 넘어, 프로그램에 일종의 환상(illusion) 을 제공한다.
Memory Virtualization: 메모리 가상화의 등장
이제 CPU에 이어, 메모리 가상화(memory virtualization) 를 살펴보겠다.
메모리 가상화 역시 Efficiency와 Control의 원리를 그대로 따른다.- Efficiency: 하드웨어(레지스터, TLB, 페이지 테이블 등)를 통해 달성
- Control: OS가 각 프로세스가 허용된 메모리만 접근하도록 보장
이걸 가능하게 하는게 주소 변환(Address Translation) 메커니즘이다.
프로그램이 생각하는 주소 (가상 주소, Virtual Address)를 실제 메모리의 위치 (물리 주소, Physical Address)로 바꿔주는 것이다.
Assumptions (기본 전제)
일단 단순하게 시작하기 위해 현실적이지 않은 몇 가지 가정을 하고 시작한다:
- 각 프로세스의 주소 공간은 물리 메모리에 연속적(contiguous)으로 배치된다.
- 주소 공간의 크기는 물리 메모리 전체보다 작다.
- 모든 주소 공간의 크기는 동일하다 (물리 메모리 할당 시).
프로그램은 무엇을 보는가?
메모리는 크게 Program Code, Heap, Stack으로 구성된다. 여기서 주의할 점이 실행(Execution)하는 것 뿐만 아니라 코드를 읽어오는 것(Fetch)도 Memory access가 발생한다.

프로그램 입장에서 메모리는 항상 0KB부터 시작한다.
예를 들어, 위 그림과 같이 어떤 C 코드에서 변수 x의 주소가 15KB라고 해보자. 이 프로그램은 x에 접근할 때 15KB라는 가상 주소에 접근한다고 믿는다.

하지만 OS는 이 프로세스를 물리 메모리의 0번지가 아닌 다른 곳에 배치하려고 한다.
- 가상 주소 공간: 0KB부터 16KB까지 (Code, Heap, Stack 등으로 구성)
- 물리 메모리: OS 영역(0KB~16KB)을 피해서, 프로세스를 예를 들어 32KB부터 배치할 수 있다.
프로세스는 0KB부터 16KB를 쓴다고 생각하지만, 실제로는 물리 메모리의 32KB부터 48KB까지의 영역을 사용하는 것이다.
과거의 방법: Static (Software-Based) Relocation
주소 변환의 역사를 보면, 초기에는 정적 재배치(Static Relocation)라는 방식이 있었다.

동작 방식: OS가 프로그램을 메모리에 올리기 전에 , 프로그램 내부의 모든 주소(데이터나 함수 주소)를 실제 물리 주소에 맞게 rewrite하는 방식이다.
- 장점: 하드웨어 지원이 전혀 필요 없다.
- 단점:
- No protection enforced: 한 프로세스가 다른 프로세스나 OS 메모리 영역을 파괴하거나 읽을 수 있다.
- Cannot move address space : 한 번 메모리에 배치되면 그 상태로 고정되기 때문에, 메모리 단편화(Fragmentation) 문제로 인해 새로운 프로세스를 할당하지 못할 수도 있다.
현대적인 해결: Dynamic Relocation (Base-and-Bounds)
정적 재배치의 단점을 극복하기 위해 나온 것이 바로 동적 재배치(Dynamic Relocation), 즉 Base-and-Bounds scheme이다.
CPU 내부에 Base(기준)과 Bounds(경계) 레지스터를 둬서, 동적으로 주소를 변환하는 방식이다.

Base 레지스터는 프로그램이 물리 메모리 어디에 로드되었는지 저장한다.

Bounds 레지스터는 프로세스의 주소 공간 크기를 저장한다.

그림을 보면 프로그램은 그대로 0KB에서 실행하도록 느끼고, base register를 통해 실제로 물리 메모리에 시작점이 0KB + 32KB = 32KB로 결정된다. 또한 bounds register값이 16KB이므로 실제 물리 메모리에서는 32KB ~ 48KB 범위의 메모리를 사용하게 된다.

프로세스가 가상 주소 128에 있는 명령을 Fetch하면, 실제로는 번지에서 가져오고 ,
가상 주소 15KB에 있는 변수에 접근하면 , 실제로는 15KB + 32KB = 47KB에 접근하는 것이다.
만약 프로세스가 4KB 크기만 할당받았는데 가상 주소 4400에 접근하려고 하면, 이는 Bounds()를 벗어났기 때문에 Fault(예외)가 발생한다.
Base-and-Bounds를 위한 하드웨어 요구사항 (Hardware Requirements)
이 동적 재배치를 위해서는 하드웨어 차원의 지원이 필수적이다.
- 특권 모드(Privileged Mode): 사용자 프로세스가 특권 명령어(OS 전용 명령어)를 실행하는 것을 막는다.
- Base/Bounds 레지스터: 주소 변환 및 경계 검사를 위한 2개의 레지스터.
- Ability to translate: 가상 주소를 물리 주소로 변환하고 경계를 검사하는 전용 회로.
- 예외 발생 기능: out-of-bounds 접근 시 예외(Exception)를 발생시키는 기능.
- 특권 명령어(Privileged instruction): OS가 Base/Bounds 레지스터를 설정할 수 있는 특권 명령어.
- 예외 핸들러 등록 명령어: OS가 예외 발생 시 어떤 코드를 실행할지(핸들러) 하드웨어에 알려줄 수 있는 특권 명령어.
Base-and-Bounds 운영을 위한 OS의 역할 (OS Issues)
OS는 Base-and-Bounds 메커니즘을 사용하기 위해 다음과 같은 네 가지 핵심 행동이 있다.
- 프로세스 시작: 물리 메모리에서 프로세스를 위한 공간을 찾는다 (Free List를 활용).
- 프로세스 종료: 사용한 메모리를 회수하여 Free List에 다시 넣어야 한다.
- Context Switch: 프로세스가 바뀔 때마다 Base/Bounds 쌍을 저장하고(Save) 복원(Restore)해야한다.
- 예외 처리: out-of-bounds 같은 문제가 발생하면 예외 핸들러가 작동하고, 보통 해당 프로세스를 종료시킨다.

- 그림과 같이 Free list에서 비어있는 공간을 찾는다.

- 사용한 메모리는 회수해서 Free list에 추가한다.

- 프로세스가 바뀔 때마다 Base/Bounds 쌍을 저장하고(Save) 복원(Restore)한다.
정리
Address Translation(주소 변환)은 Hardware + OS의 협력으로 이루어지며, 기본적인 메커니즘으로 Base-and-Bounds가 있다.
Base-and-Bounds의 한계: 내부 단편화 (Internal Fragmentation)
Base-and-Bounds는 위에서 한 가정이 성립할때는 좋은 방법이지만, 초기 가정이었던 연속적인 할당(Contiguous Allocation) 때문에 문제가 발생한다.

프로세스 주소 공간 내에서 Code, Heap, Stack 영역이 있고, 특히 Heap과 Stack이 서로를 향해 자라면서 그 사이에 사용되지 않는 공간(Wasted)이 생긴다.
Base-and-Bounds는 이 프로세스 전체 영역을 통째로 할당해야 하므로, 할당된 영역 내부에 생기는 낭비 공간, 즉 내부 단편화(Internal Fragmentation)가 발생하게 된다.
이 문제는 메모리 효율성을 떨어뜨리고, 이걸 해결하기 위해 세그멘테이션(Segmentation)이라는 다음 단계의 메커니즘으로 넘어가게 된다.
출처: 경북대학교 한명균 교수님, “운영체제” 강의 자료
'CS > OS' 카테고리의 다른 글
[OS] 외부 단편화를 해결한 Paging: 등장 배경과 한계 (1) 2025.10.10 [OS] Base & Bounds의 한계와 Segmentation의 등장 (0) 2025.10.06 [OS] 가상 메모리(Virtual Memory)의 원리와 작동 방식 (0) 2025.09.24 [OS] Priority Inversion부터 MLFQ까지: 스케줄링 문제와 해결책 (0) 2025.09.17 [OS] CPU 스케줄링의 원리와 알고리즘: FIFO, SJF, STCF, RR 비교와 I/O 통합 (0) 2025.09.15