Virtual Memory에 대한 아키텍처 동작방법

🎓 미래의 컴퓨터 과학자 여러분, 환영합니다! 오늘 우리는 운영체제에서 가장 기본적이면서도 종종 신비롭게 느껴지는 개념 중 하나인 가상 메모리(Virtual Memory)의 베일을 벗겨볼 거예요.

컴퓨터의 RAM을 "작업 책상"이라고 생각해보세요. 현재 활발히 사용하는 것들을 올려두는 곳이죠. 그런데 책상이 너무 어질러지고, 거대한 프로젝트를 진행하거나 여러 작업을 동시에 해야 한다면 어떻게 될까요? 바로 이때 가상 메모리가 빛을 발합니다. 마치 초스마트 서류 캐비닛과 효율적인 개인 비서가 하나로 합쳐진 것처럼요! ✨

🎭 위대한 환상: 가상 메모리란 무엇인가?

대용량 영상 편집이나 복잡한 시뮬레이션처럼, 컴퓨터의 물리적 RAM 용량을 초과하는 메모리가 필요한 거대한 프로젝트가 있다고 상상해보세요. 가상 메모리가 없다면, 여러분은 꼼짝없이 막혀버릴 거예요. 가상 메모리는 프로그램에게 환상을 만들어줌으로써 이 문제를 해결합니다. 실제 설치된 RAM보다 훨씬 큰, 광대하고 연속적인 메모리 공간에 접근할 수 있다고 믿게 만드는 거죠.

이건 마법이 아니에요. 운영체제(OS)와 컴퓨터 하드웨어가 관리하는 영리한 기술입니다. 물리적 RAM과 더 느리지만 훨씬 용량이 큰 저장장치(SSD나 하드 드라이브)의 전용 공간을 매끄럽게 조합해요. 덕분에 RAM만으로는 불가능했을 더 많은 애플리케이션 동시 실행과 훨씬 대용량의 데이터셋 작업이 가능해집니다. 🚀

🧱 기본 구성 요소: 페이지와 프레임

이 환상이 어떻게 구축되는지 이해하려면, 메모리가 어떻게 관리되는지 생각해봐야 합니다.

📍가상 주소 공간 (Virtual Address Space): 실행하는 모든 프로그램은 가상 주소 공간이라고 불리는 자신만의 "전용" 메모리 영역을 부여받습니다. 프로그램 입장에서 이 공간은 주소 0부터 시작해서 올라가는 하나의 연속된 메모리 블록처럼 보여요. CPU는 프로그램이 데이터를 읽거나 쓸 때 이 가상 주소를 생성합니다.
📄페이지 (Pages): 운영체제는 이 가상 주소 공간을 페이지라고 불리는 고정 크기 덩어리로 나눕니다. 가상 서류 캐비닛의 개별 파일이나 문서라고 생각하면 돼요. 일반적인 페이지 크기는 4KB 또는 8KB입니다.
🖥️물리 메모리(RAM)와 프레임 (Frames): 컴퓨터의 물리적 RAM도 페이지와 정확히 같은 크기의 블록으로 나뉩니다. RAM에 있는 이 블록들을 프레임이라고 불러요. 따라서 프로그램 가상 주소 공간의 페이지는 물리 RAM의 사용 가능한 어떤 프레임에든 로드될 수 있습니다.
📋페이지 테이블 (Page Table): OS는 어떤 가상 페이지가 어떤 물리 프레임에 있는지 어떻게 추적할까요? 페이지 테이블을 사용합니다. OS가 관리하는 핵심 데이터 구조로, 디렉토리나 지도 역할을 해요. 프로그램의 각 가상 페이지에 대해, 해당 페이지가 현재 위치한 RAM의 물리 프레임 번호를 저장합니다. 페이지가 RAM에 전혀 없으면, 페이지 테이블 항목이 그것을 표시합니다.

⚙️ 프로세스: 데이터가 이동하는 방식

프로그램이 특정 가상 주소의 데이터에 접근해야 할 때, 일반적으로 다음과 같은 일이 일어납니다.

✅ 정상 경로 (Happy Path)

1요청: CPU가 필요한 데이터의 가상 주소를 생성합니다.
2변환: 이 가상 주소가 MMU(Memory Management Unit)라는 특수 하드웨어 컴포넌트로 전송됩니다.
3MMU가 페이지 테이블 조회: MMU가 프로그램의 페이지 테이블에서 가상 주소를 조회합니다.
4RAM에서 발견! 가상 주소를 포함한 페이지가 현재 물리 RAM에 있으면, 페이지 테이블에 올바른 물리 프레임을 가리키는 항목이 있습니다. MMU가 가상 주소를 물리 주소로 변환하고, CPU는 RAM에서 직접 데이터에 접근할 수 있어요. 이게 가장 빠른 시나리오입니다! ⚡

그런데 페이지가 RAM에 없으면 어떻게 될까요? 바로 여기서 흥미로운 일이 벌어집니다! 🤔

⚠️ 페이지 폴트! (Page Fault)

🚨 페이지 폴트: MMU가 페이지 테이블을 확인했는데 필요한 가상 페이지가 현재 RAM의 어떤 물리 프레임에도 로드되어 있지 않다면, 페이지 폴트를 트리거합니다. 서류 캐비닛을 뒤졌는데 특정 파일이 없는 것과 같아요. 예상한 위치에 파일이 없는 거죠!

1OS 개입: 페이지 폴트는 운영체제에 신호를 보내는 인터럽트입니다. OS가 제어권을 가져와 폴트를 일으킨 프로그램을 일시 중지하고 상황을 처리합니다.
2데이터 스와핑 (페이징 인/아웃):
• OS가 먼저 누락된 페이지를 찾습니다. RAM에 없으므로 디스크의 스왑 파일(또는 페이지 파일/스왑 공간)에 저장되어 있어야 해요.
• RAM이 가득 찼다면, OS는 공간을 만들어야 합니다. LRU(Least Recently Used) 같은 전략을 사용해 한동안 접근되지 않았고 지금은 "덜 중요하다"고 판단되는 RAM의 페이지를 선택해요.
• 선택된 페이지는 스왑 아웃됩니다. 내용이 RAM에서 디스크의 스왑 파일로 기록돼요.
• RAM의 프레임이 비면, OS는 필요한 페이지를 스왑 파일에서 해당 프레임으로 스왑 인합니다.
3업데이트 및 재개: OS가 페이지의 새 위치를 반영하도록 페이지 테이블을 업데이트합니다 (가상 페이지가 이제 방금 로드된 물리 프레임에 매핑됨). 마지막으로 OS는 페이지 폴트를 일으킨 명령어를 재시작해요. 이번에는 MMU가 가상 주소를 조회할 때 페이지 테이블이 현재 RAM에 있는 페이지를 올바르게 가리키고, 프로그램은 아무 일도 없었던 것처럼 계속됩니다. 😌

💡 요구 페이징 (Demand Paging): 이 전체 과정을 종종 요구 페이징이라고 부릅니다. 페이지는 실제로 필요할 때만, 요구에 따라 디스크에서 RAM으로 로드됩니다.

🎛️ 지휘자: MMU (Memory Management Unit)

MMU는 가상 메모리 관리에서 CPU의 필수적인 조력자입니다. CPU와 물리 메모리 사이에 위치한 하드웨어 컴포넌트예요. 단계별 역할을 살펴볼까요?

1가상 주소 수신: CPU가 메모리에 접근(읽기 또는 쓰기)해야 할 때마다 가상 주소를 MMU로 보냅니다.
2TLB 확인 (1차 조회): 속도를 높이기 위해 MMU는 보통 TLB(Translation Lookaside Buffer)라는 작고 매우 빠른 캐시를 가지고 있어요. TLB는 최근 가상-물리 주소 변환을 저장합니다. MMU는 먼저 이 가상 주소의 변환이 이미 TLB에 있는지 확인해요.
TLB 히트: 있으면 MMU는 즉시 TLB에서 물리 주소를 가져와 메모리 컨트롤러로 전달합니다. 엄청 빨라요! ⚡
TLB 미스: 변환이 TLB에 없으면 MMU는 다음 단계로 진행합니다.
3페이지 테이블 접근: MMU가 현재 프로세스의 페이지 테이블(OS가 관리)에 접근합니다. 이 테이블 자체가 RAM에 있을 수 있어요.
4물리 프레임 찾기: MMU가 가상 주소의 일부를 사용해 페이지 테이블을 인덱싱하고 해당 페이지에 대응하는 항목을 찾습니다.
5페이지 폴트 확인: MMU가 페이지 테이블 항목을 검사합니다.
유효한 항목: 페이지가 RAM에 있음을 나타내면 MMU가 물리 프레임 번호를 추출합니다.
유효하지 않은 항목 (페이지 폴트): 페이지가 RAM에 없음을 나타내면(또는 보호 위반이 있으면) MMU가 CPU에 페이지 폴트 인터럽트를 트리거합니다.
6물리 주소 생성: 페이지가 유효하고 RAM에서 찾아지면, MMU가 물리 프레임 번호(페이지 테이블에서)와 페이지 내 오프셋(가상 주소에서)을 결합해 최종 물리 주소를 형성합니다. 이 물리 주소가 메모리 컨트롤러로 전송돼요.
7메모리 보호: 이 과정에서 MMU는 접근 권한도 확인합니다 (예: 이 프로그램이 이 페이지에 쓸 수 있나?). 프로그램이 접근해서는 안 되는 메모리(다른 프로그램의 메모리나 쓰기 시도하는 읽기 전용 페이지 등)에 접근하려 하면, MMU가 이 위반을 감지하고 오류를 생성합니다. 종종 "세그멘테이션 폴트" 등으로 프로그램이 종료되는 경우가 이에 해당해요. 🛡️
8TLB 업데이트: MMU가 물리 주소를 성공적으로 찾았다면(폴트가 아니었다면), 더 빠른 향후 접근을 위해 이 새 변환으로 TLB를 업데이트할 수 있습니다.

페이지 폴트가 발생하면(5단계, 유효하지 않은 항목), MMU의 역할은 OS에 신호를 보내는 것입니다. 그러면 OS가 디스크에서 페이지를 찾고, 필요하면 페이지를 스와핑하고, 페이지 테이블을 업데이트하는 복잡한 작업을 수행해요. OS가 상황을 해결하면, 본질적으로 MMU에게 "그 주소 변환을 다시 시도해봐"라고 말합니다. 이번에는 페이지 테이블이 업데이트되어 있고, MMU는 유효한 물리 주소를 찾게 됩니다. 🔄

💾 저장소: RAM이 가득 차면 데이터는 어디로?

중요한 점이 있어요. 가상 메모리는 그 자체로 데이터를 "저장"하지 않습니다. RAM과 디스크 사이의 데이터 저장을 관리하는 시스템이에요.

물리 RAM이 가득 차면, 프로그램의 가상 주소 공간에 속하는 비활성 데이터가 저장 드라이브(SSD 또는 HDD)의 특별한 영역에 기록됩니다. 이 영역은 흔히 다음과 같이 불려요:

🪟Windows: 스왑 파일 (Swap File) 또는 페이지 파일 (Page File)
🐧🍎Linux/macOS: 스왑 공간 (Swap Space) 또는 스왑 파티션 (Swap Partition)

이 스왑 공간은 RAM의 오버플로우 역할을 합니다. RAM보다 훨씬 느리기 때문에 과도하게 사용하면 컴퓨터가 상당히 느려질 수 있어요. 하지만 이것 없이는 오늘날의 많은 강력한 애플리케이션을 실행하거나 효과적으로 멀티태스킹을 할 수 없습니다. 🐢➡️🐇

⚖️ 장점과 단점

👍 장점

더 많은 프로그램 실행: 물리적으로 사용 가능한 것보다 더 많은 메모리를 효과적으로 사용할 수 있습니다.
더 큰 프로그램 실행: 시스템이 보유한 것보다 더 많은 RAM을 요구하는 애플리케이션을 실행할 수 있습니다.
메모리 보호: 프로그램들을 서로 격리하여 안정성과 보안을 강화합니다.
프로그래밍 단순화: 개발자가 메모리를 수동으로 관리할 필요 없이 OS가 처리합니다.

👎 단점

성능 오버헤드: MMU의 주소 변환에 시간이 소요됩니다.
스래싱 (Thrashing): 시스템이 RAM과 디스크 사이에서 페이지를 교체하는 데 너무 많은 시간을 소비하면 성능이 급격히 저하됩니다.

📌 결론

가상 메모리는 현대 운영체제의 근본적인 초석입니다. 컴퓨터가 물리적 하드웨어가 처음에 암시하는 것보다 훨씬 더 많은 일을 할 수 있게 해주는 뛰어난 엔지니어링의 산물이에요.

OS, MMU, 페이지 테이블, 디스크의 스왑 파일 간의 매끄러운 상호작용이 우리 모두가 오늘날 의존하는 풍부한 멀티태스킹 컴퓨팅 경험을 가능하게 합니다. 다음에 수십 개의 브라우저 탭과 무거운 애플리케이션을 동시에 열어둘 때 이것을 기억하세요. 가상 메모리가 뒤에서 열심히 일하고 있다는 것을요! 💪🖥️

댓글

이 블로그의 인기 게시물

📚 SDC 마스터 클래스 시리즈 | Chapter 1

📚 SDC 마스터 클래스 시리즈 | Chapter 2

📚 SDC 마스터 클래스 시리즈 | Chapter 3