시스템 전체 입장에서는 운영체제가 자원 관리자로서 기능한다. CPU, 메모리, 디스크, I/O 장치 같은 자원들은 누구에게 얼마나 줄지를 관리한다.
sharing
protection
fairness
efficiency
implementation view
구현 관점에서는 운영체제가 event-driven 이벤트에 반응하는 소프트웨어로 기능하다. 인터럽트, 트랩, 시스템 콜 같은 사건이 생길 때마다 커널이 개입하여 처리하는 구조다.
Highly-concurrent, event-driven software
Main roles of OS
abstraction
하드웨어를 응용 프로그램이 다루기 쉬운 형태로 추상화한다. 실제 하드웨어는 CPU, 메모리, 저장장치, 각종 입출력 장치처럼 복잡한 구성 요소들로 이루어져 있지만 응용 프로그램이 이들을 직접 다루기는 어렵다. 그러므로 운영체제는 그 위에 파일, 프로세스, 가상 메모리 같은 추상적인 개념을 만들고 응용 프로그램은 이러한 인터페이스를 통해 하드웨어를 간접적으로 사용한다.
protection & isolation
응용 프로그램은 언제든지 버그를 가질 수 있고, 경우에 따라 악의적으로 동작할 수 있다. 따라서 운영체제는 잘못된 프로그램의 행동이 시스템을 조작하지 않도록 해야 한다.
한 프로그램이 운영체제 커널의 메모리에 접근하거나, 다른 프로그램의 데이터를 훼손하거나, 시스템 자원을 독점하지 않아야 한다.
이런 점에서 운영체제는 프로그램의 실행을 제한하고, 각 프로그램을 서로 분리된 환경 안에서 실행되도록 만든다.
sharing resources
컴퓨터의 하드웨어 자원은 한정되어 있지만, 실제로는 여러 프로그램이 동시에 실행된다. 운영체제는 이 한정된 CPU, 메모리, 저장장치, 입출력 장치를 여러 프로그램이 효율적으로 나누어 쓸 수 있도록 관리한다.
즉, 하나의 물리적 자원을 여러 작업이 번갈아 사용하도록 조정하는 것이다. 이 과정을 통해 사용자는 여러 프로그램이 동시에 실행되는 것처럼 느끼지만, 실제로는 운영체제가 자원을 매우 빠르게 분배하고 조정한다.
Three Pieces
virtualization
각 응용 프로그램이 마치 자신만의 자원을 독점하고 있도록 느끼개 만든다. 실제로는 여러 프로그램이 하나의 CPU와 메모리를 함께 사용하지만, 운영체제는 각 프로그램에게 독립적인 실행 환경이 존재하는 것처럼 보이게 한다.
Processes, CPU scheduling, virtual memory
Concurrency
여러 사건이 동시에, 혹은 겹처 일어나는 환경에서 시스템이 올바르게 동작하도록 한다. 현대의 운영체제는 여러 스레드와 프로세스가 동시에 실행되는 환경을 기본으로 하는데, 실행 순서가 달라지만 결과 또한 달라질 수 있다. ( > 경쟁 상태, 데이터 불일치 등)
운영체제는 이러한 상황을 안전하기 처리하기 위해 스레드와 동기화 기법을 제공하며, 이를 통해 동시에 일어나는 여러 작업을 정확하게 조정한다.
Threads, synchronization
Persistence
시스템이 꺼지거나 예기치 않은 오류가 발생한 뒤 정보를 올바르게 보존하는 문제를 뜻한다. 메모리는 전원이 꺼지면 내용이 사라지지만(Volatile Memory) 저장장치는 데이터를 장기적으로 보관할 수 있다.
운영체제는 파일 시스템과 저장장치 관리 기능을 통해 데이터를 안전하게 기록하고, 장애가 발생하더라도 최대한 일관성을 유지하도록 설계된다.
History of OS
1st Generation (1945-55): Vacuum Tubes and Plugboards
OS, programming languages, assembly languages
ENIAC; 하드웨어를 직접 다루는 장치에 가까운 형태
2nd Generation (1955-65): Transistors and Mainframes
Batch systems / Architectural advances
트랜지스터와 메인프레임이 등장하면서 컴퓨터의 성능과 안정성이 향상되었고, 이에 따라 배치 시스템이 사용되기 시작했다.
여러 작업을 한 번에 모아 두고, 이를 순서대로 처리하는 형태. 카드 리더기, 테이프 드라이브, 라인 프린터와 같은 장치가 사용되었다. 운영체제는 메모리에 상주하면서 한 작업이 끝나면 다음 작업으로 제어를 넘기는 역할을 수행했다.
다만 이 시기에는 여전히 한 번에 한 작업만 처리하는 구조였기 때문에, 입출력이 느릴 경우 CPU가 놀게 되는 비효율이 컸다. (CPU is underutilized due to the bottleneck in I/O)
집적회로(IC)의 도입으로 컴퓨터의 가격 대비 성능이 크게 향상되었고, 디스크 드라이브와 온라인 터미널 같은 새로운 하드웨어 환경도 등장했다.
다중 프로그래밍 시스템은 여러 작업을 동시에 메모리에 올려 두고 번갈아 실행함으로써 CPU 활용률을 높이려 했다. 이 과정에서 작업 스케줄링, 메모리 관리, CPU 스케줄링, 보호, 스풀링 같은 기능이 중요해졌다.
MFT (multiprogramming with fixed number of tasks): 메모리를 처음부터 고정된 크기의 여러 구역으로 나눠 두는 방식. 구조가 단순해서 관리하기 쉽지만, 유연성이 떨어지고 메모리 낭비가 생기기 쉽다.
MVT (multiprogramming with variable number of tasks): 작업 크게이 맞춰 가변적으로 공간을 배정하는 방식. 따라서 동시에 들어가는 작업 수가 고정되지 않고 달라질 수 있다. 메모리를 효율적으로 쓸 수 있다는 장점이 있지만, 단편화(fragmentation) 문제가 생길 수 있다.
시분할 시스템(time-sharing system)은 CPU를 짧은 시간 단위로 나누어 여러 사용자가 번갈아 사용할 수 있도록 함으로써 응답 시간을 개선하려는 시도였다.
이 과정에서 스와핑, 가상 메모리, 파일 시스템, 더 정교한 CPU 스케줄링, 동기화, 프로세스 간 통신, 대화형 셸, 더 강력한 보호 기능 등이 운영체제의 핵심 기능으로 자리 잡게 되었다.
MIT CTSS (1961), Multics (1965), Unix (1969)
4th Generation (1980-): LSIs & VLSIs
1980년 이후에는 마이크로프로세서와 대용량 저장장치의 발전으로 개인용 컴퓨터가 보급되었고, 운영체제 역시 메인프레임 중심의 환경을 넘어 훨씬 넓은 범위로 확장되었다.
이 시기의 운영체제는 그래픽 사용자 인터페이스(GUI), 멀티미디어 지원, 인터넷과 웹, 모바일 환경, 네트워크 및 분산 시스템, 머신 가상화 같은 현대적인 기능들을 포함하게 된다.
즉 운영체제는 단순히 프로그램을 실행시키는 소프트웨어를 넘어, 매우 다양한 컴퓨팅 환경을 통합하고 조정하는 플랫폼으로 발전하였다.
Multics
Multiplexed Information and Computing Service
965년에 MIT, Bell Labs, GE가 함께 시작한 시분할 운영체제 프로젝트. 많은 사용자가 동시에 접속하고 자원을 나눠 쓰는 거대한 시스템을 지향했다.
Multics innovations
Hierarchical file system
File, directory, pathname, working directory
ACLs, long names, hard/symbolic links, quota, …
Virtual memory, shared memory
Dynamic linking.
Implementation in a high-level language (PL/1)
User-level command shell
Logical volumes
Multics Relational Data Store (MRDS), Spreadsheets