Foundry
운영체제
중급
핵심

가상 메모리

물리 메모리보다 큰 주소 공간 제공

가상 메모리

실제 물리 메모리보다 큰 메모리 공간을 프로세스에게 제공하는 기법

왜 필요한가?

물리 메모리: 8GB
프로세스 A: 4GB 요청
프로세스 B: 4GB 요청
프로세스 C: 4GB 요청 ← 메모리 부족!

가상 메모리:
각 프로세스: 4GB 가상 공간
실제로는 필요한 부분만 물리 메모리에
나머지는 디스크(Swap)에 저장

동작 원리

[가상 주소]     [페이지 테이블]   [물리 메모리]
Page 0  ──────→ Frame 3
Page 1  ──────→ Frame 1
Page 2  ──────→ (디스크)  ← 페이지 폴트!
Page 3  ──────→ Frame 7
용어설명
페이지가상 메모리 단위 (보통 4KB)
프레임물리 메모리 단위
페이지 테이블가상→물리 매핑
TLB페이지 테이블 캐시

주소 변환 과정

가상 주소: [페이지 번호|오프셋]
          ↓
TLB 확인 (캐시)
  → 히트: 바로 물리 주소
  → 미스: 페이지 테이블 조회
          ↓
물리 주소: [프레임 번호|오프셋]

프로세스 격리

프로세스 A의 가상 주소 0x1000
  → 물리 주소 0x5000

프로세스 B의 가상 주소 0x1000
  → 물리 주소 0x8000 (다른 곳!)

→ 각 프로세스는 독립된 메모리 공간
→ 서로의 메모리에 접근 불가 (보안!)

장점과 비용

장점비용
물리보다 큰 메모리 사용주소 변환 오버헤드
프로세스 격리 (보안)페이지 폴트 시 느림
메모리 공유 (라이브러리)페이지 테이블 메모리
스왑으로 유연한 관리스왑 과다 → Thrashing

Thrashing

물리 메모리 부족 → 페이지 폴트 빈발
→ 디스크 I/O 폭증 → CPU 이용률 급락
→ OS가 프로세스 추가 → 더 악화!

해결: 메모리 추가, 프로세스 줄이기
면접에서 이렇게 나옵니다

Q.가상 메모리란 무엇이고 왜 필요한가요?

프로세스가 자기만의 연속된 주소 공간을 갖는 것처럼 보이게 하는 기법입니다. 실제 물리 메모리는 조각나 있어도 됩니다.

얻는 것내용
격리다른 프로세스의 메모리를 볼 수 없다
물리 메모리보다 큰 공간안 쓰는 부분은 디스크에 둔다
단편화 해소물리적으로 흩어져 있어도 연속으로 보인다
공유같은 라이브러리를 한 벌만 두고 여러 프로세스에 연결한다
지연 할당실제로 쓸 때 물리 메모리를 붙인다

주소 변환은 페이지 테이블이 담당하고, MMU 라는 하드웨어가 매 접근마다 변환합니다.

흔한 실수: 가상 메모리를 스왑과 같은 말로 쓰는 것. 스왑은 가상 메모리가 가능하게 한 기능 중 하나이고, 스왑을 전혀 안 써도 가상 메모리는 격리와 공유를 위해 필요합니다.

Q.페이지 테이블의 역할과 TLB의 관계는?

페이지 테이블은 가상 주소를 물리 주소로 바꾸는 표이고, TLB 는 그 표의 캐시입니다.

가상 주소 -> 페이지 테이블 조회 -> 물리 주소

문제는 페이지 테이블도 메모리에 있다는 것입니다. 그러면 메모리 접근 한 번에 조회가 두 번 듭니다. TLB 는 최근 변환 결과를 담아 이 반복을 없앱니다.

상황비용
TLB 적중변환이 사실상 공짜
TLB 실패페이지 테이블을 읽어야 한다
다단계 테이블에서 실패단계 수만큼 메모리를 읽는다

문맥 교환의 숨은 비용이 여기 있습니다. 프로세스가 바뀌면 주소 공간이 달라져 TLB 항목이 무효화되고, 한동안 실패가 이어집니다. 스레드 전환은 주소 공간이 같아 이 비용이 없습니다.

흔한 실수: TLB 를 데이터 캐시와 혼동하는 것. TLB 는 주소 변환 결과를 담고 데이터를 담지 않습니다.

Q.가상 메모리가 프로세스 격리를 어떻게 보장하나요?

프로세스마다 자기 페이지 테이블을 가지므로, 그 표에 없는 물리 메모리에는 접근할 방법이 없습니다.

프로세스 A 의 주소 0x1000 -> 물리 0x8000
프로세스 B 의 주소 0x1000 -> 물리 0x3000
같은 가상 주소가 다른 물리 위치를 가리킨다

A 가 아무리 주소를 바꿔가며 접근해도 자기 페이지 테이블에 매핑된 범위 밖으로는 나갈 수 없습니다. 매핑이 없는 주소를 건드리면 예외가 나고 커널이 프로세스를 종료합니다.

여기에 접근 권한 비트가 더해집니다. 읽기 전용, 실행 금지 같은 표시가 페이지마다 있어, 코드 영역에 쓰거나 데이터 영역을 실행하려 하면 막힙니다.

흔한 실수: 격리를 소프트웨어 검사로 설명하는 것. 매 접근마다 코드로 확인하면 너무 느립니다. MMU 라는 하드웨어가 변환과 권한 확인을 함께 합니다.

Q.Thrashing이란 무엇이고 어떻게 해결하나요?

페이지를 밀어냈다가 곧바로 다시 부르는 일이 반복되어, CPU 는 한가한데 아무 일도 진행되지 않는 상태입니다.

메모리가 부족하다
A 가 쓸 페이지를 올리려고 B 의 페이지를 밀어낸다
B 가 그 페이지를 다시 부른다. 이번엔 A 의 것을 밀어낸다
서로 밀어내기만 반복한다
신호
디스크를 읽는 폴트초당 수천 이상
스왑 입출력지속적으로 발생
CPU 사용률낮다
응답 시간무너진다

CPU 가 낮은 것이 특징입니다. 대부분의 시간을 디스크 대기로 보내기 때문입니다. 이때 "CPU 가 남으니 프로세스를 더 띄우자"고 하면 상황이 악화됩니다.

해결방법
동시 실행 수를 줄인다일부 프로세스를 잠시 중단한다
메모리 사용을 줄인다캐시 크기, 힙 상한 설정을 낮춘다
메모리를 늘린다근본 해결

흔한 실수: 폴트 총량만 보고 판단하는 것. 디스크를 읽지 않는 폴트는 정상 동작이라 총량은 쉽게 커집니다. 스왑 입출력과 응답 시간을 함께 봐야 합니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

더 깊이 공부하기

읽었으면 문제로 확인해보세요

운영체제 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.