컴퓨터는 데이터(Data)를 처리하고, 그 처리한 결과를 출력하거나 저장한다. 이때, 데이터를 처리하는 결과를 "정보(Informaton)"이라고 한다. 컴퓨터는 크게 하드웨어와 소프트웨어로 구성되는데, 소프트웨어는 하드웨어에 명령을 내려 작업을 수행하여 데이터를 가치 있는 정보로 변환한다.
운영체제 정의
운영체제란 컴퓨터 전체를 관리하고 운영하는 소프트웨어로, 컴퓨터를 관리하기 위한 기본적인 규칙과 절차를 규정하여 컴퓨터 내의 모든 하드웨어와 응용 프로그램을 관리한다. 컴퓨터 전원을 켜면 가장 먼저 실행되는 프로그램이며 사용자나 응용 프로그램들은 운영체제를 통해서만 컴퓨터 자원에 접근 가능하다.
운영체제는 주로 다음의 역할들을 수행한다.
- 자원 관리: 운영체제는 컴퓨터 자원을 응용 프로그램에 적절히 나누어주어 사용자가 원할하게 작업할 수 있도록 한다.
- 자원 보호: 악의적인 사용자나 미숙한 사용자들로 인한 비정상적인 작업으로부터 컴퓨터 자원을 보호한다.
- 하드웨어 인터페이스 제공: 다양한 하드웨어를 일관된 방법으로 사용할 수 있도록 지원한다. 이때, 하드웨어 인터페이스의 지원을 받기 위해서는 드라이버를 설치해야 한다.
- 사용자 인터페이스 제공: 운영체제가 그래픽 사용자 인터페이스(GUI)를 제공하여 대부분의 작업을 마우스로 수행하여 사용자가 쉽게 운영체제를 사용할 수 있도록 한다.
또한 운영체제는 다음의 특성을 갖춰야 한다.
- 효율성(Efficiency): "자원 관리"와 연관되는 특성으로, 운영체제는 같은 자원이라도 효율적으로 관리해야 한다. 효율적인 운영체제는 적은 자원을 사용하여 결과를 빨리 보여주는 것이다.
- 안정성(Stability): "자원 보호"와 연관되는 특성으로, 운영체제는 사용자와 응용 프로그램의 안전 문제, 하드웨어적인 보안 문제를 잘 처리할 수 있어야 하며 시스템의 문제가 발생하면 이전으로 복구하는 "결함 포용"을 수행해야 한다.
- 확장성(Scalability): "하드웨어 인터페이스 제공"과 연관되는 특성으로, 운영체제는 하드웨어의 종류에 상관없이 꽂으면 바로 실행 가능한 "플러그 앤드 플레이(Plug & Play)"를 제공해야 한다.
- 편리성(Convenience): "사용자 인터페이스 제공"과 연관되는 특성으로, 운영체제는 응용 프로그램과 사용자에게 편리성을 제공하는 동시에 자원의 낭비 요소를 막아야 한다.
운영체제 발전
운영체제는 꽤 오랜 시간에 걸쳐 발전해왔는데, 시대 별로 운영체제가 어떻게 발전해왔는지 알아보도록 하겠다.
초창기 컴퓨터
최초의 컴퓨터인 에니악은 수천 개의 진공관을 전선으로 연결한 "하드와이어링 방식"을 통해 논리회로를 구성하고 원하는 결과값을 얻어내는 방식으로 동작하였다. 다른 계산이나 수식을 사용하기 위해서는 전선을 다시 일일히 연결해야 했다. 따라서 초창기의 컴퓨터에는 운영체제의 개념이 존재하지 않았다.
일괄 작업 시스템 (Batch Job System)
초창기 컴퓨터가 점차 발전하여 진공관과 전선으로 만들어진 논리회로를 매우 작은 크기로 구현한 "IC(Integrated Circuit) 칩"을 이용한 현대적 컴퓨터가 만들어졌다. 부족하지만 CPU와 메인메모리가 존재했으며 천공카드 리더(Punch Card Reader)와 라인 프린터(Line Printer)를 통한 입출력 시스템이 구축되었다.
하드와이어링 방식과는 달리, 프로그램만 바꾸면 다른 직업이 가능하여 현대적 프로그래밍 방식을 수행할 수 있게 되었다. 이때, 천공카드 시스템에서는 하나의 작업을 읽고 수행하고 결과를 출력한 후, 다음 작업을 읽고 수행하는 "일괄 작업 시스템(일괄 처리 시스템)" 방식으로 진행되었다. 일괄 작업 시스템부터 미약하나 운영체제가 사용되기 시작하였다.
대화형 시스템 (Interactive System)
1960년대 초반, 키보드와 모니터가 등장했고 이는 작업 중간에 사용자가 입력을 하거나 사용자에게 중간 결과 값을 보여주고, 또 중간 결과 값을 출력할 수 있게 했다. 즉, 컴퓨터와 사용자의 대화를 통해 작업이 이루어지는 "대화형 시스템"이 구축되었다. 대화형 시스템을 통해 단순 계산 위주의 작업 뿐만 아니라 더욱 복잡한 응용 프로그램들을 만들 수 있게 되었다.
일괄 작업 시스템에서는 프로그램과 데이터가 입력되면 그 이후에는 CPU만 작동하기에 작업 시간을 예측할 수 있었으나, 대화형 시스템에서는 프로그램이 진행되는 동안 입력과 출력이 어떻게 진행되고 완료될지 예측하기 어렵기에 작업 시간을 예측하기 어렵다.
시분할 시스템 (Time Sharing System)
1960년대 후반, 컴퓨터가 점점 소형화되고 계산 능력은 향상되었지만 여전히 컴퓨터는 가격이 비쌌고 한 번에 한 가지 작업만 수행할 수 있었기에 비효율적이었다. 이로 인해 멀티 프로그래밍에 대한 연구가 활발히 진행되었고, 그 결과 여러 작업을 조금씩 처리하여 작업이 동시에 이루어지는 것처럼 보이게 하는 "시분할 시스템"이 등장하였다.
시분할 시스템에서는 CPU 시간을 잘게 쪼개어 여러 작업에 나누어 모든 작업을 동시에 처리하는 것처럼 보이게 한다. 이때, 나뉜 시간 한 조각을 "타임 슬라이스(타임 퀀텀)"이라고 한다. 그리고 시분할 시스템에서 동시에 실행되는 작업의 개수를 "멀티 프로그래밍 수준(멀티 프로그래밍 정도)"라고 한다.
시분할 시스템에서는 여러 작업을 동시에 처리하기 위한 추가 작업이 필요하며, 사용자 메모리를 정리하는 추가 작업도 필요하다. 그리고 시스템 내에 많은 양의 작업이 동시에 존재할 경우 중요한 작업을 일정 시간 내에 끝내는 것을 보장하지 못한다. 이로 인해 특정 시스템에서 일정 시간 안에 작업이 처리되도록 보장하는 "실시간 시스템" 개념이 등장하였다. 또한 시분할 시스템으로부터 한 사람이 여러 프로그램을 동시에 실행하거나 여러 사람이 동시에 작업할 수 있도록 하는 "다중 사용자 시스템" 개념도 등장하였다.
분산 시스템 (Distributed System)
개인용 컴퓨터가 등장하며 개인 컴퓨터를 소유한 사람들이 많아졌으며 소프트웨어도 급속도로 발전하였다. 또한 인터넷도 등장하며 새로운 컴퓨팅 환경이 만들어졌다. 이 시기에 네트워크상에 분산된 여러 컴퓨터로 작업을 수행하며 결과를 상호 교환하도록 구성된 시스템인 "분산 시스템"이 만들어졌다.
클라이언트/서버 시스템 (Client/Server System)
작업을 요청하는 클라이언트와 요청에 응답하여 작업을 처리하는 서버의 이중 구조로 나뉘는 구조인 "클라이언트/서버 시스템"이 등장하였다. 이는 모든 컴퓨터의 지위가 동일하기에 생기는 분산 시스템의 문제를 해결하는 시스템이다. Web 시스템이 대중화되면서 클라이언트/서버 구조는 널리 퍼졌다.
다만, 클라이언트/서버 시스템에는 모든 요청이 서버로 집중되기에 많은 서버와 큰 용량의 네트워크가 필요하다. 한꺼번에 많은 사람이 몰려 접속할 경우, 서버와 네트워크가 감당하기 어렵고 심한 경우에는 서버가 다운되기도 한다.
P2P 시스템 (Peer-to-Peer System)
서버 과부하라는 클라이언트/서버 구조 문제를 해결하기 위해 P2P 시스템이 만들어졌다. P2P 시스템은 서버만 중재만 하고, 파일을 얻고자 하는 말단 사용자(Peer)가 파일을 가진 말단 사용자(Peer)로부터 직접 다운로드하는 시스템이다. 대표적인 P2P 시스템으로는 카카오톡과 같은 메신저가 있다. 또한 서버가 없는 완전한 P2P 시스템도 있는데, 대표적으로 "블록체인"이 있다.
클라우드 컴퓨팅 (Cloud Computing)
네트워크 기술이 발전하기 전, 분산 시스템은 특정 영역에서만 사용되다가 여러 곳에 떨어진 컴퓨팅 파워나 소프트웨어를 하나로 묶어 하나의 컴퓨터처럼 사용하는 그리드 컴퓨팅으로 발전하였다. 그리드 컴퓨팅은 분산 시스템이 발전된 형태이나, 컴퓨팅 파워를 크게 필요로 하는 곳이 제한적이기에 대중화되진 못했다.
대신 현재는 초고속 통신망 및 무선 통신망의 발전으로, 하드웨어와 소프트웨어를 클라우드라는 중앙 시스템에 숨기고 사용자는 필요한 서비스만 그때마다 이용하는 "클라우드 컴퓨팅" 방식이 발전하게 되었다. 클라우드 환경으로 옮겨 오면서 더 이상 저장장치에 데이터를 저장해서 들고 다닐 필요가 없어졌다.
사물 인터넷 (IoT : Internet of Things)
현대에는 일반적인 사물도 인터넷에 연결되어 서비스를 창출한다. 사물 인터넷, 즉 사물이 인터넷에 연결된 시스템은 다양한 사물이 센서와 통신 기능을 내장하여 스스로 통신하며 지능적인 서비스를 제공한다.
운영체제 구성
커널과 인터페이스 (Kernel & Interface)
운영체제는 커널과 인터페이스로 구성된다. 커널(Kernel)은 운영체제의 핵심 기능을 구현한 프로그램으로 프로세스, 메모리, 저장장치 등을 관리한다. 인터페이스(Interface)는 사용자의 응용 프로그램 가까이에서 커널에 명령을 전달하고 실행 결과를 사용자와 응용 프로그램에게 반환한다. 운영체제에서는 커널과 인터페이스가 분리되어있기에 같은 커널에 다른 인터페이스를 장착할 수 있다.
시스템 호출과 디바이스 드라이버 (System Call & Device Driver)
커널 내부에는 시스템 호출과 드라이버가 존재하는데, 먼저 시스템 호출(System Call)은 커널이 자신을 보호하기 위하여 만든 인터페이스이다. 커널은 사용자 또는 응용 프로그램이 직접 컴퓨터 자원에 접근하는 것을 차단하는데 이때 시스템 호출을 이용하여 접근할 수 있다. 커널이 제공하는 write() 함수를 통하여 데이터를 저장할 수 있고, read() 함수를 통해 데이터를 읽을 수 있다. 시스템 호출과 비슷한 개념으로 "응용 프로그램 인터페이스(API: Application Programming Interface)"와 "시스템 개발자용 키트(SDK: System Developer's Kit)"가 있다.
- 응용 프로그램 인터페이스(API): 응용 프로그램이 자신과 연관된 프로그램을 개발할 수 있도록 제공하는 인터페이스
- 시스템 개발자용 키트(SDK): 프로그램 개발자를 위해 API, API 메뉴얼, 개발용 응용 프로그램까지 하나로 묶어 배포하는 개발 툴
커널과 하드웨어의 인터페이스를 디바이스 드라이버(Device Driver)라고 한다. 시스템 호출을 거치지 않고서는 커널에 진입할 수 없도록 한다. 성능 향상이나 편리성을 위하여 표준 외의 기능을 수행하는 경우, 장치 제작자가 디바이스 드라이버를 따로 준비하며 이때 사용자는 직접 디바이스 드라이버 소프트웨어를 설치해야 주변장치를 온전히 활용할 수 있게 된다.
커널의 역할과 종류
커널의 가장 중요한 역할은 여러 응용 프로그램을 실행하는 것이다. 그 외의 여러가지 커널의 역할은 다음과 같다.
- 프로세스 관리: 프로세스에 CPU를 배분하고 작업에 필요한 제반 환경을 제공한다.
- 메모리 관리: 프로세스에 작업 공간을 배치하고 실제 메모리보다 큰 가상 공간을 제공한다.
- 파일 시스템 관리: 데이터를 저장하고 접근할 수 있는 인터페이스를 제공한다.
- 입출력 관리: 필요한 입출력 서비스를 제공한다.
- 프로세스 간 통신 관리: 공동 작업을 위한 각 프로세스 간 통신 환경을 지원한다.
커널의 구현 방식에 따라 다음으로 나뉘어진다.
- 단일형 구조 커널(Monolithic Architecture): 초창기 운영체제의 구조로, 커널의 핵심 기능을 구현하는 모듈이 구분 없이 하나로 구성되어있다. 모듈이 거의 분리되어 있지 않기에 모듈 간의 통신 비용이 줄어 효율적인 운영이 가능하다. 그러나 모듈이 하나로 묶여있기에 버그나 오류를 잡기 어렵고 기능의 작은 결함이 시스템 전체로 확산될 수 있다. 또한 다양한 환경의 시스템에 적용하기 어렵다는 단점이 있다.
- 계층형 구조 커널(Layered Architecture): 비슷한 기능을 가진 모듈을 묶어 하나의 계층을 만들고 계층 간의 통신을 통해 운영체제를 구현하는 방식이다. 비슷한 기능을 모아 모듈화했기에 단일형 구조에 비해 버그나 오류를 쉽게 처리할 수 있으며 디버깅하기 쉽다.
- 마이크로 구조 커널(Micro Architecture): 마이크로 구조 커널의 운영체제는 프로세스 관리, 메모리 관리, 프로세스 간 통신 관리 등 최소한의 기능만 제공하며 운영체제의 많은 부분이 사용자 영역에 구현되어있다. 각 모듈은 세분화되어 존재하고 모듈 간의 정보 교환은 프로세스 간 통신으로 이루어진다. 각 모듈이 독립적이기에 하나의 모듈이 실패해도 전체 운영체제가 멈추지 않으며 커널이 이식하기 쉽고 가벼워서 CPU 용량이 작은 시스템에도 적용할 수 있다.