가상메모리의 주소 변환과 페이지 교체
여러 프로그램을 동시에 실행하면 각 프로그램은 자기 코드와 데이터를 안전하게 보관할 공간이 필요하다. 그러나 실제 주기억장치의 크기는 유한하고, 프로그램이 확보한 공간 중 당장 쓰는 부분은 일부인 경우가 많다. 운영체제가 프로그램마다 독립된 주소의 세계를 보여 주고, 지금 필요한 부분만 주기억장치에 올릴 수 있다면 …
프로세스·스레드·CPU 스케줄링의 독립 주소공간이 선수 개념이다. 이 절에서는 페이지·프레임·오프셋의 몫과 나머지를 먼저 확인하고 주소 변환과 교체를 연결한다.
실행 중인 프로그램 전체가 항상 메모리에 있을 필요는 없다
여러 프로그램을 동시에 실행하면 각 프로그램은 자기 코드와 데이터를 안전하게 보관할 공간이 필요하다. 그러나 실제 주기억장치의 크기는 유한하고, 프로그램이 확보한 공간 중 당장 쓰는 부분은 일부인 경우가 많다. 운영체제가 프로그램마다 독립된 주소의 세계를 보여 주고, 지금 필요한 부분만 주기억장치에 올릴 수 있다면 제한된 물리 자원을 더 안전하고 유연하게 나눌 수 있다.
그 대가도 있다. 프로그램이 낸 주소를 실제 위치로 바꾸는 표가 필요하고, 표를 찾는 비용을 줄여야 하며, 필요한 내용이 주기억장치에 없을 때는 실행을 멈추고 가져와야 한다. 공간이 부족하면 무엇을 내보낼지도 정해야 한다. 가상메모리의 핵심은 큰 메모리처럼 보이게 하는 환상이 아니라, 주소 변환·보호·적재·교체를 하나의 일관된 계약으로 관리하는 것이다.
한 문장으로 말하면
가상메모리(virtual memory)는 프로세스가 사용하는 논리주소를 물리메모리나 보조저장장치의 위치에 매핑하여, 격리된 주소공간과 필요 시 적재를 제공하는 메모리 관리 추상화다.
주소공간(address space)은 한 프로세스가 사용할 수 있다고 보는 주소들의 범위와 그 주소별 접근규칙이다. 논리주소(logical address), 또는 가상주소(virtual address)는 실행 중인 명령이 사용하는 주소이고, 물리주소(physical address)는 실제 주기억장치 위치를 가리키는 주소다. 둘을 구분하면 같은 논리주소라도 서로 다른 프로세스에서는 다른 물리 위치를 가리킬 수 있다.
정확히 말하면: 가상메모리는 매핑과 보호의 계약이다
프로세스 p가 논리주소 v에 읽기·쓰기·실행 연산 op를 요청한다고 하자. 운영체제와 하드웨어는 현재 매핑 M(p, v)를 확인하여 다음 셋 중 하나를 결정한다.
- 해당 주소가 허용되고 필요한 내용이 주기억장치에 있으면 물리주소로 변환해 연산을 수행한다.
- 주소 사용은 허용되지만 내용이 아직 주기억장치에 없으면 운영체제가 내용을 적재한 뒤 명령을 다시 수행할 수 있게 한다.
- 주소가 범위 밖이거나 연산 권한이 없으면 보호 위반으로 처리한다.
따라서 가상메모리의 불변조건은 한 프로세스의 허용되지 않은 주소가 다른 프로세스나 커널의 물리공간으로 변환되지 않는다, 같은 매핑의 주소와 내용이 일치한다, 교체 중인 내용을 잃지 않는다이다. 용량 확대는 이 계약에서 생기는 효과 중 하나이며, 격리·공유·권한통제가 함께 성립해야 한다.
전체에서 어디인가: 주소 한 번이 처리되는 길
도식에서 먼저 보이는 변환 색인 버퍼(Translation Lookaside Buffer, TLB)는 최근 주소 변환을 저장한 빠른 기록이고, 페이지 폴트(page fault)는 변환 부재나 권한 위반 때문에 CPU가 현재 메모리 접근을 끝내지 못한 동기적 예외다. 여기서는 전체 위치만 보고, 뒤의 각 설명에서 적중·미적중과 복구 가능 여부를 정식으로 설명한다.
TLB 적중도 접근 권한을 생략하지 않는다 · 상태 따라가기
같은 논리주소와 읽기·쓰기·실행 종류를 고정하고 TLB를 조회한다. 모든 단계에서 주소·권한·변환 경로·결과의 위치를 유지하며 값과 허용 조건을 함께 확인합니다.
상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.
적중은 변환기록을 바로 얻는 경로이고 미적중은 페이지 테이블을 찾는 경로다. 두 경로 모두 현재 매핑·접근 권한을 확인한다. 정상 접근은 물리주소를 사용해 완료하고, 부재·보호 예외는 다음 폴트 처리로 보낸다. TLB 미적중만으로 페이지 폴트를 뜻하지 않는다.
이 예의 조건
- 적중은 변환기록을 바로 얻는 경로이고 미적중은 페이지 테이블을 찾는 경로다. 두 경로 모두 현재 매핑·접근 권한을 확인한다. 정상 접근은 물리주소를 사용해 완료하고, 부재·보호 예외는 다음 폴트 처리로 보낸다. TLB 미적중만으로 페이지 폴트를 뜻하지 않는다.
- 이 원문의 교육용 사례·조건 안에서 상태를 대조합니다. 실제 구축·실험 결과나 원문에 없는 성능 보장을 추가하지 않습니다.
관계도의 보충 설명
| 대상 | 원 설명 |
|---|---|
| 논리주소·접근종류 | 읽기·쓰기·실행 |
| TLB에 변환? | 원그림의 대상 |
| 페이지 테이블 | frame·present·권한 |
| 접근 완료 가능? | 현재 매핑·권한 |
| 물리주소 접근 | frame + 같은 offset |
| 페이지 폴트 처리 | 원그림의 대상 |
| 연결 | 원 라벨·방향 |
|---|---|
| 논리주소·접근종류 → TLB에 변환? | 라벨 없는 연결 / 정방향 / 실선 |
| TLB에 변환? → 페이지 테이블 | 미적중 / 정방향 / 실선 |
| TLB에 변환? → 접근 완료 가능? | 적중 / 정방향 / 실선 |
| 페이지 테이블 → 접근 완료 가능? | 변환·상태 / 정방향 / 실선 |
| 접근 완료 가능? → 물리주소 접근 | 가능 / 정방향 / 실선 |
| 접근 완료 가능? → 페이지 폴트 처리 | 예외 / 정방향 / 실선 |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 조회의 공통 시작 같은 논리주소와 읽기·쓰기·실행 종류를 고정하고 TLB를 조회한다. |
|
|
| 적중 대안 TLB에 변환기록이 있는 경우 현재 매핑과 접근 권한 검사를 한다. |
|
|
| 미적중 대안 TLB 조회 시작점으로 재설정해 기록이 없으면 페이지 테이블을 찾는다. |
|
|
| 공통 검사 통과 대안 어느 변환 경로든 현재 매핑·권한이 접근 가능한 경우 물리주소를 쓴다. |
|
|
| 공통 검사 예외 대안 매핑·권한 검사 시작점으로 재설정해 부재나 보호 예외인 경우를 본다. |
|
|
TLB 적중도 접근 권한을 생략하지 않는다 · 상태 따라가기
같은 논리주소와 읽기·쓰기·실행 종류를 고정하고 TLB를 조회한다. 모든 단계에서 주소·권한·변환 경로·결과의 위치를 유지하며 값과 허용 조건을 함께 확인합니다.
상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.
적중은 변환기록을 바로 얻는 경로이고 미적중은 페이지 테이블을 찾는 경로다. 두 경로 모두 현재 매핑·접근 권한을 확인한다. 정상 접근은 물리주소를 사용해 완료하고, 부재·보호 예외는 다음 폴트 처리로 보낸다. TLB 미적중만으로 페이지 폴트를 뜻하지 않는다.
이 예의 조건
- 적중은 변환기록을 바로 얻는 경로이고 미적중은 페이지 테이블을 찾는 경로다. 두 경로 모두 현재 매핑·접근 권한을 확인한다. 정상 접근은 물리주소를 사용해 완료하고, 부재·보호 예외는 다음 폴트 처리로 보낸다. TLB 미적중만으로 페이지 폴트를 뜻하지 않는다.
- 이 원문의 교육용 사례·조건 안에서 상태를 대조합니다. 실제 구축·실험 결과나 원문에 없는 성능 보장을 추가하지 않습니다.
관계도의 보충 설명
| 대상 | 원 설명 |
|---|---|
| 논리주소·접근종류 | 읽기·쓰기·실행 |
| TLB에 변환? | 원그림의 대상 |
| 페이지 테이블 | frame·present·권한 |
| 접근 완료 가능? | 현재 매핑·권한 |
| 물리주소 접근 | frame + 같은 offset |
| 페이지 폴트 처리 | 원그림의 대상 |
| 연결 | 원 라벨·방향 |
|---|---|
| 논리주소·접근종류 → TLB에 변환? | 라벨 없는 연결 / 정방향 / 실선 |
| TLB에 변환? → 페이지 테이블 | 미적중 / 정방향 / 실선 |
| TLB에 변환? → 접근 완료 가능? | 적중 / 정방향 / 실선 |
| 페이지 테이블 → 접근 완료 가능? | 변환·상태 / 정방향 / 실선 |
| 접근 완료 가능? → 물리주소 접근 | 가능 / 정방향 / 실선 |
| 접근 완료 가능? → 페이지 폴트 처리 | 예외 / 정방향 / 실선 |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 조회의 공통 시작 같은 논리주소와 읽기·쓰기·실행 종류를 고정하고 TLB를 조회한다. |
|
|
| 적중 대안 TLB에 변환기록이 있는 경우 현재 매핑과 접근 권한 검사를 한다. |
|
|
| 미적중 대안 TLB 조회 시작점으로 재설정해 기록이 없으면 페이지 테이블을 찾는다. |
|
|
| 공통 검사 통과 대안 어느 변환 경로든 현재 매핑·권한이 접근 가능한 경우 물리주소를 쓴다. |
|
|
| 공통 검사 예외 대안 매핑·권한 검사 시작점으로 재설정해 부재나 보호 예외인 경우를 본다. |
|
|
복구 가능한 폴트만 명령 재시작으로 이어진다 · 상태 따라가기
page fault가 복구 가능한지, 권한 오류인지 먼저 구별한다. 모든 단계에서 중단한 명령·프레임·매핑의 위치를 유지하며 값과 허용 조건을 함께 확인합니다.
상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.
커널은 주소·매핑·접근 계약을 확인한다. 허용된 부재나 설정된 COW는 복구할 수 있지만 실제 금지 접근은 완료하지 않는다. 새 프레임이 필요할 때만 확보·교체하며 dirty 희생자는 재사용 전에 기록한다. 내용 준비는 파일·교환영역 읽기, 0채움, COW 복사 또는 이미 적재된 내용의 재매핑으로 원인마다 다르다. 아래 준비 흐름은 자원 확보가 성공한 경로이며 프레임 부족 등 실패는 별도 오류 계약이 필요하다.
이 예의 조건
- 커널은 주소·매핑·접근 계약을 확인한다. 허용된 부재나 설정된 COW는 복구할 수 있지만 실제 금지 접근은 완료하지 않는다. 새 프레임이 필요할 때만 확보·교체하며 dirty 희생자는 재사용 전에 기록한다. 내용 준비는 파일·교환영역 읽기, 0채움, COW 복사 또는 이미 적재된 내용의 재매핑으로 원인마다 다르다. 아래 준비 흐름은 자원 확보가 성공한 경로이며 프레임 부족 등 실패는 별도 오류 계약이 필요하다.
- 이 원문의 교육용 사례·조건 안에서 상태를 대조합니다. 실제 구축·실험 결과나 원문에 없는 성능 보장을 추가하지 않습니다.
관계도의 보충 설명
| 대상 | 원 설명 |
|---|---|
| 복구 가능한가? | 주소·매핑·접근 계약 |
| 필요한 프레임 준비 | 빈 프레임 또는 교체 대상 |
| 원인별 내용 준비 | 읽기·0채움·COW·재매핑 |
| PTE·TLB 갱신 | 중단한 명령 재시작 |
| 오류 전달 | 해당 접근 미완료 |
| 연결 | 원 라벨·방향 |
|---|---|
| 복구 가능한가? → 필요한 프레임 준비 | 가능 / 정방향 / 실선 |
| 복구 가능한가? → 오류 전달 | 불가 / 정방향 / 실선 |
| 필요한 프레임 준비 → 원인별 내용 준비 | dirty면 먼저 기록 / 정방향 / 실선 |
| 원인별 내용 준비 → PTE·TLB 갱신 | 라벨 없는 연결 / 정방향 / 실선 |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 원인 판별 page fault가 복구 가능한지, 권한 오류인지 먼저 구별한다. |
|
|
| 프레임 준비 복구 가능한 경우 프레임을 마련하고 필요한 dirty 기록을 끝낸다. |
|
|
| 내용과 매핑 원인에 맞는 내용을 준비하고 PTE·TLB를 갱신한다. |
|
|
| 명령 재시작 유효 내용과 매핑이 준비되면 중단했던 명령을 다시 실행한다. |
|
|
복구 가능한 폴트만 명령 재시작으로 이어진다 · 상태 따라가기
page fault가 복구 가능한지, 권한 오류인지 먼저 구별한다. 모든 단계에서 중단한 명령·프레임·매핑의 위치를 유지하며 값과 허용 조건을 함께 확인합니다.
상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.
커널은 주소·매핑·접근 계약을 확인한다. 허용된 부재나 설정된 COW는 복구할 수 있지만 실제 금지 접근은 완료하지 않는다. 새 프레임이 필요할 때만 확보·교체하며 dirty 희생자는 재사용 전에 기록한다. 내용 준비는 파일·교환영역 읽기, 0채움, COW 복사 또는 이미 적재된 내용의 재매핑으로 원인마다 다르다. 아래 준비 흐름은 자원 확보가 성공한 경로이며 프레임 부족 등 실패는 별도 오류 계약이 필요하다.
이 예의 조건
- 커널은 주소·매핑·접근 계약을 확인한다. 허용된 부재나 설정된 COW는 복구할 수 있지만 실제 금지 접근은 완료하지 않는다. 새 프레임이 필요할 때만 확보·교체하며 dirty 희생자는 재사용 전에 기록한다. 내용 준비는 파일·교환영역 읽기, 0채움, COW 복사 또는 이미 적재된 내용의 재매핑으로 원인마다 다르다. 아래 준비 흐름은 자원 확보가 성공한 경로이며 프레임 부족 등 실패는 별도 오류 계약이 필요하다.
- 이 원문의 교육용 사례·조건 안에서 상태를 대조합니다. 실제 구축·실험 결과나 원문에 없는 성능 보장을 추가하지 않습니다.
관계도의 보충 설명
| 대상 | 원 설명 |
|---|---|
| 복구 가능한가? | 주소·매핑·접근 계약 |
| 필요한 프레임 준비 | 빈 프레임 또는 교체 대상 |
| 원인별 내용 준비 | 읽기·0채움·COW·재매핑 |
| PTE·TLB 갱신 | 중단한 명령 재시작 |
| 오류 전달 | 해당 접근 미완료 |
| 연결 | 원 라벨·방향 |
|---|---|
| 복구 가능한가? → 필요한 프레임 준비 | 가능 / 정방향 / 실선 |
| 복구 가능한가? → 오류 전달 | 불가 / 정방향 / 실선 |
| 필요한 프레임 준비 → 원인별 내용 준비 | dirty면 먼저 기록 / 정방향 / 실선 |
| 원인별 내용 준비 → PTE·TLB 갱신 | 라벨 없는 연결 / 정방향 / 실선 |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 원인 판별 page fault가 복구 가능한지, 권한 오류인지 먼저 구별한다. |
|
|
| 프레임 준비 복구 가능한 경우 프레임을 마련하고 필요한 dirty 기록을 끝낸다. |
|
|
| 내용과 매핑 원인에 맞는 내용을 준비하고 PTE·TLB를 갱신한다. |
|
|
| 명령 재시작 유효 내용과 매핑이 준비되면 중단했던 명령을 다시 실행한다. |
|
|
빠른 정상 경로와 느린 부재 경로를 구분해야 한다. 변환기록을 못 찾은 것과 필요한 페이지 자체가 주기억장치에 없는 것은 서로 다른 사건이다.
먼저 알아둘 것
앞에서 메모리 주소는 바이트 단위 저장위치를 구분하고, 프로세스는 독립 주소공간과 자원을 가진 실행 중 프로그램이라고 배웠다. CPU와 가까운 저장층일수록 대체로 빠르고 작으며, 주기억장치보다 보조저장장치 접근이 훨씬 느리므로 어느 층에서 찾았는지가 지연을 바꾼다. 여기서는 이 주소와 계층을 페이지 단위 매핑으로 연결한다.
페이지와 프레임: 같은 크기의 조각으로 주소를 나눈다
페이지(page)는 논리주소공간을 나눈 고정 크기 블록이고, 프레임(frame)은 물리메모리를 같은 크기로 나눈 블록이다. 논리주소는 페이지 번호 + 페이지 안의 위치로 나뉜다. 페이지 안의 위치를 오프셋(offset)이라고 한다. 주소 변환은 페이지 번호가 어느 프레임에 놓였는지만 바꾸고 오프셋은 그대로 붙인다.
넓은 화면과 모바일에서 같은 관계를 각각의 배치로 읽을 수 있습니다.
20600 = 5×4096+120이고 페이지 5는 프레임 18로 매핑된다. 따라서 물리주소는 18×4096+120 = 73848이다. 오른쪽 오프셋 120은 그대로다. 두 칸의 너비는 필드 구분이며 주소 전체의 비트 비율을 뜻하지 않는다.
페이지와 프레임 크기가 같아야 내용 전체를 그대로 옮길 수 있다. 페이지 크기가 2^k 바이트라면 주소의 아래 k비트를 오프셋으로 사용할 수 있다. 큰 페이지는 변환표 항목 수와 연속 전송 횟수를 줄일 수 있지만, 실제로 쓰지 않는 페이지 내부 공간과 불필요한 데이터 전송이 늘 수 있다. 작은 페이지는 낭비를 줄일 수 있지만 표와 변환 관리비용이 커진다.
페이지 크기를 4096=2¹²바이트로 정하면 논리주소는 5×4096+120=20600이다. 정수 나눗셈 20600÷4096의 몫 5가 페이지 번호이고 나머지 120이 오프셋이다. 페이지 테이블이 페이지 5를 프레임 18로 매핑하면 물리주소는 18×4096+120=73848이다. 페이지 번호만 5에서 18로 바뀌고 12비트 오프셋은 120으로 유지된다.
페이지 테이블: 페이지 번호를 프레임과 권한으로 바꾼다
페이지 테이블(page table)은 프로세스의 페이지별 변환과 상태를 기록한 표다. 표의 한 칸인 페이지 테이블 항목(Page Table Entry, PTE)은 프레임 번호와 함께 다음과 같은 제어정보를 가질 수 있다.
- 존재 비트(present bit): 해당 페이지가 현재 물리메모리에 있는지 나타낸다.
- 보호 비트(protection bits): 읽기·쓰기·실행 중 허용할 연산을 나타낸다.
- 참조 비트(reference bit): 최근 접근 여부를 교체 판단에 이용할 수 있다.
- 변경 비트(dirty bit): 메모리에 올라온 뒤 내용이 바뀌어 내보낼 때 저장이 필요한지 나타낸다.
논리주소공간이 매우 크면 모든 가능한 페이지의 항목을 한 줄 표로 만들기 어렵다. 다단계 페이지 테이블은 페이지 번호를 여러 부분으로 나누어 실제로 필요한 하위 표만 만든다. 표 메모리를 줄이는 대신 주소 변환 때 여러 단계의 메모리 참조가 생긴다. 어떤 계층과 비트가 실제로 쓰이는지는 프로세서 구조와 운영체제 구현에 따라 다르므로 보편 개념과 특정 구현을 구분한다.
TLB: 최근 주소 변환을 가까이 둔다
변환 색인 버퍼(Translation Lookaside Buffer, TLB)는 최근에 사용한 가상 페이지 → 물리 프레임 변환을 저장하는 작고 빠른 하드웨어 캐시다. TLB 적중(hit)은 필요한 변환이 TLB에 있는 경우이고, TLB 미적중(miss)은 TLB에는 없어서 페이지 테이블을 확인해야 하는 경우다.
TLB 미적중이 곧 페이지 부재는 아니다. 페이지가 물리메모리에 있으나 변환만 TLB에서 밀려났다면 페이지 테이블을 읽고 TLB를 채운 뒤 계속 실행할 수 있다. 반면 페이지 테이블 항목이 부재를 나타내면 페이지 폴트로 운영체제가 개입한다. 파일·교환영역에서 내용을 읽어야 할 수도 있지만, 처음 쓰는 익명 페이지를 0으로 채우거나 이미 메모리에 있는 페이지를 연결하는 복구에는 저장장치 읽기가 필요하지 않을 수 있다.
프로세스를 바꾸면 같은 가상 페이지 번호가 다른 매핑을 뜻할 수 있다. 구현은 프로세스별 주소공간 식별자를 TLB 항목에 붙이거나 필요한 항목을 무효화하여 잘못된 변환 재사용을 막는다. 페이지 테이블을 바꾼 뒤 오래된 TLB 항목을 남기면 보호와 내용 일관성이 깨질 수 있으므로 갱신·무효화 순서가 중요하다.
요구 페이징과 페이지 폴트: 필요한 순간에 가져온다
요구 페이징(demand paging)은 페이지를 실제로 처음 참조할 때 물리메모리에 적재하는 방식이다. 페이지 폴트(page fault)는 페이지 변환이 현재 존재하지 않거나 요청한 접근이 페이지 보호조건을 어겨 CPU가 메모리 접근을 끝내지 못할 때 발생하는 동기적 예외다. 허용된 주소의 내용만 물리메모리에 없는 경우에는 적재 후 재시작할 수 있지만, 주소 범위나 권한이 잘못된 경우에는 적재하지 않고 오류 경로로 보낸다. 따라서 페이지 폴트가 항상 프로그램 오류인 것도, 항상 저장장치에서 페이지를 읽는 사건인 것도 아니다.
처리 순서는 다음과 같다.
- 하드웨어가 현재 명령, 주소와 접근종류를 보존하고 커널의 처리경로로 들어간다.
- 운영체제가 주소 범위·접근종류·매핑 계약을 검사한다. COW처럼 복구하도록 설정한 보호 폴트인지 먼저 구분하고, 실제로 허용되지 않는 접근이면 오류를 전달하여 해당 접근을 완료하지 않는다.
- 허용된 부재나 COW처럼 복구에 새 프레임이 필요하면 빈 프레임을 찾고, 없으면 교체할 프레임을 고른다. 기존 메모리 내용을 재매핑하는 경우에는 불필요한 새 프레임 할당을 생략한다.
- 교체 페이지가 변경되었다면 안전한 저장 위치에 먼저 기록한다.
- 원인에 따라 파일·교환영역에서 읽거나, 새 익명 페이지를 0으로 채우거나, COW의 기존 내용을 새 프레임으로 복사한다. 이미 적재된 내용을 재매핑할 수 있는 경우에는 그 매핑을 준비한다. 모든 폴트가 저장장치 읽기를 거치는 것은 아니다.
- 페이지 테이블과 관련 변환기록을 갱신한 뒤 중단된 명령을 다시 수행한다.
이 과정 중 저장장치 입출력을 기다리는 프로세스는 CPU를 계속 점유하지 않는다. 다른 실행가능 프로세스를 실행할 수 있지만, 폴트가 너무 잦으면 실제 계산보다 적재·교체가 시스템 시간을 지배한다.
페이징과 세그멘테이션은 나누는 기준이 다르다
세그멘테이션(segmentation)은 코드·데이터·스택처럼 프로그램의 논리적 의미와 크기에 따라 주소공간을 가변 길이 구간으로 나누는 방식이다. 세그먼트 주소는 보통 세그먼트 식별자 + 구간 안의 오프셋으로 생각할 수 있고, 각 세그먼트에는 시작 위치·길이·권한을 둔다. 페이징은 의미와 관계없이 고정 크기로 나눈다.
| 축 | 페이징 | 세그멘테이션 |
|---|---|---|
| 분할 단위 | 같은 크기의 페이지 | 의미별 가변 크기 세그먼트 |
| 주소 변환 | 페이지 번호 → 프레임, 오프셋 유지 | 세그먼트 시작주소 + 오프셋, 길이 검사 |
| 배치 | 임의의 빈 프레임에 분산 가능 | 전형적 순수 방식은 크기에 맞는 연속공간 필요 |
| 보호·공유 | 페이지 단위, 의미 경계와 어긋날 수 있음 | 코드·데이터 등 의미 단위로 자연스러움 |
| 대표 단편화 | 마지막 페이지의 내부 단편화 | 빈 구멍이 흩어지는 외부 단편화 |
| 표·관리비용 | 페이지 수와 다단계 구조 | 세그먼트 수와 가변 크기 배치 |
실제 시스템은 논리적 구역을 나누고 각 구역을 다시 페이지로 매핑하는 등 두 생각을 결합할 수 있다. 그러므로 현대 운영체제는 둘 중 정확히 하나만 쓴다고 단정하지 않고, 시험문제의 비교축과 구현 범위를 명시한다.
단편화: 빈 공간의 총량과 쓸 수 있는 모양은 다르다
단편화(fragmentation)는 남은 메모리가 요청을 만족시키는 데 비효율적인 모양으로 나뉜 상태다. 내부 단편화는 할당받은 블록 안에 쓰지 않는 공간이 생기는 현상이다. 고정 크기 페이지에서는 객체나 영역의 끝이 페이지 경계와 맞지 않을 때 마지막 페이지 일부가 남을 수 있다. 외부 단편화는 할당 밖의 빈 공간 총량은 충분하지만 작은 구멍으로 흩어져 큰 연속 요청을 만족하지 못하는 현상이다. 가변 크기 연속 세그먼트 배치에서 대표적으로 나타난다.
단편화를 줄이는 방법은 원인과 함께 고른다.
- 페이지 크기를 작업특성에 맞추고 작은 객체를 한 페이지 안에서 묶어 관리하여 내부 낭비를 줄인다.
- 가변 구간은 빈 공간의 크기별 관리와 병합을 사용하고, 필요하면 살아 있는 구간을 이동해 구멍을 합치는 압축(compaction)을 검토한다. 이동에는 주소 재배치와 일시정지 비용이 든다.
- 큰 연속 물리공간이 꼭 필요하지 않은 일반 메모리는 페이징으로 분산 배치하여 외부 단편화로 인한 문제를 줄인다.
- 큰 페이지는 변환비용을 줄일 수 있으나 내부 낭비와 회수 단위를 키우므로 측정 없이 일괄 적용하지 않는다.
페이징이 단편화가 전혀 없다는 표현은 틀리다. 전형적으로 외부 단편화를 피하지만 내부 단편화와 페이지 테이블·정렬 제약·물리 프레임의 큰 연속성 문제는 남을 수 있다.
지역성과 working set: 최근에 함께 쓰는 페이지를 남긴다
지역성(locality)은 프로그램이 짧은 시간 동안 일부 주소를 반복해서 쓰거나 가까운 주소를 이어서 쓰는 경향이다. 시간상 가까운 재사용을 시간 지역성, 주소상 가까운 접근을 공간 지역성이라고 한다. 반복문의 명령과 배열의 연속 순회가 쉬운 예다.
working set은 정한 최근 관찰구간 동안 한 프로세스가 참조한 서로 다른 페이지의 집합이다. 관찰구간이 너무 짧으면 곧 다시 쓸 페이지를 놓치고, 너무 길면 이미 끝난 작업단계의 페이지까지 포함한다. working set의 크기는 고정된 프로그램 속성이 아니라 입력·실행단계·관찰구간에 따라 변한다.
운영체제는 실제 미래를 알 수 없으므로 참조 비트, 최근 사용정보와 재사용 거리 같은 관측치로 지역성을 근사한다. 여러 프로세스의 활성 working set이 물리 프레임에 함께 들어갈 수 있어야 페이지 폴트를 줄일 수 있다. 이 원리는 특정 교체 알고리즘 하나의 이름보다 더 상위의 용량 판단 기준이다.
페이지 교체: FIFO·최소 최근 사용(Least Recently Used, LRU)·Clock은 미래를 서로 다르게 추정한다
빈 프레임이 없을 때 내보낼 페이지를 고르는 규칙이 페이지 교체 알고리즘(page replacement algorithm)이다. 비교할 때는 폴트 수뿐 아니라 기록·검색비용, 변경 페이지 쓰기비용, 프로세스 간 공정성을 함께 본다.
| 방식 | 정의와 작동원리 | 장점 | 실패·비용 |
|---|---|---|---|
| FIFO | 가장 먼저 들어온 페이지부터 교체 | 큐로 단순 구현, 사용시각 기록 불필요 | 오래 있었어도 자주 쓰는 페이지를 내보냄; 프레임 증가가 오히려 폴트를 늘리는 경우 가능 |
| LRU | 가장 오랫동안 사용되지 않은 페이지를 교체 | 최근 사용이 미래 사용을 나타낸다는 지역성 활용 | 정확한 접근순서 기록·갱신이 비싸고 동시 접근 처리 필요 |
| Clock | 페이지를 원형으로 돌며 참조 비트가 0인 첫 후보를 교체하고, 1이면 0으로 지워 한 번 더 기회를 줌 | LRU의 최근성 생각을 낮은 관리비용으로 근사 | 순환 속도와 부하에 따라 자주 쓰는 페이지도 비트가 지워진 뒤 교체될 수 있음 |
FIFO에서 프레임을 더 줬는데도 특정 참조열의 폴트가 늘 수 있는 현상을 Belady 이상현상이라고 한다. 이는 메모리를 늘리면 어떤 알고리즘에서도 폴트가 반드시 줄어든다는 추론이 틀렸음을 보여 준다. LRU는 이 현상을 피하는 성질이 있지만, 실제 구현은 정확한 LRU 대신 근사법을 쓸 수 있다.
프레임 3개가 처음에는 비어 있고 참조열이 1,2,3,1,4,1이라고 하자. 아래 칸은 물리 프레임 1·2·3의 페이지 번호이며 F는 폴트, H는 적중이다. 빈 칸부터 채우고, 교체 때만 희생 프레임을 덮어쓴다.
| 참조 | FIFO 프레임 | FIFO 판정 | LRU 프레임 | LRU 판정 |
|---|---|---|---|---|
| 1 | (1,−,−) | F | (1,−,−) | F |
| 2 | (1,2,−) | F | (1,2,−) | F |
| 3 | (1,2,3) | F | (1,2,3) | F |
| 1 | (1,2,3) | H | (1,2,3) | H |
| 4 | (4,2,3) | F, 가장 먼저 들어온 1 제거 | (1,4,3) | F, 가장 오래 안 쓴 2 제거 |
| 1 | (4,1,3) | F, 다음 입장순서 2 제거 | (1,4,3) | H |
FIFO는 적중한 1을 입장순서 뒤로 옮기지 않아 총 5회의 페이지 폴트가 발생한다. LRU는 네 번째 참조에서 1의 최근성을 갱신하므로 총 4회의 페이지 폴트가 발생한다. 이 한 참조열은 두 규칙이 어떻게 다르게 움직이는지 보여 주며 모든 부하에서 LRU가 더 낫다는 성능 보증은 아니다.
Clock도 직접 한 바퀴 읽어 보자. 별도의 교육 예제로 세 프레임에 페이지 (1,2,3), 참조 비트 (1,0,1)이 있고 손잡이가 첫 프레임을 가리킨다고 하자. 새 페이지 4가 필요하면 첫 프레임의 비트 1을 0으로 지우고 넘어간다. 둘째 프레임은 비트 0이므로 페이지 2를 내보내 4를 넣고 그 비트를 1로 만든 뒤, 손잡이를 셋째 프레임으로 옮긴다. 결과는 페이지 (1,4,3), 비트 (0,1,1)이다. 비트 1은 정확한 마지막 사용시각이 아니라 최근 참조 표시여서, 손잡이의 위치와 함께 읽어야 한다.
처음 참조 비트가 (1,1,1)이었다면 같은 요청에서 무엇을 내보내는가? 손잡이는 1·2·3의 비트를 차례로 0으로 지운 뒤 첫 프레임을 다시 만나 페이지 1을 교체한다. 페이지 (4,2,3), 비트 (1,0,0), 다음 손잡이는 둘째 프레임이다. 처음부터 비트가 모두 1이니 교체할 수 없다고 답했다면, 한 번 더 기회를 줄 때 비트를 지우고 계속 돈다는 규칙을 앞 과정과 대조한다. 이 예는 다른 접근이 끼어들지 않는 한 번의 교체를 가정한다.
같은 참조열의 다음 한 칸을 직접 채운다
앞의 세 프레임과 참조열 1,2,3,1,4,1을 그대로 실행한 뒤 페이지 2를 한 번 더 참조한다. 다른 접근은 끼어들지 않는다. FIFO와 LRU 각각의 희생 페이지, 물리 프레임 1·2·3의 내용, 누적 폴트 수를 구하라. 자체 제작 연습이며 슬롯 번호와 최근 사용 순서를 섞지 않는다.
다음 참조의 판정과 교정 근거 보기
FIFO는 직전 프레임 (4,1,3)에서 입장순서상 다음 희생자인 3을 제거하여 (4,1,2), 누적 페이지 폴트 수는 6회가 된다. LRU는 (1,4,3)에서 가장 오래 사용하지 않은 3을 제거하여 (1,4,2), 누적 페이지 폴트 수는 5회가 된다. 두 방식이 이번에는 같은 페이지를 제거해도 앞의 참조에서 다른 판단을 했으므로 누적 수는 같지 않다.
“최근 읽은 1도 오래전에 들어왔으니 LRU가 1을 제거한다”는 추론은 적재 시점과 마지막 참조 시점을 혼동한다. FIFO·LRU의 원래 표에서 적중한 1의 FIFO 입장순서는 유지하고 LRU 최근성만 갱신한 부분으로 돌아간다. 이 한 참조열의 결과가 모든 부하에서의 우열이나 실제 커널 구현을 증명하는 것은 아니다.
Thrashing: 실행보다 페이지 이동을 더 많이 하는 상태
스래싱(thrashing)은 활성 작업에 필요한 프레임이 부족하여 페이지 폴트와 교체가 연속되고, 유용한 계산보다 페이지 이동에 더 많은 시간을 쓰는 상태다. CPU 사용률이 낮다는 이유로 프로세스를 더 투입하면 working set 총량이 더 커져 스래싱이 악화될 수 있다. 이는 단순한 CPU 부족이 아니라 메모리 수요와 다중프로그래밍 정도의 불균형이다.
징후는 높은 페이지 폴트율, 지속적인 저장장치 입출력, 낮은 유용 처리량과 긴 응답시간이 함께 나타나는 것이다. 대응은 다음과 같다.
- 프로세스별 폴트율이나 working set을 관찰해 필요한 프레임을 보장한다.
- 전체 수요가 용량을 넘으면 일부 프로세스의 실행을 잠시 줄이거나 중지해 동시에 활성화된 working set을 낮춘다.
- 메모리 누수·무작위 접근·지나치게 큰 데이터구조처럼 지역성을 깨는 프로그램 원인을 개선한다.
- 교체 범위를 프로세스 내부로 제한할지 전체 프레임에서 고를지 정책을 정하고 공정성과 처리량을 함께 측정한다.
교체 알고리즘만 LRU로 바꾸면 항상 해결된다고 볼 수 없다. 실제 working set 합이 물리용량보다 크다면 입장제어·용량·프로그램 접근패턴을 함께 바꿔야 한다.
Copy-on-write: 읽는 동안 공유하고 쓸 때 복사한다
쓰기 시 복사(Copy-on-Write, COW)는 내용이 같은 물리 페이지를 여러 주소공간이 읽기 전용으로 공유하다가, 한쪽이 쓰려고 할 때 그 페이지를 복사하여 별도 매핑으로 바꾸는 기법이다. 처음부터 모든 페이지를 복사하지 않으므로 실제 쓰지 않는 페이지의 복사시간과 메모리를 줄일 수 있다.
작동 순서는 다음과 같다.
쓰기 시 B의 매핑만 새 프레임으로 분리한다 · 상태 따라가기
A와 B가 읽기 전용 X=10을 공유한다. 모든 단계에서 A 매핑·X·B 매핑·Y의 위치를 유지하며 값과 허용 조건을 함께 확인합니다.
넓은 화면과 모바일에서 같은 관계를 각각의 배치로 읽을 수 있습니다.
왼쪽은 A와 B가 같은 읽기 전용 프레임 X의 값 10을 공유하는 상태다. 오른쪽은 B의 쓰기 폴트에서 X를 Y로 복사하고 B만 Y로 재매핑한 뒤 20을 쓴 최종 상태다. A는 X의 10을 유지한다. 점선은 내용 복사와 쓰기의 준비 관계이며 두 프로세스 간 통신이 아니다.
보존한 원 가로 그림 설명의 왼쪽은 위의 쓰기 전 경계, 오른쪽은 아래의 쓰기 완료 후 경계다. A의 가상페이지는 계속 X의 10에 매핑되고 B만 Y의 20으로 분리된다. X→Y 점선은 복사와 쓰기의 준비 관계이며 A나 B 사이의 메시지를 뜻하지 않는다. 복사·재매핑을 쓰기 전에 마쳐야 사적 주소공간의 계약을 지킨다.
이 예의 조건
- 왼쪽은 A와 B가 같은 읽기 전용 프레임 X의 값 10을 공유하는 상태다. 오른쪽은 B의 쓰기 폴트에서 X를 Y로 복사하고 B만 Y로 재매핑한 뒤 20을 쓴 최종 상태다. A는 X의 10을 유지한다. 점선은 내용 복사와 쓰기의 준비 관계이며 두 프로세스 간 통신이 아니다.
- 위 경계에서 프로세스 A와 B의 가상페이지는 읽기 전용 프레임 X의 10으로 각각 매핑된다. 아래 경계에서는 A→X(값 10)을 유지하고 B→Y(값 20)으로 분리된다. 아래 X에서 Y로 가는 점선 복사·쓰기 준비 화살표는 프로세스 간 통신이 아니다. COW 보호 폴트에서 Y를 확보하고 X의 10을 복사한 뒤 B만 Y로 재매핑하며 표와 TLB를 갱신하고 명령을 재시작하여 20을 쓴다. X의 10은 바꾸지 않는다. 원 가로 그림의 왼쪽/오른쪽은 이 모바일 그림의 위/아래 경계에 대응한다.
- 이 원문의 교육용 사례·조건 안에서 상태를 대조합니다. 실제 구축·실험 결과나 원문에 없는 성능 보장을 추가하지 않습니다.
관계도의 보충 설명
| 원 항목 | 설명·조건 |
|---|---|
| 18 | 위 경계에서 프로세스 A와 B의 가상페이지는 읽기 전용 프레임 X의 10으로 각각 매핑된다. 아래 경계에서는 A→X(값 10)을 유지하고 B→Y(값 20)으로 분리된다. 아래 X에서 Y로 가는 점선 복사·쓰기 준비 화살표는 프로세스 간 통신이 아니다. COW 보호 폴트에서 Y를 확보하고 X의 10을 복사한 뒤 B만 Y로 재매핑하며 표와 TLB를 갱신하고 명령을 재시작하여 20을 쓴다. X의 10은 바꾸지 않는다. 원 가로 그림의 왼쪽/오른쪽은 이 모바일 그림의 위/아래 경계에 대응한다. |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 공유 읽기 A와 B가 읽기 전용 X=10을 공유한다. |
|
|
| B 쓰기 fault B 쓰기를 위해 COW 분리가 필요하다. |
|
|
| 복사·재매핑 X를 Y로 복사하고 B 매핑만 Y로 바꾼다. |
|
|
| B 쓰기 완료 같은 B 명령을 재실행하면 Y=20, X=10이다. |
|
|
쓰기 시 B의 매핑만 새 프레임으로 분리한다 · 상태 따라가기
A와 B가 읽기 전용 X=10을 공유한다. 모든 단계에서 A 매핑·X·B 매핑·Y의 위치를 유지하며 값과 허용 조건을 함께 확인합니다.
넓은 화면과 모바일에서 같은 관계를 각각의 배치로 읽을 수 있습니다.
왼쪽은 A와 B가 같은 읽기 전용 프레임 X의 값 10을 공유하는 상태다. 오른쪽은 B의 쓰기 폴트에서 X를 Y로 복사하고 B만 Y로 재매핑한 뒤 20을 쓴 최종 상태다. A는 X의 10을 유지한다. 점선은 내용 복사와 쓰기의 준비 관계이며 두 프로세스 간 통신이 아니다.
보존한 원 가로 그림 설명의 왼쪽은 위의 쓰기 전 경계, 오른쪽은 아래의 쓰기 완료 후 경계다. A의 가상페이지는 계속 X의 10에 매핑되고 B만 Y의 20으로 분리된다. X→Y 점선은 복사와 쓰기의 준비 관계이며 A나 B 사이의 메시지를 뜻하지 않는다. 복사·재매핑을 쓰기 전에 마쳐야 사적 주소공간의 계약을 지킨다.
이 예의 조건
- 왼쪽은 A와 B가 같은 읽기 전용 프레임 X의 값 10을 공유하는 상태다. 오른쪽은 B의 쓰기 폴트에서 X를 Y로 복사하고 B만 Y로 재매핑한 뒤 20을 쓴 최종 상태다. A는 X의 10을 유지한다. 점선은 내용 복사와 쓰기의 준비 관계이며 두 프로세스 간 통신이 아니다.
- 위 경계에서 프로세스 A와 B의 가상페이지는 읽기 전용 프레임 X의 10으로 각각 매핑된다. 아래 경계에서는 A→X(값 10)을 유지하고 B→Y(값 20)으로 분리된다. 아래 X에서 Y로 가는 점선 복사·쓰기 준비 화살표는 프로세스 간 통신이 아니다. COW 보호 폴트에서 Y를 확보하고 X의 10을 복사한 뒤 B만 Y로 재매핑하며 표와 TLB를 갱신하고 명령을 재시작하여 20을 쓴다. X의 10은 바꾸지 않는다. 원 가로 그림의 왼쪽/오른쪽은 이 모바일 그림의 위/아래 경계에 대응한다.
- 이 원문의 교육용 사례·조건 안에서 상태를 대조합니다. 실제 구축·실험 결과나 원문에 없는 성능 보장을 추가하지 않습니다.
관계도의 보충 설명
| 원 항목 | 설명·조건 |
|---|---|
| 18 | 위 경계에서 프로세스 A와 B의 가상페이지는 읽기 전용 프레임 X의 10으로 각각 매핑된다. 아래 경계에서는 A→X(값 10)을 유지하고 B→Y(값 20)으로 분리된다. 아래 X에서 Y로 가는 점선 복사·쓰기 준비 화살표는 프로세스 간 통신이 아니다. COW 보호 폴트에서 Y를 확보하고 X의 10을 복사한 뒤 B만 Y로 재매핑하며 표와 TLB를 갱신하고 명령을 재시작하여 20을 쓴다. X의 10은 바꾸지 않는다. 원 가로 그림의 왼쪽/오른쪽은 이 모바일 그림의 위/아래 경계에 대응한다. |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 공유 읽기 A와 B가 읽기 전용 X=10을 공유한다. |
|
|
| B 쓰기 fault B 쓰기를 위해 COW 분리가 필요하다. |
|
|
| 복사·재매핑 X를 Y로 복사하고 B 매핑만 Y로 바꾼다. |
|
|
| B 쓰기 완료 같은 B 명령을 재실행하면 Y=20, X=10이다. |
|
|
가령 X의 한 위치에 값 10이 있어 A와 B 모두 10을 읽었다고 하자. B의 명령이 그 값을 20으로 바꾸려 하면 먼저 X를 Y로 복사하여 Y에도 10이 있고, B의 매핑만 Y로 바꾼 뒤 명령을 다시 수행해 Y의 값이 20이 된다. 이제 A가 같은 가상 위치를 읽으면 10인가, 20인가? A는 여전히 X에 매핑되어 있으므로 10, B는 Y에서 20을 읽는다. 공유 중인 X를 직접 20으로 바꾸면 A도 영향을 받아 사적 주소공간의 계약을 깨므로, 복사·재매핑이 쓰기보다 먼저 끝나야 한다.
여기서 보호 폴트는 잘못된 프로그램이므로 종료만을 뜻하지 않는다. 운영체제가 COW 계약을 인식하면 정상적인 지연 복사의 계기로 처리한다. 실패조건은 메모리가 부족해 새 프레임을 확보하지 못하는 경우, 공유 페이지를 실수로 쓰기 가능하게 두어 격리가 깨지는 경우, 페이지 테이블을 바꿨는데 오래된 변환기록이 남는 경우다. 쓰기가 집중되면 결국 대부분 복사되므로 COW의 이점도 줄어든다.
가상메모리와 CPU 캐시는 함께 작동하지만 같은 기술이 아니다
CPU 캐시는 CPU와 주기억장치 사이에 최근 또는 가까운 데이터 사본을 작은 고속 저장공간에 두어 접근지연을 줄이는 장치다. 가상메모리도 지역성을 이용하지만 목적·단위·부재 처리주체가 다르다.
| 축 | 가상메모리 | CPU 캐시 |
|---|---|---|
| 주목적 | 주소공간 추상화·격리·보호·물리메모리 배분 | CPU와 주기억장치의 속도차 완화 |
| 대표 단위 | 페이지와 프레임 | 캐시 라인이라는 더 작은 전송 블록 |
| 위치 관계 | 논리주소를 물리주소로 변환 | 물리 또는 가상 주소의 일부로 캐시 위치·태그 확인 |
| 부재 시 | 페이지 폴트로 운영체제 개입과 저장장치 입출력 가능 | 하드웨어가 다음 캐시층이나 주기억장치에서 가져옴 |
| 관리시간 | 상대적으로 긴 운영체제 정책·매핑 수명 | 매우 짧은 하드웨어 접근시간 |
| 공통점 | 지역성을 이용하고 제한된 빠른 공간의 내용을 교체 | 지역성을 이용하고 제한된 빠른 공간의 내용을 교체 |
COW도 CPU 캐시의 복사와 다르다. COW는 여러 주소공간이 한 물리 페이지를 공유하다 쓰기 때 논리적으로 분리하는 운영체제 메모리 기법이고, CPU 캐시는 같은 물리 데이터의 접근속도를 높이는 하드웨어 사본이다. COW로 새 물리 페이지가 생기면 하드웨어는 캐시 일관성 규칙에 따라 각 CPU가 올바른 내용을 보도록 해야 하지만 두 메커니즘의 책임을 섞어 설명하지 않는다.
설계의 긴장을 한 표로 묶는다
| 긴장 | 얻는 것 | 치르는 비용 | 판단 지표 |
|---|---|---|---|
| 작은 페이지 ↔ 큰 페이지 | 내부 낭비·세밀한 회수 ↔ 작은 표·넓은 전송 | 큰 표·TLB 부담 ↔ 불필요 적재·큰 회수단위 | working set, TLB 미스, 폴트·입출력량 |
| 요구 적재 ↔ 선행 적재 | 불필요 적재 최소 ↔ 연속 접근 지연 은폐 | 첫 접근 폴트 ↔ 잘못 예측한 입출력 | 접근패턴·예측정확도·응답시간 |
| 전역 교체 ↔ 지역 교체 | 전체 처리량 기회 ↔ 프로세스별 격리 | 한 프로세스가 타 프로세스 방해 ↔ 빈 프레임 활용 제한 | 공정성·처리량·프로세스별 폴트율 |
| 정확한 최근성 ↔ 근사 최근성 | 낮은 폴트 가능성 ↔ 낮은 기록비용 | 접근마다 메타데이터 갱신 ↔ 잘못된 희생자 | 관리 오버헤드·폴트비용 |
| COW 공유 ↔ 즉시 복사 | 초기 시간·공간 절약 ↔ 예측 가능한 쓰기 | 쓰기 시 폴트·복사 ↔ 사용하지 않을 복사 | 실제 쓰기 비율·지연상한 |
한 지표만 최적화하면 다른 비용이 튈 수 있다. 페이지 폴트 수가 줄어도 큰 페이지로 읽은 바이트와 내부 낭비가 크게 늘 수 있으므로 끝단 응답시간·처리량·메모리·저장장치 부하를 함께 본다.
어디서 실패하는가
| 실패 | 원인·징후 | 결과 | 예방·검증 |
|---|---|---|---|
| TLB 미스와 page fault 혼동 | TLB 기록 부재와 페이지 부재·보호위반을 같은 사건으로 설명 | 비용·처리경로 오답 | TLB→페이지 테이블→존재·권한 비트 순서 도식화 |
| 권한검사 누락 | 존재 여부만 보고 읽기·쓰기·실행 권한 생략 | 격리·보호 위반 | 주소 범위와 연산별 권한을 먼저 검사 |
| 변경 페이지 손실 | dirty 상태 확인 전 프레임 재사용 | 최근 쓰기 유실 | 저장 완료와 매핑 전환 순서 보장 |
| 오래된 변환 재사용 | 페이지 테이블 변경 뒤 TLB 무효화 누락 | 다른 내용·권한으로 접근 | 매핑 갱신과 변환 무효화 프로토콜 검사 |
| 단편화 유형 뒤바꿈 | 고정·가변 분할의 빈 공간 위치를 혼동 | 잘못된 개선책 | 내부는 할당 안, 외부는 할당 밖으로 구분 |
| 교체 알고리즘 만능화 | 실제 working set 합이 용량 초과 | 스래싱 지속 | 폴트율·working set·입장 프로세스 수 함께 통제 |
| COW를 공짜 복제로 오해 | 쓰기 집중·프레임 부족·복사 지연 누락 | 지연 급증·할당 실패 | 쓰기 비율과 최악 폴트 경로 시험 |
| 캐시와 가상메모리 혼동 | 목적·단위·처리주체 구분 없음 | 답안 구조 붕괴 | 주소변환과 데이터 사본 경로를 별도로 작성 |
메모리 관리의 핵심 학습 논점
메모리 관리를 설명할 때는 변환·복구·교체·용량·공유의 관계를 함께 점검한다.
- 논리주소공간과 물리메모리를 페이지 테이블과 TLB로 변환한다.
- 요구 페이징과 page fault의 정상·오류 경로를 구분한다.
- FIFO·LRU·Clock 교체의 원리·비용·실패조건을 비교한다.
- 지역성·working set·스래싱을 용량과 다중프로그래밍 통제로 연결한다.
- 페이징·세그멘테이션·단편화·COW와 CPU 캐시의 경계를 설명한다.
프로세스·스레드·CPU 스케줄링에서 실행흐름을 보았다면, 이 절에서는 그 실행흐름이 독립 주소공간과 공유 페이지를 사용하는 과정을 설명한다.
메모리 관리 논점을 답안으로 연결한다
가상메모리 관리기법과 단편화 통제를 함께 설명할 때는 주소 변환 → 요구 페이징 → 교체 → 내부·외부 단편화와 완화 방법을 연결한다. 페이징과 세그멘테이션을 비교할 때는 고정·가변 분할, 주소 형식, 배치, 보호·공유와 단편화를 같은 축에 놓는다.
아래 문제는 이 연결을 연습하기 위한 자체 제작 문제다. 실제 기출 여부나 확정 출제경향은 공식 원문을 별도로 확인해야 한다.
시험에서는 어떻게 묻는가: 10점
다음은 이 절의 핵심 원리를 압축하는 자체 제작 문제다.
페이징 기반 가상메모리에서 논리주소가 물리주소로 변환되는 과정을 TLB, 페이지 테이블 및 page fault를 중심으로 설명하시오.
세 용어의 정의만 나열하면 부족하다. TLB 적중, TLB 미적중이지만 페이지 존재, 페이지 부재, 권한 위반의 네 경로를 분리하고 정상 경로와 운영체제 개입 경로를 연결해야 한다.
답안 목차·풀이·교정 근거 보기
10점 답안 목차
- 정의와 주소구조
- 주소공간, 논리/물리주소, 페이지·프레임·오프셋
- 빠른 변환경로
- TLB 적중, 미적중 시 페이지 테이블 탐색
- 부재·보호경로
- present·보호 비트, page fault 적재와 명령 재시작
- 성능·실패통제
- TLB 미스/폴트 구분, dirty 쓰기, 오래된 변환 무효화
답안 도식
빠른 주소 변환 도식의 TLB 두 경로와 폴트 복구 도식을 이어서 사용한다. 답안에서는 다음 조건을 빠뜨리지 않는다.
| 변환·접근 조건 | 다음 경로 | 완료 여부 |
|---|---|---|
| TLB 적중, 접근 허용 | 같은 offset으로 물리주소 접근 | 정상 완료 |
| TLB 미적중, PTE 존재·접근 허용 | 변환을 TLB에 채워 물리주소 접근 | 정상 완료; 미스 자체는 폴트가 아님 |
| 허용된 페이지 부재·설정된 COW | 폴트 계약 확인 → 적재·0채움·복사·재매핑 → PTE·TLB 갱신 | 복구 후 명령 재시작 |
| 복구 불가·실제 권한 위반 | 오류 전달 | 해당 접근 미완료 |
TLB에 변환이 있다는 사실만으로 쓰기·실행까지 허용되는 것은 아니다. 정상 경로는 권한검사를 통과한 경우에만 메모리에 접근한다. 폴트 복구 성공은 명령을 다시 시도하는 경로이고, 오류 전달 경로는 정상 접근에 합류하지 않는다.
10점 모범답안
가상메모리는 프로세스의 논리주소를 물리메모리나 뒷받침 저장소에 매핑하여 격리·보호와 필요 시 적재를 제공한다. 페이징 방식은 논리주소를 페이지 번호와 오프셋으로, 물리메모리를 같은 크기의 프레임으로 나눈다. 페이지 번호만 프레임 번호로 바꾸고 오프셋은 유지한다.
CPU는 먼저 최근 변환을 저장한 TLB를 조회한다. 적중하면 권한을 확인해 물리주소를 만들고, 미적중하면 프로세스의 페이지 테이블에서 PTE를 찾는다. 페이지가 물리메모리에 있으면 변환을 TLB에 채우고 접근한다. 따라서 TLB 미적중은 변환기록 부재일 뿐 page fault와 같지 않다.
PTE가 허용된 페이지의 부재를 나타내면 page fault가 발생한다. 운영체제는 주소·권한을 검증하고 빈 프레임 또는 교체대상을 확보한다. 변경된 희생 페이지는 먼저 저장하고 필요한 페이지를 적재한 뒤 페이지 테이블과 TLB를 갱신하여 중단된 명령을 다시 수행한다. 범위 밖 주소나 금지된 쓰기·실행이면 적재하지 않고 오류를 전달한다.
통제점은 dirty 페이지 기록 전 프레임 재사용 금지, 매핑 변경 후 오래된 TLB 항목 무효화, TLB 미스율·page fault율·입출력 지연의 분리 측정이다. 이처럼 빠른 변환과 느린 복구, 보호 위반을 별도 경로로 설명해야 한다.
시험에서는 어떻게 묻는가: 25점
다음은 본문 전체의 개념을 통합해 설명하도록 만든 자체 제작 문제다.
페이징 기반 가상메모리의 주소 변환과 요구 페이징을 설명하고, FIFO·LRU·Clock 페이지 교체를 비교하시오. 페이징과 세그멘테이션의 단편화 유형, working set 기반 스래싱 통제 및 COW 적용 시 유의사항을 제시하시오.
답안은 변환, 교체, 단편화, 부하통제, 공유 최적화를 한 흐름으로 묶어야 한다. 알고리즘 표만 길게 쓰고 page fault 처리와 실패조건을 빼면 시스템 관점이 사라진다.
답안 목차·풀이·교정 근거 보기
25점 답안 목차
- 가상메모리 정의와 구조
- 주소공간, page/frame/offset, PTE·TLB·보호
- 요구 페이징과 교체
- page fault 처리, dirty 기록, FIFO·LRU·Clock 비교
- 분할과 단편화
- 페이징/세그멘테이션, 내부/외부 단편화, 완화책
- 지역성과 과부하 통제
- locality·working set·thrashing, 입장 프로세스·프레임 조정
- 공유·검증
- COW의 읽기 공유/쓰기 복사, TLB·권한·최악 쓰기 경로
- 폴트율·응답시간·입출력·메모리 사용량 검증
25점 전용 답안 도식
주소 변환과 폴트 복구를 공통 경로로 놓고 다음 제어점을 붙인다. PTE에는 frame·권한·present·참조(R)·변경(D)이 있으며, 정상 접근과 보호 오류는 같은 완료 경로에 합류하지 않는다.
| 제어점 | 판단·작동 관계 | 답안에서 연결할 설명 |
|---|---|---|
| 빈 frame 없음 | FIFO·LRU·Clock으로 희생자 선택, dirty면 재사용 전에 기록 | 페이지 교체 → 내용 준비 → PTE·TLB 갱신 → 재시작 |
| 높은 fault율과 I/O | locality·working set 총수요와 물리용량 비교 | 스래싱 통제: 동시 활성 작업·프레임·접근패턴 조정 |
| 빈 공간의 모양 | 할당 안의 낭비와 할당 밖의 구멍 구분 | 내부·외부 단편화와 고정·가변 분할의 관계 |
| 읽기 공유 뒤 사적 쓰기 | 새 프레임 복사·B만 재매핑·명령 재시작 | COW 매핑 도식의 X=10 유지와 Y=20 결과 |
25점 모범답안
가상메모리는 프로세스가 사용하는 논리주소를 물리메모리와 뒷받침 저장소에 매핑하여 독립 주소공간, 보호, 공유와 필요 시 적재를 제공하는 운영체제·하드웨어 협력 메커니즘이다. 페이징은 논리공간을 고정 크기 페이지, 물리메모리를 같은 크기의 프레임으로 나누며 논리주소의 페이지 번호만 프레임 번호로 바꾸고 오프셋은 유지한다. PTE는 프레임 번호, present, 읽기·쓰기·실행 권한, 참조와 dirty 상태를 가진다. TLB는 최근 변환을 캐시하여 다단계 페이지 테이블 탐색비용을 줄인다.
TLB 미스 때 페이지 테이블에 유효한 present 매핑이 있으면 TLB를 채우므로 page fault가 아니다. 허용된 주소의 내용이 없는 부재 page fault가 발생하면 운영체제가 주소·권한을 검사하고 프레임을 확보한다. 빈 프레임이 없으면 희생 페이지를 선택하고 dirty면 먼저 저장한 뒤 필요한 페이지를 적재한다. PTE와 TLB를 갱신하고 중단 명령을 재시작하며, 복구 불가능한 실제 권한 위반 page fault는 페이지를 적재하지 않고 오류로 처리한다.
FIFO는 가장 먼저 들어온 페이지를 큐 순서로 교체해 단순하지만 자주 쓰는 오래된 페이지를 내보내고 Belady 이상현상이 가능하다. LRU는 가장 오래 사용하지 않은 페이지를 골라 지역성을 활용하지만 정확한 순서 기록비용이 크다. Clock은 원형 포인터와 참조 비트로 한 번 더 기회를 주어 LRU를 낮은 비용으로 근사하지만 부하에 따라 최근성을 잘못 추정할 수 있다. 따라서 폴트 수와 함께 메타데이터 갱신, dirty 쓰기, 프로세스 간 공정성을 측정한다.
페이징은 고정 블록을 임의 프레임에 배치하여 전형적 외부 단편화를 피하지만 마지막 페이지 내부 낭비가 생길 수 있다. 세그멘테이션은 코드·데이터 같은 의미별 가변 구간과 길이·권한을 제공하지만 크기에 맞는 연속 구멍이 없어지는 외부 단편화가 생길 수 있다. 페이지 크기 조정과 객체 묶음은 내부 낭비를 줄이고, 빈 구간 병합·필요 시 압축 또는 페이징 결합은 외부 문제를 완화한다. 큰 페이지는 표와 TLB 부담을 줄이는 대신 내부 낭비와 불필요 적재를 키울 수 있다.
지역성은 짧은 기간 일부·인접 주소를 반복 사용하는 경향이고, working set은 최근 관찰구간의 참조 페이지 집합이다. 활성 프로세스의 working set 합이 물리용량을 넘으면 page fault와 입출력이 계산을 압도하는 스래싱이 생긴다. 프로세스별 폴트율과 working set을 관찰해 프레임을 조정하고, 총수요가 크면 동시 활성 프로세스를 줄이며, 지역성을 해치는 접근패턴을 개선한다. 교체 알고리즘 변경만으로 실제 용량부족을 숨기지 않는다.
COW는 같은 물리 페이지를 읽기 전용으로 공유하고 한 프로세스가 쓸 때 보호 폴트를 이용해 새 프레임으로 복사·재매핑한다. 초기 복사를 줄이지만 쓰기 집중 시 폴트와 복사비용이 커지고 새 프레임 부족, 잘못된 쓰기권한, TLB 무효화 누락이 실패요인이다. CPU 캐시는 작은 캐시 라인으로 주기억장치 접근지연을 줄이는 하드웨어 사본이고, COW·가상메모리는 페이지 수준 주소·보호 관리이므로 구분한다. 검증은 권한 위반, TLB 미스와 폴트, dirty 교체, 프레임 부족, 순차·무작위 참조, COW 쓰기폭주를 포함하고 page fault율·입출력량·응답시간·유용 처리량·메모리 사용량을 함께 측정한다.
근거와 현행성
프로세스 주소공간과 메모리 객체의 공유·사적 매핑 경계는 IEEE/The Open Group의 The Open Group Base Specifications Issue 8 중 mmap() 명세와 대조했다. 다단계 페이지 테이블, 메모리 관리 장치(Memory Management Unit, MMU)·TLB·page walk·page fault 및 현행 Linux의 페이지 회수 구현 사례는 Linux Kernel Documentation의 Page Tables와 Multi-Gen LRU를 각각 별도 동결해 확인했다. working set·지역성·스래싱의 역사적 이론은 P. J. Denning의 The Working Set Model for Program Behavior, DOI 10.1145/363095.363141의 저자 공개본을 대조했다. 기준 확인일은 2026-09-01이다.
POSIX는 이식 가능한 응용 인터페이스 경계, Linux 문서는 한 현행 구현 사례, Denning 논문은 안정 이론의 원전 후보로 구분했다. 본문의 표·도식·예시와 답안은 원문 문장·표·그림을 옮기지 않고 독자 구성했다. Linux 문서는 rolling이므로 특정 커널 릴리스의 영구 보증으로 해석하지 않는다.
| 논점 | 담당 내용 | 근거 경계 |
|---|---|---|
| 주소 변환 | 주소 변환·페이지 테이블·TLB의 관계 | POSIX Issue 8의 mmap()은 주소공간–메모리 객체 인터페이스 경계, Linux Page Tables는 페이지 테이블·MMU·TLB의 구현 사례 |
| 폴트와 교체 | 요구 적재, page fault와 교체 경로 | Linux Page Tables와 Linux Multi-Gen LRU의 별도 동결 문서를 안정 이론과 구분하여 사용 |
| 지역성과 용량 | 지역성·working set·thrashing 관계 | Denning의 1968년 논문은 역사적 안정 이론, Linux Multi-Gen LRU는 별도 현행 구현 사례이며 둘을 동일시하지 않음 |
30초 정리
- 가상메모리는 페이지 번호를 프레임 번호로 바꾸며, TLB는 변환을 빠르게 하고 페이지 테이블은 매핑·존재·권한을 기록한다.
- TLB 미스와 page fault를 구분하고, 부재 시 검증→프레임 확보→dirty 기록→적재→매핑 갱신→재시작 순서를 설명한다.
- FIFO·LRU·Clock은 지역성을 서로 다르게 근사하며, working set 합이 용량을 넘으면 스래싱을 교체정책만으로 해결할 수 없다.
- 페이징/세그멘테이션의 내부·외부 단편화, COW의 쓰기 경로와 CPU 캐시의 목적 차이를 실패조건까지 함께 쓴다.
다음 절에서는 이 메모리와 장치가 프로그램에 어떻게 노출되는지, 소스코드가 실행파일이 되어 시스템콜·인터럽트·파일·프로세스 간 통신을 거치는 전체 시스템 프로그래밍 경로를 살펴본다.