티스토리 뷰
메모리
CPU가 데이터에 접근하기 위해 생성하는 메모리 주소를 논리 주소, 메모리 레지스터에 실제 전달되는 값을 실제 주소라고 한다.
논리 주소를 물리 주소로 변경하는 일은 MMU(Memory Management Unit)가 담당한다.
동적 로딩 (Dynamic Loading)
- 작업에 필요한 코드의 일부분(루틴)만을 메모리에 동적으로 로드하는 것을 말한다.
- 메모리 효율성을 높일 수 있다.
- OS에서 라이브러리를 제공하는 경우가 있다.
Dynamic Linked Libraries (DLL)
- 실행 중에 동적으로 링킹되는 라이브러리를 DLL 또는 공유 라이브러리라고 한다.
- 실행 이미지의 사이즈를 줄이고, 메모리를 효율적으로 사용할 수 있다.
- OS의 관여가 필요하다.
연속적 메모리 할당
한 프로세스를 연속적인 메모리 영역에 모두 로드하는 방법이다.
메모리 할당과 해제를 반복하면 아무 프로세스도 로드되어 있지 않은 빈 공간인 hole이 생긴다. hole에 프로세스를 할당하는 방법은 다음과 같다.
- First fit: hole이 원하는 크기보다 크면 바로 할당한다.
- Best fit: hole이 원하는 크기와 차이가 가장 작으면 할당한다.
- Worst fit: 가장 큰 hole을 할당한다.
Worst fit은 직관적으로 이해하기 어렵지만, 할당 후에도 가장 큰 여유 공간을 남기기 위한 방법이다.
Fragmentation (단편화)
1. External Fragmentation (외부 단편화)
연속적 메모리 할당/해제를 반복하면 결국 메모리 공간이 여러 hole로 나뉘는데, 이를 외부 단편화라고 한다. 전체 남는 공간을 합치면 프로세스를 실행할 수 있음에도 불구하고, 각 공간의 크기가 너무 작아서 할당하지 못하는 상황이 발생한다.
2. Internal Fragmentation (내부 단편화)
메모리를 매우 작은 단위(예: 1byte)로 관리하면 오버헤드가 너무 커진다. 이를 해결하기 위해 일정 block 단위로 메모리를 관리하게 되는데, 프로세스가 필요한 양보다 block 크기의 배수로 더 많이 할당받으면서 남게 되는 내부 공간을 내부 단편화라고 한다.
페이징 (Paging)
메모리를 고정된 크기의 block으로 다루면 외부 단편화를 해결할 수 있다. 실제 메모리 block을 frame, 논리 주소 공간에서의 단위를 page라고 부른다.
MMU는 논리 주소에서 페이지 번호를 찾고, 페이지 테이블에서 해당하는 frame 번호를 찾아 실제 주소로 변환한다.
- OS는 각 프로세스에 대해 페이지 테이블 카피본을 유지해야 하므로 컨텍스트 스위칭 비용이 증가한다.
페이지 테이블 하드웨어
1. 레지스터로 관리
접근은 빠르지만 컨텍스트 스위치 시 모든 레지스터 값을 변경해야 하며, 페이지 테이블 사이즈가 크면 구현이 불가능하다.
2. 메모리로 관리
페이지 테이블을 메모리에 올리고 그 시작 주소를 레지스터(PTBR)에 저장한다. 컨텍스트 스위치 시 레지스터 값 하나만 교체하면 되지만, 메모리 접근 오버헤드가 커진다. 테이블 크기 제한을 위해 PTLR 레지스터도 함께 사용한다.
TLB: Translation Look-Aside Buffer
key에 대해 병렬 검색을 수행하는 특수한 고속 하드웨어다. 페이지 테이블의 일부 엔트리를 캐싱하며, ASID를 통해 여러 프로세스의 정보를 동시에 관리할 수 있다. TLB hit 비율이 높을수록 주소 변환 효율이 극대화된다.
페이지 테이블의 구조
논리 주소 공간이 \( 2^{32} \)인 환경을 가정해 보자. 페이지 크기가 \( 4\text{KB} (2^{12}\text{B}) \)라면 페이지 엔트리는 약 \( 2^{20} \)개(100만 개)가 된다. 각 엔트리가 \( 4\text{B} \)라면 페이지 테이블 하나당 약 \( 4\text{MB} \)를 차지하며, 프로세스가 1024개만 되어도 \( 4\text{GB} \)의 오버헤드가 발생한다. 이를 줄이기 위해 다음과 같은 구조가 사용된다.
1. 계층적 페이지 테이블 (Hierarchical Paging)
페이지 테이블을 여러 레벨로 나눈다. 예를 들어 1레벨 테이블은 2레벨 테이블의 위치를 가리킨다. 사용하지 않는 메모리 영역은 테이블을 생성하지 않고 invalid 처리하여 공간을 절약한다. 단, 레벨 \( k \)에 대해 \( k \)번의 메모리 접근이 필요하여 현대 64bit 환경(약 7레벨 필요)에서는 효율이 떨어진다.
2. 해시 페이지 테이블 (Hashed Page Table)
페이지 번호를 key로, (페이지 번호, 프레임 번호) 리스트를 value로 하는 해시 테이블을 사용한다. 64bit 환경에서는 여러 페이지를 클러스터로 묶어 관리하는 Clustered 페이지 테이블 방식을 주로 사용한다.
3. 뒤집힌 페이지 테이블 (Inverted Page Table)
메모리 프레임당 하나의 엔트리를 가지며, 각 엔트리에는 (프로세스 ID, 페이지 번호)를 저장한다. 시스템 전체에 테이블이 하나만 존재하므로 공간 효율은 좋으나, 특정 페이지를 찾기 위한 검색 시간이 오래 걸려 주로 해시 테이블과 병행하여 사용한다.
'운영 체제' 카테고리의 다른 글
| 대용량 저장 장치 (0) | 2026.04.02 |
|---|---|
| 가상 메모리 (0) | 2026.04.02 |
| 라이브락 & 데드락 (0) | 2026.04.02 |
| 동기화 문제와 해결책 예시 (0) | 2026.04.02 |
| 동기화 (0) | 2026.04.02 |