Priv's Blog
2. 운영체제 본문
1. 운영체제 개념 및 발전 목적
1.1) 운영체제의 역할
컴퓨터 시스템은 사용자, SW, HW 3가지로 구성되어 있다.
여기서 운영체제의 역할은 다음과 같다.
- 다양한 응용프로그램(SW)이 HW 자원을 효율적으로 사용하도록 관리 및 조정
- 시스템을 편리하게 사용하도록 HW, 사용자, 응용 프로그램, 시스템 프로그램 사이의 인터페이스 제공
- 프로그램의 실행 제어
- 다양한 사용자에게서 컴퓨터 시스템을 보호하기 위한 입출력 제어 및 데이터 관리
1.2) 운영체제의 정의
운영체제는 역할과 기능이 매우 다양하기 때문에 완벽한 정의가 어렵다.
일반적으로 사용되는 '운영체제'의 정의는 다음과 같다.
- 응용 프로그램이 HW와 상호 작용할 수 있도록 지원하는 SW.
- 응용 프로그램의 실행을 제어, 자원 할당 및 관리, 입출력 제어 및 데이터 관리 등의 서비스를 제공하는 SW.
- 사용자와 HW 사이의 중간 매개체.
1.3) 운영체제의 주요 구성 요소
운영체제를 이루는 구성 요소는 다음과 같다.
- 커널: 운영체제의 핵심 구성 요소로서, 메인 메모리에 상주한다. 프로세스 스케줄링, 메모리 관리 등의 핵심적인 기능들을 수행한다. 운영체제의 나머지 부분(장치 드라이버, 사용자 인터페이스, 시스템 유틸리티 등)을 수행하는 데 필요한 환경을 설정한다.
- 장치 드라이버: 특정 하드웨어나 장치를 사용할 때 필요한 구성 요소들을 포함한다. 프로그램이 드라이버의 명령어를 호출하면, 드라이버가 해당 장치에게 명령어를 전달한다.
- 사용자 인터페이스: 컴퓨터를 사용하는 사용자에게 편의성을 제공하기 위한 환경을 구성한다. CLI(Command Line Interface) 또는 GUI(Graphic User Interface) 등이 있다.
- 시스템 유틸리티: 컴퓨터 시스템을 사용하는데 필요한 기타 프로그램들을 포함한다. 컴퓨터를 사용하는데 필수적이지는 않지만, 컴퓨터를 이용하는 주목적에 대한 부차적인 요소들을 처리하는 데 사용된다. 컴퓨터 최적화 프로그램(디스크 조각 모음 등)이나 화면 보호기 등을 비롯한 기타 소프트웨어들이 이에 해당한다.
2. 운영체제의 발전 목적
운영체제의 발전 목적은 크게 편리성, 효율성, 제어 서비스 향상으로 나눠진다.
- 편리성: 운영체제는 사용자에게 편리한 환경을 제공해야 한다.
- 효율성: 운영체제는 컴퓨터 시스템의 자원을 효율적으로 활용하여 시스템의 성능을 향상해야 한다. (처리량 향상, 지연/응답 시간 단축, 신뢰도 향상, 사용 가능도 향상 등)
- 제어 서비스 향상: 입출력 장치의 동작을 관리 및 제어하는 서비스의 품질을 향상해야 한다. 이는 시스템의 오류를 예방하는 역할을 한다.
3. 운영체제의 기능
운영체제의 기능은 크게 자원 관리와 시스템 관리로 나눠진다.
자원 관리 기능은 다시 메모리 관리, 프로세스 관리, 주변 장치 관리, 파일 관리로 나눠진다.
시스템 관리 기능은 다시 시스템 보호, 네트워킹, 명령 해석기로 나눠진다.
3.1) 자원 관리
메인 메모리를 관리하기 위한 운영체제의 기능은 다음과 같다.
- 메인 메모리의 어느 부분을 누가 사용하는지 점검한다.
- 메인 메모리에 저장할 프로세스를 결정한다.
- 메인 메모리를 할당하고 회수하는 방법을 결정한다.
보조 기억 장치를 관리하기 위한 운영체제 기능은 다음과 같다.
- 빈 여유 공간을 관리한다.
- 새로운 파일 작성 시 자정 장소를 할당한다.
- 기억 장치 접근 요청을 스케줄링한다.
- 파일을 생성하고 삭제한다.
프로세스를 관리하기 위한 운영체제의 기능은 다음과 같다.
- 프로세스와 스레드 스케줄링을 관리한다.
- 사용자 프로세스와 시스템 프로세스를 생성 및 제거한다.
- 프로세스를 중지, 재수행한다.
- 프로세스 동기화 방법을 제공한다.
- 프로세스 통신 방법을 제공한다.
- 교착 상태 방지 방법을 제공한다.
운영체제는 특수 프로그램, '장치 드라이버'를 사용하여 입출력 장치와 상호작용할 수 있다.
주변 장치(입출력 장치) 관리를 위한 운영체제의 기능은 다음과 같다.
- 임시 저장(Buffer-Caching) 시스템 기능을 제공한다.
- 일반 장치용 드라이버 인터페이스를 제공한다.
- 특정 장치 드라이버를 제공한다.
컴퓨터 시스템은 물리적으로 다양한 매체에 정보를 저장할 수 있다.
운영체제는 데이터를 효율적으로 사용할 수 있도록 파일이라는 단일한 저장 형태를 제공한다.
파일 관리를 위한 운영체제 기능은 다음과 같다.
- 파일을 생성하고 삭제한다.
- 디렉터리를 생성하고 삭제한다.
- 보조 기억 장치의 파일을 맵핑한다.
- 안전한(비휘발성) 저장 장치에 파일을 저장한다.
3.2) 시스템 관리
운영체제는 파일 사용 권한 부여, 데이터 암호화 등의 서비스도 제공한다.
다만 여러 프로세스를 동시에 실행할 수도 있으므로, 발생할 수 있는 문제를 방지하기 위해 상호 보호가 필요하다.
네트워크를 통해 연결된 프로세서가 통신을 할 때는 경로 설정, 접속 정책, 충돌, 보안 등을 고려하여 관리해야 한다.
명령 해석기는 운영체제에서 중요한 시스템 프로그램이다. (Windows의 CMD 등)
대화형으로 입력한 명령어를 이해하고 실행하는 사용자와 운영체제의 인터페이스이다.
사용자가 입력한 명령을 운영체제에 전달하는 역할을 수행한다.
명령 해석기의 인터페이스 변경이 가능하도록 만들기 위해서는 커널과 분리하는 것이 좋다.
4. 운영체제의 발전 과정
4.1) 1940년대: 운영체제 없음(작업별 순차 처리)
초기 컴퓨터는 운영체제를 포함하지 않았다.
사용자가 기계어로 직접 프로그램을 작성한 후, 실행하는 작업별 순차 처리 시스템을 사용했다.
컴퓨터에 필요한 모든 작업들을 프로그램에 포함했다.
(명령어 저장 방법, 계산 대상, 결과 저장 위치와 방법, 출력 시점과 위치 등을 명령어로 명시적 표현함)
각 작업 실행을 위한 준비 시간이 소요되었다.
4.2) 1950년대: 일괄 처리 시스템(Batch-Processing System)
초기에 등장한 운영체제는 단일 스트림 일괄 처리 시스템 구조를 띄고 있었다.
이 시스템 구조는 1번에 1가지 작업만 수행할 수 있다.
작업을 올리는 시간과 해제하는 시간을 줄이는 데 집중하기 위해 사용자의 작업 요청을 즉시 처리하지 않고 일정 기간 또는 일정량이 될 때까지 대기 후, 한꺼번에 처리하는 방식을 사용하였다.
이 당시의 작업은 오프라인 장치(펀치 카드)에 기록 후, 오퍼레이터에 제출하는 방식이었다.
오퍼레이터는 비슷한 작업들을 그룹으로 묶어서 한꺼번에 처리했다.
이 방식은 많은 사용자와 프로그램이 컴퓨터 자원을 공유할 수 있다.
또한 시시각각 수동으로 개입, 감독하여 컴퓨터 자원 유휴를 피할 수 있다.
하지만 비슷한 작업들이 모이기를 기다리므로 생산성이 낮고, 각 사용자의 작업 요청이 즉각 처리되지 않으므로, 작업 제출에서 결과를 얻을 때까지 시간이 오래 걸린다.
또한 작업 우선순위를 부여하는 작업이 곤란해질 수 있다.
이러한 문제점들을 보완하기 위해 모니터링, 버퍼링, 스풀링 등 여러 개선 방안들이 등장하였다.
모니터링이란, CPU를 지속적으로 관찰, 작업 순서를 자동으로 바꾸는 것을 말한다.
버퍼링이란, CPU가 작업을 처리하는 동안, 다음 처리할 작업을 입력 장치로부터 미리 읽어서 버퍼에 저장해두는 동작을 의미한다.
버퍼란, 프로세서가 작업을 처리하는 동안 다음에 처리할 작업(또는 출력할)을 미리 저장해두는 장소이다.
버퍼는 프로세서와 입출력 장치의 유휴 시간을 줄일 수 있어 빠른 프로세서와 느린 입출력 장치 사이의 속도 차를 보완하기 위해 사용된다.
버퍼를 사용하면 어떤 한 작업에 대해 프로세서가 연산을 수행하는 것과 동시에, 입출력 장치는 입출력 작업을 수행할 수 있다.
다만 입력 버퍼가 비거나, 출력 버퍼가 가득 차면 프로세서는 대기해야 한다.
스풀링이란, 속도가 빠른 디스크를 매우 큰 버퍼처럼 사용하여 빠른 프로세서와 느린 입출력 장치 사이의 속도 차이를 보완하는 것을 말한다.
하나의 입출력 작업과 그 작업의 계산만 할 수 있는 버퍼링과 달리 스풀링은 여러 작업의 입출력과 계산을 함께 할 수 있다.
4.3) 1960년대: 다중 프로그래밍, 시분할, 다중 처리, 실시간 시스템
다중 프로그래밍이란, CPU 작업과 입출력 작업을 병행하는 시스템을 말한다.
여러 프로그램을 메모리에 나눠서 적재한 후, 프로세서를 번갈아 할당하는 방식을 사용한다.
시분할 시스템이란, 다중 프로그래밍 시스템에서 프로세서 시간을 잘게 나누어 스케줄링하는 시스템을 말한다.
이 시스템은 대화식 컴퓨팅을 지원한다.
다중 처리 시스템이란, 1개의 시스템에서 프로세서 여러 개를 사용하여 병렬 처리 기법을 활용하여 처리 능력을 높인 시스템을 말한다.
실시간 처리 시스템이란, 데이터를 입력과 동시에 실시간으로 즉시 처리하는 시스템을 말한다.
즉각적인 응답이 필요한 조건에서 사용한다.
4.4) 1970년대 초: 다중 모드, 범용 시스템
IBM System/360 계열의 컴퓨터가 이에 해당한다.
범용 시스템은 모든 사용자에게 모든 기능을 제공할 수 있도록 설계된 시스템이다.
다중 모드 시스템은 일괄 처리, 시분할 처리, 다중 처리를 모두 제공하는 시스템이다.
다양한 기능을 제공한다는 장점이 있었지만, 사용을 위해서는 고도의 훈련이 필요한 복잡한 고가의 시스템이었다.
4.5) 1970년대 중반 ~ 1990년대: 분산 처리 시스템, 병렬 계산, 분산 계산
네트워크 기술의 발전으로 여러 시스템과 원격 통신이 가능해졌다.
그와 동시에 정보 보호가 주요 관심사로 떠올랐으며, 분산 처리 개념이 이때 확립되었다.
소형 컴퓨터 CPU, 마이크로프로세서 기술의 발전으로 개인용 컴퓨터(PC)가 보급되기 시작했다.
PC에는 상대적으로 단순한 운영체제가 사용되었다.
성능은 낮지만, 개인이 시스템을 독점하므로 빠른 응답 시간을 기대할 수 있었다.
또한 상대적으로 적응이 쉬운 그래픽 유저 인터페이스(GUI)가 발전하기 시작했다.
4.6) 2000년대 이후: 모바일, 임베디드, 가상화 및 클라우드 컴퓨팅
스마트폰, 태블릿 PC 등의 모바일 기기가 보급되기 시작했다.
모바일 운영체제와 사물 인터넷 기술 등이 등장하였다.
1960년대 후반에 등장한 가상화 기술이 확산되었다.
여러 운영체제가 한 시스템의 자원을 공유할 수 있게 해주는 서버 가상화 기술이 확산되었다.
클라우드 컴퓨팅 기술이 등장하였다.
서버 가상화란, 물리적 서버 하나에 가상 서버를 여러 개 구성하는 방법이다.
사버 하나에 각각의 응용프로그램과 운영체제를 독립적으로 사용할 수 있다.
여러 운영체제가 하나의 시스템 자원을 공유한다.
5. 운영체제의 유형
운영체제의 유형은 일괄 처리 시스템, 다중 프로그래밍 시스템, 다중 처리 시스템, 시분할 시스템, 실시간 처리 시스템 분산 처리 시스템으로 나눠진다.
컴퓨터 시스템의 발전 과정과 용도에 따라 유형이 구분된다.
5.1) 일괄 처리 시스템
1개의 작업이 끝날 때까지 다른 작업을 시작할 수 없다.
프로세서, 메모리 활용도가 떨어진다.
5.2) 다중 프로그래밍 시스템
프로세서가 쉬지 않고 항상 수행할 프로그램을 가지도록 한다.
프로세서 사용률을 높일 수 있다.
다중 프로그래밍 시스템의 작업 처리 방법은 다음과 같다.
- 메인 메모리에 여러 프로그램을 두고, 운영체제가 메인 메모리에 있는 프로그램 중 1개를 선택해 실행
- 실행 중인 프로그램이 어떤 일을 기다려야 하는 경우, 프로세서가 유휴 상태가 된다.
그 대신, 메인 메모리에 있는 다른 프로그램을 선택해 실행한다.
다중 프로그래밍 운영체제는 구조가 복잡하다.
여러 프로그램을 메모리에 두기 위한 메모리 관리 기능이 필요하다.
여러 프로그램 중 1개를 선택하기 위한 결정 방법을 정의해야 한다.
5.3) 시분할 시스템
다중 프로그래밍을 논리적으로 확장한 개념이다.
프로세서 시간을 잘게 분할하여 할당함으로써, 여러 프로그램들을 교대로 실행한다.
짧은 간격으로 프로세서를 번갈아 할당하므로, 혼자 프로세서를 독점한 것처럼 보인다.
다수의 사용자가 동시에 컴퓨터 자원을 공유할 수 있도록 한다.
대화식 시스템을 구현할 수 있다.
(사용자가 운영체제나 프로그램에 직접 명령을 주고 즉시 응답을 받도록 만들 수 있음)
1960년 이전에 제안되었으며, 초기에 개발된 시스템 중 하나가 MIT에서 개발된 CTSS이다.
현재 대부분의 시스템이 다중 프로그래밍과 시분할 방법을 모두 지원한다.
다중 프로그래밍 시스템과 시분할 시스템의 공통점은 메인 메모리에 여러 프로그램을 적재하므로 메인 메모리 관리 기능이 필요하다는 것이다.
어떤 프로그램을 먼저 실행할 것인지 결정하는 스케줄링 개념이 필요하다.
다중 프로그래밍 시스템과 시분할 시스템의 차이점은 시스템의 목표에 있다.
다중 프로그래밍 시스템의 목표는 프로세서 사용률 최대화이지만, 시분할 시스템의 목표는 응답 시간 최소화이다.
5.4) 다중 처리 시스템
단일 컴퓨터 시스템 내에서 2개 이상의 프로세서를 사용하여 동시에 2개 이상의 프로그램을 실행한다.
여러 프로세서가 시스템 버스, 클록, 메모리, 주변 장치 등을 공유한다.
속도가 빠르고, 프로세서 1개가 고장 나도 다른 프로세서를 사용해 작업을 계속하므로 신뢰성이 높다.
프로세서 간의 연결, 상호작용, 역할 분담 등을 고려해야 한다.
다중 처리 시스템을 구성하는 방법에는 비대칭적(주종적) 구성과 대칭적 구성이 있다.
5.5) 대칭적 다중 처리 시스템
여러 개의 프로세서들이 입출력 장치와 메인 메모리를 동일한 계열에서 서로 공유하며 작업한다.
5.6) 비대칭적(주종적) 다중 처리 시스템
마스터 프로세서가 여러 개의 슬레이브 프로세서들을 관리, 제어한다.
입출력 장치와의 상호작용은 마스터 프로세서를 통해서만 가능하다.
메인 메모리 접근은 슬레이브, 마스터 프로세서 모두 가능하다.
5.7) 실시간 처리 시스템
프로세서의 작동이나 데이터의 흐름에 엄격한 시간적 제약이 있는 경우에 사용하는 시스템이다.
필요할 때 즉시 사용할 수 있어야 하며, 빠른 응답이 중요하다.
상시 대기 상태를 갖추어야 하므로 자원 활용도가 높지 못하고, 비용이 많이 든다.
5.8) 경성 실시간 시스템(Hard-Real Time System)
작업의 실행 시작, 완료에 대한 시간 제약 조건을 지키지 못할 때, 시스템에 치명적인 영향을 주는 실시간 처리 시스템이다.
무기 제어 시스템, 발전소 제어 시스템, 철도 자동 제어 시스템 등이 이에 해당한다.
5.9) 연성 실시간 시스템(Soft-Real Time System)
작업 실행에서 시간 제약 조건은 있으나, 이를 지키지 못하는 상황이 시스템에 치명적인 영향을 주지는 않는 실시간 처리 시스템이다.
동영상 재생 프로그램 등이 이에 해당한다.
5.10) 분산 처리 시스템(Distributed Processing System)
시스템마다 운영체제와 메모리를 가지고, 독립적으로 운영되며 필요할 때 통신하는 시스템이다.
여러 물리적 프로세서에 연산을 분산함으로써, 자원을 공유하고 연산 속도와 신뢰성을 향상한다.
데이터를 여러 위치에 저장, 처리하므로, 여러 사용자가 공유할 수 있다.
6. 운영체제의 서비스
운영체제 기능을 수행하기 위해 다양한 서비스가 제공된다.
- 부팅 서비스: 컴퓨터 HW를 관리, 프로그램을 실행할 수 있도록 컴퓨터를 시동
- 사용자 서비스: 사용자가 작업을 쉽게 수행할 수 있도록 지원
- 시스템 서비스: 시스템의 효율적인 동작을 보장
- 시스템 호출: 프로그램과 운영체제 사이의 인터페이스 제공
6.1) 부팅 서비스
운영체제를 메인 메모리에 적재하는 과정.
부트 로더(Bootstrap Loader)란, ROM에 고정한 소규모 프로그램으로, 보조 기억 장치에 저장된 운영체제를 메인 메모리에 적재하는 역할을 수행한다.
부팅 서비스 실행 과정은 다음과 같다.
6.2) 사용자 서비스
사용자가 작업을 쉽게 처리하도록 도와주는 서비스로, 다음과 같은 작업들을 수행한다.
- 사용자 인터페이스를 제공한다. (CLI, 메뉴 인터페이스, GUI 등)
- 프로그램을 실행한다. (프로그램을 메모리에 적재, 프로세서 시간 할당)
- 입출력 동작을 수행한다. (입출력 동작을 직접 수행할 수 없는 사용자 프로그램에게 방법 제공)
- 파일 시스템을 조작한다.
- 통신(네트워크)을 처리한다.
- 오류를 탐지한다. (HW 오류 또는 사용자 프로그램 오류 등)
6.3) 시스템 서비스
시스템 자체의 효율적인 동작을 보장하는 서비스로, 다음과 같은 작업들을 수행한다.
- 자원을 할당한다. (다수의 프로그램에 시스템 자원을 할당)
- 계정을 관리한다. (각 사용자의 자원 사용 정보를 저장 및 추적)
- 프로세스 상호 보호 및 보안을 관리한다. (프로세스를 다른 사용자 프로세스로부터 보호, 운영체제 권한을 부여한 프로세스에게 자원 사용 허가, 잘못된 접근 시도 방어, 사용자 인증 요구 등)
6.4) 시스템 호출 서비스 (API: Application Programming Interface)
실행 중인 프로그램과 운영체제 사이의 인터페이스를 의미한다.
사용자 프로그램은 시스템 호출을 통해 운영체제 서비스를 받는다.
시스템 호출 방법은 다음과 같이 2가지로 나눠진다.
- 프로그램에서 명령 또는 서브 루틴 호출 형태로 실행
- 시스템에서 명령 해석기를 통해 대화 형태로 호출
7. 운영체제의 구조
운영체제는 크고 복잡한 SW 시스템이다.
복잡한 구조를 관리/변경이 쉽도록 설계하는 것이 중요하다.
운영체제의 구조는 다음과 같이 3가지로 나눠진다.
- 단일 구조 운영체제
- 계층 구조 운영체제
- 마이크로커널 구조 운영체제
7.1) 단일 구조 운영체제
단일/모놀리식 커널 구조는 초기 운영체제 구조에 해당한다.
운영체제의 모든 구성 요소들이 커널에 포함되어 있는 형식이다.
작고 간단하며 시스템 기능이 제한된 운영체제의 구조이다. (MS DOS 등)
운영체제 대부분의 기능이 프로시저의 집합으로 커널에 구현되어 직접 통신하므로, 효율이 높다.
커널 크기가 상대적으로 커지므로 버그의 원인, 기타 오류를 구분하기가 어렵다.
새로운 기능 추가를 위한 수정, 유지 보수가 어렵다.
모든 운영체제 구성 요소들이 컴퓨터 시스템에 제한 없이 접근 가능하므로, 오류와 악성 코드에 취약하다.
7.2) 계층 구조 운영체제
계층 구조란, 유사한 기능을 수행하는 요소들을 그룹으로 묶어 계층을 구분지은 구조이다.
각 계층들은 바로 상위 또는 하위 계층과 상호작용할 수 있다.
하위 계층은 구체적인 구현을 숨기고, 인터페이스만 제공한다.
모듈화가 잘 이루어져 있어 시스템 설계/구현이 단순하다.
하위 계층이 제공하는 연산만 사용해 구현되므로, 해당 계층은 연산 과정을 알 필요 없이, 연산 목적만 알면 된다.
시스템 검증 및 오류 수정이 쉽다.
하위 계층 오류가 수정되면 기능이 정확하다고 가정하며 다음 계층을 만드므로, 오류가 발견된 특정 계층만 수정하면 해결 가능하다.
사용자 프로세스의 요청을 수행하는 데 많은 계층을 거쳐야 하므로 성능이 떨어진다.
계층을 정의하기 어렵다.
각 계층은 자신의 하위 계층만 사용 가능하므로, 설계에 신중해야 하지만, 모두 명확하게 정의할 수 없다.
7.3) 마이크로 커널 구조
커널에는 최소 기능만 포함하여 크기를 줄이고 운영체제의 기타 기능은 사용자 공간으로 옮겨 사용자 모드에서 실행하는 서버로 구현한다.
커널은 하드웨어 초기화, 메모리 관리, 프로세스 관리, 프로세스 간 통신 등 기본 기능만 수행하는 부분이다.
사용자 영역의 서버(커널 외부)는 네트워크 시스템, 파일 시스템 상호 작용, 장치 관리 등 대부분의 운영체제 구조를 포함한다.
커널이 가볍다.
운영체제가 제공하는 서비스를 사용자 영역의 독립 서버에서 수행하므로, 서버에서 잘못 수행해도 다른 서버, 커널에 치명적인 영향을 미치지 않는다.
운영체제의 많은 기능들을 사용자 영역 서버로 구현하므로, 운영체제 기능 개발이나 변경이 쉽다.
사용자 영역에서 수행 중인 서버들 사이에 빈번한 프로세스 통신으로 성능 저하 가능성이 있다.
응용 프로그램과 서버 간의 자료 교환을 위해 커널을 출입하는 문맥 교환 때문에 속도가 느리다.
수고하셨습니다!
'Dev. Study Note > OS Introduction' 카테고리의 다른 글
6. 프로세스 스케줄링 (0) | 2021.11.04 |
---|---|
5. 교착 상태와 기아 상태 (0) | 2021.10.16 |
4. 병행 프로세스와 상호 배제 (0) | 2021.10.12 |
3. 프로세스와 스레드 (0) | 2021.10.12 |
1. 컴퓨터 시스템 (0) | 2021.10.04 |