안녕하세요. 오늘은 운영체제에서 가장 중요한 개념 중 하나인 가상화(Virtualization)에 대해 이야기해 보려 합니다. 가상화는 이름만 들으면 복잡하고 어렵게 느껴질 수 있지만, 차근차근 이해해 보면 운영체제의 핵심을 파악하는 데 큰 도움이 됩니다.
이 글은 제가 읽은 Operating Systems: Three Easy Pieces의 내용을 바탕으로 정리한 것으로, 여러분께 쉽고 명확하게 전달해 드리는 것을 목표로 하고 있습니다. 자, 그럼 시작해 볼까요?
가상화란 무엇인가요?
가상화는 하나의 물리적 자원을 여러 개의 "가상 자원"으로 보이게 하는 기술입니다. 이를 통해 사용자나 애플리케이션이 마치 자신만의 독립적인 자원을 가지고 있는 것처럼 느끼도록 만드는 것이죠.
종이화폐와 금융 시스템의 숫자로 보는 가상화
운영체제의 가상화를 이해하기 위해 종이화폐와 금융 시스템의 숫자를 예로 들어 보겠습니다:
- 실물 자원(종이화폐): 실제로 우리가 사용하는 종이화폐는 물리적인 한계를 가지고 있습니다. 동일한 화폐를 여러 사람이 동시에 사용할 수는 없습니다.
- 가상 자원(숫자): 하지만 금융 시스템에서는 은행 계좌에 금액이 숫자로 표시됩니다. 이 숫자는 물리적인 종이화폐가 아니라 시스템적으로 생성된 "가상 화폐"입니다.
이는 운영체제의 가상화와 유사합니다. 운영체제는 물리적 자원을 시간과 공간적으로 나누어, 각 사용자나 애플리케이션이 독립적인 자원을 가진 것처럼 느끼게 만듭니다.
가상화의 예: CPU 가상화
가상화의 대표적인 예는 CPU 가상화입니다. 예를 들어, 컴퓨터에 하나의 물리적 CPU만 있다고 가정해 봅시다. 하지만 우리는 동시에 여러 프로그램을 실행할 수 있습니다.
운영체제는 이를 가능하게 하기 위해 시간 분할(Time Sharing) 방식을 사용합니다:
- 하나의 프로세스를 실행한 뒤 멈추고,
- 다른 프로세스를 실행하는 과정을 반복하여,
- 마치 여러 개의 CPU가 있는 것처럼 보이게 합니다.
이를 구현하기 위해 운영체제는 다음과 같은 두 가지를 필요로 합니다:
- 메커니즘(Mechanism): 프로세스를 멈추고 다른 프로세스를 실행하는 기술.
- 정책(Policy): 어떤 프로세스를 언제 실행할지를 결정하는 알고리즘.
프로그램에서 프로세스로: 로딩 과정
이 다이어그램은 디스크에 저장된 프로그램이 운영체제에 의해 메모리로 로드되고, CPU에 의해 실행되는 과정을 설명합니다. 핵심은 프로그램이 메모리 주소 공간에 로드되어야만 프로세스로 실행될 수 있다는 점입니다.
운영체제가 로딩 작업을 수행하면서 CPU와 메모리 간의 연결을 관리하는 것이 가상화의 중요한 기반이 됩니다.
1. 프로그램의 저장 위치 — 디스크
• 프로그램은 처음에는 디스크에 저장됩니다. 디스크에는 프로그램의 코드와 정적 데이터(static data)가 포함되어 있습니다.
• 이 상태에서 프로그램은 단순한 파일에 불과하며 실행되지 않습니다.
2. 메모리로의 로딩
• 운영체제는 디스크에 있는 프로그램을 메모리로 가져옵니다. 이 과정을 로딩(Loading)이라고 부릅니다.
• 프로그램의 코드, 정적 데이터, 힙(Heap), 그리고 스택(Stack) 영역이 메모리에 할당됩니다.
• 코드: 실행될 명령어들이 저장된 영역입니다.
• 정적 데이터: 프로그램 실행 중 변하지 않는 데이터입니다.
• 힙(Heap): 동적으로 할당된 데이터가 저장됩니다.
• 스택(Stack): 함수 호출과 로컬 변수 관리에 사용됩니다.
3. CPU와 프로세스 실행
• 메모리에 로딩된 프로그램은 이제 프로세스로 변환됩니다.
• CPU는 메모리에 로딩된 코드의 명령어를 실행하면서 프로세스를 처리합니다.
운영체제의 역할: 프로세스와 자원 관리
운영체제는 단순히 자원을 가상화하는 것뿐만 아니라, 프로세스와 자원 관리라는 더 큰 역할을 수행합니다.
- 프로세스: 실행 중인 프로그램을 의미하며, 운영체제는 프로세스의 상태를 관리합니다. (예: Running, Ready, Blocked 상태)
- 자원 관리: 각 프로세스가 요구하는 메모리, CPU, I/O 등의 자원을 효율적으로 분배하여 충돌을 방지합니다.
프로세스 상태 전이(Process State Transitions)
운영체제는 프로세스를 효율적으로 관리하기 위해 Ready, Running, Blocked라는 세 가지 상태를 사용합니다. 이 상태 간의 전환은 운영체제의 핵심 기능 중 하나이며, 자원을 효율적으로 분배하는 데 중요한 역할을 합니다.
이해를 돕기 위해 정리하면:
• Ready는 실행 준비 상태,
• Running은 CPU가 작업 중인 상태,
• Blocked는 입출력과 같은 이벤트를 기다리는 상태입니다.
1. Running 상태
- 설명: 프로세스가 현재 CPU에서 실행되고 있는 상태입니다.
- 전이 조건:
- Descheduled: 운영체제가 프로세스를 멈추고 다른 프로세스를 실행하도록 결정하면, Ready 상태로 전환됩니다.
- I/O Initiate: 프로세스가 입출력(I/O) 작업을 요청하면, Blocked 상태로 전환됩니다.
2. Ready 상태
- 설명: 프로세스가 실행될 준비가 되었지만 CPU가 할당되지 않은 상태입니다.
- 전이 조건:
- Scheduled: 운영체제가 해당 프로세스를 CPU에 할당하면, Running 상태로 전환됩니다.
3. Blocked 상태
- 설명: 프로세스가 입출력(I/O) 작업 등 특정 이벤트를 기다리는 상태입니다. CPU를 사용할 수 없는 상태입니다.
- 전이 조건:
- I/O Done: 입출력 작업이 완료되면 Ready 상태로 전환됩니다.
상태 전이 요약
1. Ready ↔ Running:
- Scheduled: Ready 상태의 프로세스를 CPU에 할당.
- Descheduled: 실행 중인 프로세스를 CPU에서 내리고 Ready 상태로 대기.
2. Running → Blocked:
- I/O Initiate: 실행 중인 프로세스가 입출력 작업을 요청하면 Blocked 상태로 이동.
3. Blocked → Ready:
- I/O Done: 입출력 작업이 완료되면 Ready 상태로 돌아갑니다.
가상화의 확장: 메모리와 디스크
가상화는 CPU뿐만 아니라 메모리와 디스크에도 적용됩니다:
- 메모리 가상화: 프로세스마다 독립적인 메모리 공간(주소 공간)을 제공하여 충돌을 방지.
- 디스크 가상화: 여러 사용자가 동일한 디스크를 사용하는 것처럼 보이도록 파일 시스템을 관리.
프로세스 상태 추적: CPU와 I/O
다음 표는 CPU와 I/O를 사용하는 프로세스의 상태 변화를 시간 순서대로 나타냅니다.
이 표를 통해 알 수 있는 운영체제의 주요 역할은 다음과 같습니다:
1. CPU 자원 최적화
- 프로세스가 Blocked 상태일 때 다른 프로세스가 CPU를 사용하도록 스케줄링하여 자원을 낭비하지 않습니다.
2. I/O 작업 병행 처리
- CPU와 I/O 작업이 동시에 처리되어 시스템의 자원 활용도를 극대화합니다.
3. 프로세스 상태 관리
- 프로세스의 상태를 적절히 Running → Blocked → Ready로 전환하여 효율적인 작업 수행을 보장합니다.
정리하며
가상화는 운영체제에서 가장 중요한 개념 중 하나로, 물리적 자원을 효율적으로 활용하고 사용자 경험을 향상시키는 핵심 기술입니다.
오늘은 CPU 가상화를 중심으로 살펴보았지만, 앞으로 메모리, 디스크 등 다른 자원 가상화도 다룰 예정입니다.
이 글이 가상화를 처음 접하는 분들께 조금이나마 도움이 되었기를 바랍니다.
다음 포스팅에서는 운영체제에서 프로세스 생성과 관리를 다루는 프로세스 API에 대해 다룰 예정입니다.
다음 글에서 만나요! ✨
위 내용은 Operating Systems: Three Easy Pieces 책의 Part1. Virtualization을 기반으로 작성되었습니다.