pagingaddress-space

Virtual Memory를 설명해주세요

면접 출제
예상 시간
7
30초 답변

꼬리질문

조금 더 깊게 물어본다면

답변 뒤에 이어질 수 있는 질문들을 하나씩 열어볼 수 있어요.

가상 메모리의 핵심 이점은 무엇인가요?

부가 설명

필요한 이유

RAM은 물리적으로 하나의 덩어리입니다. Chrome, VS Code, 터미널 — 모든 프로세스가 그 안에 함께 올라가야 합니다. 프로세스마다 별도의 RAM 칩이 있는 게 아닙니다.

가상 메모리가 없으면 프로세스들이 이 하나의 공간을 물리 주소 그대로 나눠 씁니다. Chrome이 코드 버그로 VS Code 영역의 물리 주소에 뭔가를 써버려도 CPU는 막을 방법이 없습니다. "이 주소가 누구 거야?"를 알지 못하기 때문입니다.

"그럼 접근할 때마다 검사해서 막으면 되지 않나?"라고 생각할 수 있습니다. 실제로 초기 방식이 그랬는데, 두 가지 문제가 있습니다. 메모리 접근이 초당 수십억 번 일어나는데 매번 소프트웨어 검사를 거치면 너무 느립니다. 더 근본적인 문제는 프로세스를 다른 물리 주소로 옮겨야 할 때입니다. Chrome 내부에는 수백만 개의 포인터가 있는데, 이게 전부 틀린 주소가 됩니다. 어떤 값이 포인터이고 어떤 값이 그냥 정수인지 구분할 수 없어 전부 고치는 것 자체가 불가능에 가깝습니다.

가상 메모리는 검사로 막는 게 아니라 Chrome이 VS Code의 물리 주소를 표현조차 못 하게 만드는 구조입니다. Chrome은 가상 주소만 알고, 그 가상 주소 공간 안에 VS Code 영역으로 가는 경로가 애초에 존재하지 않습니다.

동작 방식

page table은 가상 주소와 물리 주소의 매핑을 담은 목차입니다. OS가 프로세스마다 하나씩 만들어 관리합니다. MMU(Memory Management Unit)는 CPU 안에 내장된 하드웨어로, CPU가 메모리에 접근할 때마다 page table을 읽어 실제 물리 주소로 변환합니다.

비유하자면 가상 주소는 층 번호, 프로세스는 건물, page table은 건물마다 있는 층 안내도입니다. Chrome 3층과 VS Code 3층은 층 번호가 같아도 건물이 다르니 전혀 다른 공간입니다. 같은 가상 주소여도 프로세스가 다르면 각자의 page table이 다른 물리 주소로 안내합니다.

Chrome의 page table:  가상 0x400000  →  물리 0xA000
VS Code의 page table: 가상 0x400000  →  물리 0xF000

프로세스를 물리적으로 다른 위치로 옮겨야 할 때도 page table의 숫자만 바꾸면 됩니다. Chrome 내부의 포인터들은 여전히 가상 주소를 가리키고 있어 그대로 유효합니다. 물리 위치가 바뀌어도 Chrome은 자기가 옮겨진 줄 모릅니다.

swapping은 부가 기능

많은 사람이 가상 메모리를 "RAM이 부족할 때 디스크를 쓰는 것"으로 알고 있는데, 그건 가상 메모리의 부가 기능(swapping)이지 핵심 목적이 아닙니다.

RAM이 충분해도 가상 메모리는 필요합니다. 프로세스 격리, 주소 공간 독립성, 보안(ASLR) 같은 기능이 swapping과 무관하게 동작하기 때문입니다.

하지만 page fault가 자주 발생하면 성능이 크게 떨어질 수 있습니다. working set이 RAM에 잘 올라와 있지 않으면 disk I/O가 병목이 됩니다.

한 줄 정리

virtual memory는 process별 독립 address space를 제공하고, OS가 virtual address를 physical memory로 매핑하는 구조입니다.