Chapter 1

OS 개요

  • 1.1 운영체제가 하는 일
  • 1.2 가상화
  • 1.3 병행성
  • 1.4 영속성
  • 1.5 설계 목표

운영체제는 결국 **자원 관리자(resource manager)**야. CPU, 메모리, 디스크 같은 물리 자원을 여러 프로그램이 효율적이고 공정하게 나눠 쓸 수 있도록 관리하는 게 핵심 역할이지. 프로그램 입장에서는 자기 혼자 컴퓨터를 독점하는 것처럼 보이지만, 실제로는 OS가 뒤에서 자원을 슬쩍슬쩍 돌려막기 하고 있는 거거든.

OSTEP 저자들(Remzi & Andrea)은 운영체제를 세 가지 키워드로 요약해. 가상화(Virtualization), 병행성(Concurrency), 영속성(Persistence). 이 세 조각이 책 전체를 관통하는 뼈대야.

OS가 쓰는 핵심 테크닉이 가상화지. 물리적 자원을 가상의 형태로 변환해서 프로그램에게 제공하는 거야. CPU 가상화를 보면, 실제 CPU가 하나뿐인데도 수십 개의 프로그램이 동시에 도는 것처럼 보이잖아. OS가 프로그램들을 아주 빠르게 번갈아 실행시키면서 각 프로그램이 자기만의 CPU를 가진 것 같은 환상을 만들어내는 건데, 이걸 **시분할(time sharing)**이라고 해. 메모리 가상화도 마찬가지야. 각 프로세스가 자기만의 거대한 메모리 공간을 가진 것처럼 보이지만, 실제로는 물리 메모리를 여러 프로세스가 공유하고 있어. OS가 **주소 공간(address space)**을 가상으로 만들어서 독립적인 메모리를 쓰는 것처럼 보이게 하는 거지. 프로세스 A의 주소 0x1000과 프로세스 B의 주소 0x1000은 실제로 다른 물리 메모리를 가리켜.

병행성은 여러 일이 동시에 일어날 때 생기는 문제들이야. 두 스레드가 같은 카운터 변수를 동시에 증가시키면 예상과 다른 결과가 나오거든. 카운터를 100,000번 증가시키는 스레드 두 개를 돌리면 200,000이 아니라 엉뚱한 숫자가 나와. counter++가 실제로는 세 개의 명령어(load, add, store)로 이루어져 있는데, 두 스레드가 이걸 섞어서 실행하기 때문이지. 이게 **경쟁 조건(race condition)**이야.

영속성은 데이터를 영구적으로 저장하는 문제야. DRAM은 휘발성 메모리라서 전원이 꺼지면 데이터가 날아가잖아. OS에서 이걸 담당하는 부분이 **파일 시스템(file system)**이지. write() 시스템 콜 하나를 처리하는 데도 내부적으로 꽤 복잡한 일이 벌어져 — 어디에 쓸지 결정하고, 디스크에 I/O 요청을 보내고, 메타데이터를 업데이트하고. 쓰는 도중에 시스템이 크래시 나면 데이터가 일관성 없는 상태가 될 수 있어서, 저널링(journaling) 같은 기법으로 이걸 방지하지.

OS를 설계할 때 추구하는 목표들도 있어. **추상화(Abstraction)**로 복잡한 하드웨어를 단순한 인터페이스로 감싸서 프로그래머가 쉽게 쓸 수 있게 하고, **성능(Performance)**을 위해 OS의 오버헤드를 최소화해야 하고, **보호(Protection)**로 프로세스 간 격리를 보장해야 하고, **신뢰성(Reliability)**도 중요하지 — OS가 죽으면 그 위에서 도는 모든 게 죽으니까. 결국 OS 설계의 핵심 딜레마는 편리한 추상화를 제공하면서도 오버헤드를 최소화하는 균형을 찾는 거야.


정리

1장 읽고 기억할 거 세 가지:

  1. 운영체제는 자원 관리자야. CPU, 메모리, 디스크를 여러 프로그램이 효율적으로 나눠 쓸 수 있도록 가상화하고 관리하는 게 핵심이지
  2. 가상화, 병행성, 영속성 — 이 세 키워드가 OS의 모든 것을 설명해. 각각이 책의 한 파트를 구성하고, 이 뼈대를 잡아야 나머지가 보여
  3. OS 설계는 추상화와 성능 사이의 균형이야. 편리한 인터페이스를 제공하면서도 오버헤드를 최소화해야 하거든