운영체제
컴퓨터의 자원을 프로그램들에 나눠 주는 소프트웨어입니다. 프로그램은 하드웨어를 직접 다루지 않습니다. 이 소프트웨어를 거칩니다. 여러 프로그램이 한 기계를 같이 쓸 수 있도록 순서와 자리를 정해 줍니다.
상세
은행에서 돈을 찾을 때 손님이 금고에 직접 들어가지는 않습니다. 창구에 얼마가 필요한지 말하면 안쪽에서 대신 꺼내 옵니다. 금고가 어디에 있고 어떻게 열리는지는 손님이 몰라도 됩니다.
운영체제는 하드웨어라는 한정된 자원을 프로그램들 사이에 나눠 주는 소프트웨어입니다. 하는 일은 셋으로 셉니다. 프로세서와 메모리와 장치를 프로그램마다 나눠 줍니다. 한 프로그램이 다른 프로그램의 자리를 침범하지 못하게 떼어 놓습니다. 하드웨어를 직접 다루는 번거로움을 감춰 정해진 창구만 남깁니다.
flowchart TD
A[응용 프로그램] -->|정해진 창구로 요청| B[운영체제]
B --> C[프로세서를 나눠 준다]
B --> D[메모리를 떼어 놓는다]
B --> E[장치를 대신 다룬다]
C --> F[하드웨어]
D --> F
E --> F
프로그램이 화면에 무언가를 그리거나 디스크에 무언가를 적으려면 이 창구를 지납니다. 창구 안쪽에서 운영체제가 실제 장치를 다룹니다. 프로그램은 장치가 어떤 모델인지 알지 않아도 됩니다.
안쪽에는 기계가 켜져 있는 동안 늘 떠 있는 알맹이가 있습니다. 이 알맹이를 커널이라고 부릅니다. 그 둘레에는 사람이 명령을 넣는 프로그램이나 파일을 다루는 도구처럼 필요할 때만 도는 프로그램들이 딸려 있습니다. 이 두 자리가 갈리는 것이 이 낱말의 경계선을 흐리게 만드는 자리입니다.
배경
기계 한 대를 여러 프로그램이 겹쳐 쓰자 정해 줄 것이 생겼습니다. 누가 언제 프로세서를 쥐는가입니다. Dijkstra 는 1968년 논문에서 시스템 전체가 엄격한 계층 구조를 갖는다고 적습니다. 레벨 0 에는 프로세스 가운데 진행이 논리적으로 허용된 것에게 프로세서를 할당하는 책임이 놓입니다. 어떤 프로세스도 처리 능력을 독점하지 못하게 하려고 이 레벨에서 실시간 시계의 인터럽트를 처리한다고 적습니다. 응답이 필요한 자리에서 시스템이 곧바로 답하도록 우선순위 규칙도 이 레벨에 넣었다고 적습니다. 이렇게 해서 첫 추상화를 얻었다고 적습니다. 레벨 0 위에서는 실제로 공유되는 프로세서의 수가 더 이상 상관없어졌다고 적습니다.
기계를 여럿이 나눠 쓰게 하려는 요구가 그 앞에 있었습니다. Corbató 와 Vyssotsky 는 1965년 논문에서 Multics 를 연구 프로젝트로 개발 중인 종합적인 범용 프로그래밍 시스템이라고 소개합니다. 그런 시스템은 전화나 전력 시스템과 비슷한 방식으로 하루 24시간 주 7일 계속해서 신뢰성 있게 돌아야 한다고 적습니다. 사람과 기계가 여러 갈래로 주고받는 일부터 자리를 비운 사용자의 작업을 순차로 처리하는 일까지 넓은 서비스 요구를 감당할 수 있어야 한다고 적습니다.
자원을 쥐어 나눠 주는 이 자리에 붙은 이름이 이 표제어입니다. Ritchie 와 Thompson 은 1974년 논문에서 Unix 를 범용 다중 사용자 대화형 운영체제라고 적습니다. 같은 논문은 Unix 의 가장 중요한 성취가 대화형으로 쓸 힘 있는 운영체제가 장비로 보나 사람의 노력으로 보나 비쌀 필요가 없음을 보인 것일지 모른다고 적습니다. 다만 사용자들이 이 시스템의 가장 중요한 특징으로 단순함과 우아함과 쓰기 쉬움을 꼽아 주기를 바란다고 덧붙입니다.
예시
Linux 커널
Linux 커널 문서의 README 는 Linux 를 Linus Torvalds 가 인터넷 곳곳의 느슨하게 엮인 해커 팀의 도움을 받아 밑바닥부터 새로 짠 운영체제 Unix 의 클론이라고 적습니다. POSIX(Portable Operating System Interface, 이식 가능 운영체제 인터페이스)와 Single UNIX Specification 적합성을 지향한다고 적습니다. 자기가 갖춘 것으로 참된 멀티태스킹과 가상 메모리와 공유 라이브러리와 디맨드 로딩을 듭니다. 쓰기 시 복사를 하는 공유 실행 파일과 제대로 된 메모리 관리도 듭니다. 인터넷 프로토콜 4판과 6판(IPv4·IPv6)을 아우르는 멀티스택 네트워킹도 듭니다.
같은 문서군의 메모리 관리 개요는 가상 메모리가 하는 일을 이렇게 적습니다. 물리 메모리의 세부를 응용 소프트웨어로부터 추상화한다고 적습니다. 필요한 정보만 물리 메모리에 두게 한다고 적습니다. 이것을 디맨드 페이징이라고 적습니다. 프로세스 사이에서 데이터를 지키는 방법과 통제된 공유 방법을 제공한다고 적습니다.
FreeBSD
FreeBSD Architecture Handbook 의 가상 메모리 장은 물리 메모리가 vm_page_t 구조체를 통해 페이지
단위로 관리된다고 적습니다. 물리 메모리의 페이지들은 각자의 vm_page_t 구조체가 여러 페이징 큐 중
어디에 놓이는지로 분류된다고 적습니다.
Windows
Microsoft 공식 문서의 커널 모드 드라이버 아키텍처 안내서는 Windows 운영체제의 주요 커널 모드 관리자와 구성요소를 적습니다. 커널 모드 메모리 관리자가 운영체제를 위해 물리 메모리를 관리한다고 적습니다. 커널 모드 프로세스·스레드 관리자가 한 프로세스 안의 모든 스레드 실행을 다룬다고 적습니다. 같은 문서는 Windows 커널이 스레드를 스케줄링하거나 하드웨어 인터럽트를 라우팅하는 것 같은 기본적인 저수준 연산을 제공한다고 적습니다.
Zephyr
Zephyr Project 공식 문서는 다목적 운영체제가 완전한 POSIX 적합성을 제공한다고 적습니다. 그에 견주어 Zephyr 같은 실시간 운영체제(Real-Time Operating System, RTOS)는 대체로 고정된 목적을 수행한다고 적습니다. 하드웨어 자원도 대체로 제한되어 있다고 적습니다. 사용자 상호작용도 대체로 제한적이라고 적습니다. 그런 시스템에서 완전한 POSIX 적합성은 실용적이지 않을 수 있다고 적습니다. 불필요할 수 있다고도 적습니다.
KVM
Linux 커널 문서의 중첩 VMX(Virtual-Machine eXtensions, 가상 머신 확장) 문서는 이렇게 적습니다. KVM(Kernel-based Virtual Machine, 커널 기반 가상 머신)이 Intel 프로세서에서 VMX 를 써서 게스트 운영체제를 쉽고 효율적으로 돌린다고 적습니다. 보통 이 게스트들은 자기 게스트를 돌리는 하이퍼바이저가 될 수 없다고 적습니다. VMX 안에서는 게스트가 VMX 명령을 쓸 수 없기 때문이라고 적습니다. 중첩 VMX 기능이 그 빠진 능력을 더한다고 적습니다.
같은 문서군의 KVM API(Application Programming Interface, 응용 프로그래밍 인터페이스) 문서는 kvm API 의 짜임을 이렇게 적습니다. 여러 종류의 파일 디스크립터와 그 파일 디스크립터에 발행할 수 있는 ioctl 을 중심으로 짜여 있다고 적습니다. 다시 말해 kvm API 는 가상 머신의 여러 면을 제어하려고 서로 다른 종류의 파일 디스크립터에 발행하는 ioctl 묶음이라고 적습니다.
경계
커널만 가리키는 용법
알맹이 하나만 가리켜 이 낱말을 써도 되나. 됩니다. Linux 커널 소스 트리의 README 는 커널만을 담은 문서입니다. 그런데도 Linux 를 운영체제 Unix 의 클론이라고 적습니다. 멀티태스킹과 가상 메모리와 메모리 관리와 네트워킹을 자기가 갖춘 것으로 셉니다. 커널 바깥의 명령어 도구는 세지 않습니다. 그래도 이 낱말을 씁니다.
경계선을 실행 모드로 긋는 문서도 있습니다. Microsoft 공식 문서는 Windows 를 돌리는 컴퓨터의 프로세서가 사용자 모드와 커널 모드라는 두 모드로 동작한다고 적습니다. 실행하는 코드의 종류에 따라 프로세서가 두 모드 사이를 오간다고 적습니다. 애플리케이션은 사용자 모드에서 동작한다고 적습니다. 핵심 운영체제 구성요소는 커널 모드에서 기능한다고 적습니다. 이 문서가 커널 모드 쪽에 놓는 것은 핵심 구성요소까지입니다. 커널 모드 바깥의 프로그램을 이 낱말 안에 넣을지 말지를 이 문서는 판정하지 않습니다.
배포본 문서의 용법
꾸러미 전체를 이 낱말로 부르는 문서도 있나. 있습니다. Debian Policy Manual 은 「The Operating System」이라는 제목의 장을 둡니다. 그 장은 모든 파일과 디렉터리의 위치가 파일시스템 계층 표준(Filesystem Hierarchy Standard, FHS) 3.0 판을 따라야 한다고 적습니다. 아래에 적은 예외와 Debian Policy 의 다른 조항을 어기게 되는 자리는 뺀다고 적습니다. 이 장이 이 이름 아래에서 다루는 것은 커널이 아니라 파일과 디렉터리의 자리입니다.
컨테이너
컨테이너는 자기 운영체제를 따로 갖나. 아닙니다. Docker 공식 문서는 Docker 가 Go 프로그래밍 언어로 쓰였다고 적습니다. 자기 기능을 내놓으려고 Linux 커널의 여러 기능을 활용한다고 적습니다. 컨테이너라고 부르는 격리된 작업 공간을 제공하려고 네임스페이스라는 기술을 쓴다고 적습니다. 격리를 만드는 장치가 커널 안에 있습니다. 그래서 컨테이너 쪽이 자기 커널을 따로 얹지 않습니다.
하이퍼바이저와 게스트
가상 머신을 얹는 쪽과 그 위에서 도는 쪽은 같은 자리인가. 아닙니다. Linux 커널의 중첩 게스트 문서는 계층을 셋으로 나눠 적습니다. L0 는 KVM 을 돌리는 맨 하드웨어 호스트라고 적습니다. 이 문서의 그림은 그 자리에 호스트 하이퍼바이저라는 이름을 붙입니다. L1 은 L0 위에서 도는 가상 머신이라고 적습니다. 이 가상 머신도 자기 안에서 KVM 을 돌릴 수 있다고 적습니다. 그래서 게스트 하이퍼바이저라고도 부른다고 적습니다. L2 는 L1 위에서 도는 가상 머신이라고 적습니다. 이것을 중첩 게스트라고 적습니다. 같은 문서군의 중첩 VMX 문서는 KVM 이 게스트 운영체제를 돌린다고 적습니다. 얹는 쪽에 붙는 이름과 얹히는 쪽에 붙는 이름이 문서 안에서 갈려 있습니다.
POSIX 가 말하는 system
POSIX 가 정의한 system 이 이 표제어와 같은 것인가. 아닙니다. POSIX.1-2017 의 정의 장은 3.389 항에서 System 을 POSIX.1-2017 의 구현이라고 적습니다. 그 표준 안에서 이 낱말이 가리키는 것은 그 표준을 구현한 것입니다. 표준을 구현하지 않은 소프트웨어가 운영체제인지 아닌지를 이 항이 판정하지 않습니다.
관련 항목
이 소프트웨어를 이루는 구성 요소
커널 · 셸 · 사용자 모드와 커널 모드 · 시스템 콜 · 인터럽트 · 디바이스 드라이버
이것이 프로그램에 나눠 주는 자원
프로세서를 나눠 쓰게 하는 개념
프로세스 · 스레드 · 스케줄링 · 문맥 교환 · 멀티태스킹 · 우선순위 역전 · 데드락 · 뮤텍스
메모리를 나눠 쓰게 하는 개념
가상 메모리 · 디맨드 페이징 · 페이지 · 페이지 폴트 · 스와핑 · 쓰기 시 복사 · 공유 라이브러리
자료를 저장하는 구조
이것이 뜨기 전에 만나는 계층
이것을 실제로 구현한 시스템
Multics · Unix · Linux · Windows · FreeBSD · Zephyr
이것을 게스트로 얹을 때 쓰는 기술
KVM · VMX · ioctl
헷갈리는 이웃
다른 이름: operating system · OS · 오퍼레이팅 시스템