운영체제의 역사와 발전
운영체제의 핵심 개념들은 하루아침에 만들어진 것이 아닙니다. 컴퓨터 사용 환경이 변할 때마다 새로운 문제가 생겼고, 그 문제를 해결하면서 멀티프로그래밍, 시분할, 가상 메모리 같은 개념이 탄생했습니다.
이 절의 목적은 역사를 외우는 것이 아닙니다. 각 시대에 어떤 문제가 있었고, 그 문제를 해결하기 위해 어떤 개념이 등장했는지를 따라가면, OS의 핵심 원리가 왜 그런 형태가 되었는지를 자연스럽게 이해할 수 있습니다. 이 개념이 왜 존재하는가?에 대한 답이 역사 안에 있습니다.
초기 컴퓨터 — OS가 없던 시대 (1940~50년대)
1940~50년대의 컴퓨터는 운영체제가 없었습니다. 프로그래머가 직접 하드웨어를 조작했습니다. 프로그램을 천공 카드에 구멍을 뚫어 기록하고, 컴퓨터실에 들어가서 카드를 읽히고, 결과가 출력될 때까지 기다려야 했습니다.
이 시대의 가장 큰 문제는 인간의 속도였습니다. 컴퓨터는 초당 수천 번의 연산을 할 수 있었지만, 사람이 카드를 넣고 결과를 확인하고, 다음 사람이 와서 자기 카드를 넣는 데 수십 분이 걸렸습니다. 당시 컴퓨터 한 대의 가격이 수백만 달러에 달했으므로, 이 유휴 시간은 엄청난 낭비였습니다.
물리적으로 비유하면, 수십억 원짜리 공장 장비를 사놓고 하루에 30분만 가동하는 셈입니다. 이 비효율을 어떻게든 줄이려는 노력이 운영체제의 시작입니다.
또한 각 프로그래머가 하드웨어를 직접 다뤄야 했으므로, 새 프로그램을 실행하려면 카드 리더의 동작 방식, 프린터의 제어 코드, 메모리의 물리적 주소까지 모두 알아야 했습니다. 하드웨어가 바뀌면 프로그램을 처음부터 다시 작성해야 했습니다. 이 고통이 나중에 하드웨어 추상화와 디바이스 드라이버라는 개념을 낳게 됩니다.
배치 시스템 (1950~60년대)
배치 시스템(Batch System)은 인간의 개입 시간을 줄이기 위해 등장했습니다. 핵심 아이디어는 단순합니다. 여러 사용자의 작업(Job)을 모아서 순서대로 자동 실행하는 것입니다.
운영자(Operator)가 사용자들의 천공 카드를 모아 한꺼번에 컴퓨터에 넣습니다. 상주 모니터(Resident Monitor)라고 불리는 초기 형태의 OS가 카드 한 묶음(작업)을 읽어 실행하고, 끝나면 다음 작업을 자동으로 불러옵니다. 사람이 매번 오가지 않으니 컴퓨터의 유휴 시간이 크게 줄었습니다.
상주 모니터는 최초의 운영체제라 할 수 있습니다. 비록 단순했지만, OS의 핵심 기능 두 가지를 이미 수행했습니다. 첫째, 자동 작업 전환: 한 작업이 끝나면 다음 작업을 자동 시작합니다. 둘째, 입출력 관리: 카드 리더, 프린터 등의 장치를 제어하는 코드를 공통화하여 각 프로그램이 직접 다루지 않아도 됩니다.
하지만 배치 시스템에는 근본적인 한계가 있었습니다. 프로그램이 디스크에서 데이터를 읽거나 프린터에 출력하는 동안 — 즉 I/O를 수행하는 동안 — CPU가 아무것도 하지 않고 기다립니다. 디스크가 데이터를 읽어오는 데 2초가 걸린다면, 초당 수천 번 연산할 수 있는 CPU가 2초 동안 완전히 놀고 있는 것입니다. I/O 장치와 CPU의 속도 차이가 수천~수만 배였으므로, CPU 시간의 대부분이 대기에 소모되었습니다.
이 문제를 다음 세대의 해법이 등장합니다. CPU가 놀고 있을 때, 다른 프로그램을 돌리면 되지 않나?
멀티프로그래밍 (1960년대)
멀티프로그래밍(Multiprogramming)은 배치 시스템의 CPU 유휴 문제를 정면으로 해결한 혁신입니다. 여러 프로그램을 동시에 메모리에 적재하여, 하나가 I/O를 기다리면 다른 프로그램에게 CPU를 넘기는 방식입니다.
구체적으로 이렇게 동작합니다. 프로그램 A가 디스크 읽기를 요청합니다. 디스크 컨트롤러가 작업하는 동안 CPU는 프로그램 B를 실행합니다. B가 네트워크 응답을 기다리면, CPU는 프로그램 C를 실행합니다. C가 끝나기 전에 A의 디스크 읽기가 완료되면, A에게 CPU를 돌려줍니다. CPU가 한순간도 놀지 않으므로 전체 처리량(Throughput)이 비약적으로 증가합니다.
그런데 멀티프로그래밍을 구현하려면 새로운 문제들이 쏟아집니다. 이 문제들 각각이 OS의 핵심 주제가 됩니다.
메모리 보호: 여러 프로그램이 같은 물리 메모리에 공존합니다. 프로그램 A가 버그로 인해 프로그램 B의 메모리 영역을 덮어쓰면 B가 오동작합니다. 각 프로그램이 자기 영역만 접근할 수 있도록 하드웨어 수준의 보호가 필요합니다. 이것이 베이스-한계 레지스터와 이후 가상 메모리로 발전합니다.
CPU 스케줄링: 여러 프로그램이 CPU를 원할 때, 누구에게 먼저 줄 것인가? 어떤 기준으로 전환할 것인가? 이것이 스케줄링 알고리즘의 출발점입니다.
동기화: 여러 프로그램이 공유 자원(프린터, 디스크)에 동시에 접근하면 충돌이 발생합니다. 접근 순서를 조율하는 메커니즘이 필요합니다. 세마포어가 바로 이 시대에 다익스트라에 의해 제안되었습니다.
멀티프로그래밍의 등장으로 OS는 단순한 작업 순서 관리자에서 자원 관리자로 진화합니다. 그리고 이때 등장한 문제들 — 메모리 보호, 스케줄링, 동기화 — 이 운영체제 교과서의 핵심 내용이 됩니다.
시분할 시스템 (1970년대)
멀티프로그래밍은 처리량을 높였지만, 사용자 입장에서는 자기 프로그램이 언제 실행될지 예측할 수 없었습니다. 작업을 제출하면 결과가 나올 때까지 몇 시간을 기다려야 하는 경우도 있었습니다. 프로그램에 오타가 하나 있었다면, 수정 후 다시 제출하고 또 몇 시간을 기다려야 합니다.
시분할(Time-Sharing) 시스템은 이 문제를 해결하기 위해 CPU 시간을 아주 작은 단위(타임 슬라이스, 보통 수십 밀리초)로 나누어 여러 사용자에게 번갈아 할당합니다. 각 사용자는 마치 자기만의 컴퓨터를 쓰는 것처럼 느낍니다. 터미널에 명령어를 타이핑하면 거의 즉시 반응합니다.
시분할 시스템의 핵심 차이는 응답 시간(Response Time)에 대한 관심입니다. 멀티프로그래밍이 전체 처리량 극대화를 목표로 했다면, 시분할은 각 사용자에 대한 응답 시간 최소화를 추가 목표로 삼았습니다. 이 목표의 차이가 스케줄링 알고리즘의 설계를 근본적으로 바꿔놓습니다.
UNIX가 바로 이 시분할 시스템으로 탄생했습니다. 1969년 AT&T 벨 연구소에서 켄 톰프슨(Ken Thompson)과 데니스 리치(Dennis Ritchie)가 개발했습니다. UNIX는 C 언어로 작성되어 다른 하드웨어로 이식(Porting)이 가능했습니다. 이식성은 당시로서는 혁명적인 특성이었습니다. 어셈블리어로 작성된 다른 OS들은 하드웨어가 바뀌면 전부 다시 작성해야 했지만, C로 작성된 UNIX는 컴파일러만 있으면 새 하드웨어에서 실행할 수 있었습니다.
이 이식성 덕분에 UNIX는 대학에 빠르게 퍼졌고, 다양한 변형이 탄생합니다. BSD(Berkeley Software Distribution), System V, HP-UX, AIX, Solaris 등이 모두 UNIX의 후손입니다. 오늘날의 Linux, macOS도 이 계보에 속합니다.
UNIX는 또한 여러 중요한 설계 철학을 확립했습니다.
- 모든 것은 파일이다: 디스크, 키보드, 네트워크 소켓까지 파일 인터페이스로 다룹니다.
- 작은 도구의 조합: 하나의 작업을 잘하는 작은 프로그램을 파이프(|)로 연결합니다.
- 텍스트 기반 설정: 설정 파일이 사람이 읽을 수 있는 텍스트입니다.
이 철학들은 50년이 지난 지금도 Linux에서 그대로 살아있어, CLI를 배울 때 이해의 기초가 됩니다.
개인용 컴퓨터와 GUI (1980~90년대)
하드웨어 가격이 급격히 하락하면서 개인용 컴퓨터(PC)가 보급됩니다. 한 사람이 한 대의 컴퓨터를 쓰므로, 다수 사용자 간 자원 공유보다 한 사용자의 편의성이 중요해졌습니다.
MS-DOS(1981)는 IBM PC의 OS로, 명령줄 기반이었습니다. 단일 태스크(한 번에 하나의 프로그램)만 지원했고, 메모리 보호도 없었습니다. 시분할이나 멀티프로그래밍의 발전이 PC에서는 잠시 뒷걸음친 셈입니다. 하지만 "누구나 컴퓨터를 소유할 수 있다"는 변화가 가져온 사회적 영향은 기술적 퇴보를 압도했습니다.
Windows(3.0, 95, NT)는 GUI(그래픽 사용자 인터페이스)를 대중화했습니다. 특히 Windows NT(1993)는 하이브리드 커널 구조, 선점형 멀티태스킹, 메모리 보호를 갖춘 본격적인 현대 OS였습니다. 이후 Windows 2000, XP, 7, 10, 11로 이어지는 NT 계열이 오늘날 데스크톱 OS의 주류입니다.
macOS는 UNIX 계열(BSD)을 기반으로 Apple이 개발한 GUI OS입니다. 2001년 Mac OS X부터 Darwin이라는 UNIX 인증 커널 위에 구축되어, 터미널을 열면 UNIX 명령어를 그대로 사용할 수 있습니다. 개발자에게 macOS가 인기 있는 이유 중 하나입니다.
한편 Linux는 1991년 핀란드의 대학생 리누스 토르발스(Linus Torvalds)가 시작한 오픈소스 프로젝트입니다. UNIX와 호환되면서도 무료로 사용할 수 있는 OS를 목표로 했습니다. 처음에는 취미 프로젝트였지만, 전 세계 개발자들이 협력하면서 폭발적으로 성장했습니다.
오늘날 Linux는 서버 시장의 절대 강자입니다. 전 세계 상위 500대 슈퍼컴퓨터 중 100%(2023년 기준)가 Linux를 사용합니다. 구글, 아마존, 페이스북의 서버는 모두 Linux 위에서 동작합니다. Android 스마트폰도 Linux 커널 위에 구축되어 있으므로, 전 세계에서 가장 많은 장치에서 동작하는 커널이기도 합니다.
Linux의 성공 비결은 오픈소스 모델입니다. 누구나 소스 코드를 읽고, 수정하고, 배포할 수 있습니다. 이 개방성이 거대한 커뮤니티를 형성했고, 버그 수정과 기능 추가가 상업 OS보다 빠르게 이루어집니다. 다양한 배포판(Distribution) — Ubuntu, CentOS, Fedora, Debian 등 — 이 특정 용도에 최적화된 패키지를 제공합니다.
모바일, 클라우드, 그리고 현재 (2000년대~현재)
스마트폰의 등장은 OS의 새로운 도전을 만들었습니다.
Android(2008)는 Google이 주도하는 오픈소스 모바일 OS로, Linux 커널 위에 Java/Kotlin 기반의 애플리케이션 프레임워크를 올렸습니다. 앱은 별도의 샌드박스에서 실행되어 다른 앱의 데이터에 접근할 수 없습니다. 이것은 데스크톱 OS와 근본적으로 다른 보안 모델입니다. 데스크톱에서는 프로세스가 파일 시스템 전체에 접근할 수 있지만, 모바일에서는 각 앱이 자기 디렉토리에만 접근할 수 있습니다.
iOS는 Apple이 macOS(Darwin)를 기반으로 만든 모바일 OS입니다. 폐쇄적 생태계에서 하드웨어-소프트웨어 최적화를 극한까지 추구합니다.
클라우드의 확산도 OS 패러다임을 바꾸고 있습니다.
가상화(Virtualization): 하나의 물리 서버에 여러 개의 가상 머신(VM)을 올려, 각각 독립적인 OS를 실행합니다. VMware, KVM, Hyper-V가 이 기술의 핵심입니다. 물리 서버를 구매하고 설치하는 대신, 클라우드 콘솔에서 클릭 몇 번으로 서버를 생성할 수 있게 되었습니다.
컨테이너(Container): 가상 머신보다 가벼운 격리를 제공합니다. 하나의 OS 커널 위에서 프로세스를 격리하여, VM 수준의 독립성을 훨씬 적은 오버헤드로 달성합니다. Docker(2013)가 이 기술을 대중화했고, Kubernetes가 대규모 컨테이너 관리를 담당합니다.
서버리스(Serverless): 서버 관리 자체를 추상화합니다. 개발자는 함수 단위의 코드만 작성하면, 인프라 관리는 클라우드 제공자가 담당합니다. 그러나 내부적으로는 컨테이너나 마이크로 VM이 함수를 실행합니다.
이 모든 기술 — 가상화, 컨테이너, 서버리스 — 은 운영체제의 개념(프로세스 격리, 메모리 관리, 네임스페이스, cgroup) 위에서 구축되었습니다. 추상화 계층이 높아질수록 OS의 원리를 직접 다룰 일은 줄지만, 문제가 발생했을 때 원인을 추적하려면 결국 그 아래를 들여다봐야 합니다.
역사에서 배우는 OS의 핵심 원리
지금까지 70여 년의 OS 역사를 훑었습니다. 각 시대의 문제와 해결책을 연결하면 OS의 핵심 원리가 왜 존재하는지 명확해집니다.
| 시대 | 문제 | 해결책 | 오늘날의 개념 |
|---|---|---|---|
| 초기 (1940~50) | CPU 유휴 시간 | 배치 시스템 | 작업 큐, 자동화 |
| 배치 (1960) | I/O 중 CPU 유휴 | 멀티프로그래밍 | CPU 스케줄링, 메모리 보호 |
| 시분할 (1970) | 사용자 응답 지연 | 타임 슬라이스 | 라운드 로빈, 인터랙티브 OS |
| PC (1980~90) | 사용 편의성 | GUI, 플러그앤플레이 | 윈도우 시스템, 디바이스 드라이버 |
| 모바일 (2000~) | 보안, 배터리 | 앱 격리, 전력 관리 | 샌드박스, 권한 모델 |
| 클라우드 (2010~) | 자원 효율, 배포 속도 | 가상화, 컨테이너 | VM, Docker, K8s |
이 표에서 보듯이, OS의 모든 핵심 개념은 문제 → 해결의 과정에서 탄생했습니다. 이 교재에서 각 개념을 배울 때, 이것은 어떤 문제를 해결하기 위해 만들어졌는가?를 항상 함께 생각하면 이해가 훨씬 깊어집니다.
다음 절에서는 운영체제의 핵심인 커널이 무엇인지, 프로그램이 OS에 요청을 보내는 시스템 콜이 어떻게 동작하는지를 살펴보겠습니다.