1. 운영체제 서비스
프로그램의 실행을 제어하는 기능이 구현된 함수들로 구성된 소프트웨어
컴퓨터 하드웨어와 프로그램 사이의 인터페이스
1-1. 컴퓨터 하드웨어, 운영체제, 사용자와의 관계를 표현한 계층구조
- 아래 계층: 위 계층으로 서비스 제공
- 위 계층: 아래 계층이 제공하는 서비스를 이용
- 프로그램: 유틸리티(utility)라고 부르는 시스템 프로그램과 사용자가 일상 생활에서 사용하는 응용프로그램으로 구성
1-2. 운영체제가 제공하는 서비스
운영체제는 상위 계층에게 서비스를 제공한다.
- 사람이나 프로그램의 지시에 따라 새로운 프로그램을 실행시키는 일을 한다.
- 사람이나 프로그램 대신 컴퓨터 내부 자원(resource)을 접근해준다.
- 컴퓨터에서 발생할 수 있는 각종 오류나 예외상황을 감지하고 상위 계층에게 보고한다.
- 컴퓨터 자원의 이용 현황에 대한 통계자료를 제공한다.
1-3. 컴퓨터 구조도
- 운영체제는 메모리에도 있고 보조기억장치에도 존재한다.
- 운영체제의 이미지(실행 가능한 바이너리 코드)는 전원을 끈 후에도 지워지지 않고 남아 있게 하기 위해 비휘발성 보조기억장치, 예를 들어 하드디스크에 파일 형태로 저장되어야 한다.
- 하드디스크에 저장된 운영체제 이미지가 부팅 과정을 거쳐 메모리 시작 부분에 설치된다. 마찬가지로 프로그램도 보조기억장치에 저장되어 있다가 실행되게 되면 프로그램 코드들과 데이터가 메모리에 들어간다.
- 폰 노이만 구조에 따라 소프트웨어가 실행되려면 메인 메모리에 위치해 있어야 한다. 따라서 보조기억장치에 있는 운영체제와 프로그램은 보관용일 뿐이며 이들이 실행되기 위해 메모리로 복사되어 들어온다.
1-4. 커널 (Kernel)
- 커널(kernel)이란 운영체제 중에서 핵심적이며 자주 이용되는 기능을 의미한다.
- 항상 메인 메모리에 상주하는 부분이다.
- 운영체제 중에서 메인 메모리에 읽혀 들이지 않는 부분도 있을 수 있다.
- 일반적으로는 운영체제 전체가 커널에 해당하지만 운영체제 제품에 따라서 보조적인 기능을 운영체제에 포함시키기도 한다. 운영체제 제품에 따라서 GUI(Graphical User Interface) 형식의 윈도우 관리기능이나 미디어 플레이어 또는 웹 브라우져 등의 기능을 운영체제에 포함시키기는 것이 그 예이다. 그럴 경우 일반적인 커널보다 크기가 커지게 된다.
- 보조 기능까지 모두 메인 메모리에 가져오면 제한된 크기를 가진 메인 메모리 공간이 낭비되게 되므로 이런 운영체제에서도 보조적인 기능은 보조기억장치에 놔두고 커널 부분만 메모리에 들여온다. 보조기억장치에 남겨진 보조기능은 나중에 사용할 때만 메인 메모리로 가져오면 된다.
2. 프로그램 실행 방식
2-1. Serial Processing
- 이 당시 컴퓨터는 운영체제 소프트웨어에 의해 컴퓨터 관리가 자동화되지 않은 상태이기 때문에 운영체제가 하는 일을 사람이 직접 수행했다.
- 프로그램을 메모리에 들여 오는 것, 실행을 시작시키는 것, 결과를 출력시키는 것을 시스템 관리자가 버튼을 설정하여 명령을 내리는 식으로 수동으로 조작하였다. 당연히 프로그램이 실행되기까지 준비 시간이 오래 걸렸으며 컴퓨터 운용효율이 떨어졌다.
2-2. Simple Batch Systems
- 기술이 발전하면서 사람에 의해 운영되던 것이 모니터라는 소프트웨어에 의해 대신되게 되었다.
- 모니터는 실행해야 할 사용자 프로그램을 메모리에 옮기고, 실행시킨 후, 결과를 출력하는 과정을 제어하는 소프트웨어로서, 1960년대 초 컴퓨터에서 이용되던 것이다.
- 여러 프로그램을 차례로 하나씩 실행시키는 이런 방식을 단순 일괄 처리방식(simple batch processing)이라고 부르는데, 모니터가 이런 처리의 제어를 담당한다.
- 모니터는 운영체제와 같이 메모리에 위치하면서 실행되므로 운영체제의 전신이라고 할 수 있다. 모니터가 발전하여 현대적 운영체제가 탄생한 것이다.
2-3. Uni-programming
- 모니터에 의해 프로그램이 실행되는 형식을 개념적으로 표현한 것이다.
- 유니프로그래밍 방식에서 한번에 프로그램 하나만을 실행한다.
- 프로그램 A 외에 다른 프로그램을 실행하지 않기 때문에 CPU는 놀면서 대기(wait)해야 한다. 프로세서가 놀게 되면 그 기간에는 프로세서 자원을 활용하지 못하게 되므로 CPU 활용도(processor utilization)가 저하되게 되고, 결국 좋은 운영 방식이 아니다.
- 컴퓨터 하드웨어 중에서 프로세서가 가장 비싼 자원이므로 활용도가 낮으면 컴퓨터를 효율적으로 사용하지 못한 것이다.
2-4. Multi-programming
- 멀티프로그래밍 방식은 유니프로그래밍 방식을 개선한 것이다.
- 유니프로그래밍에 비해 프로세서가 노는 시간이 짧아지고 그 결과 CPU 활용도가 높아진다.
- 운영체제 소프트웨어 구현이 복잡해진다.
- 메인 메모리의 크기가 커져야 한다. 메모리에 프로그램을 많이 가져다 놓을수록 CPU 활용도는 거의 100%에 가깝게 높일 수 있다.
2-5. Time sharing Systems
- 멀티프로그래밍 개념을 더욱 확장한 것이다.
- 컴퓨터 하드웨어 기술이 빠르게 발전함에 따라 메인 메모리 가격이 내려가면서 더 많은 수의 프로그램을 메인 메모리에 들어오는 것이 가능해 졌다.
- 프로세서가 타임 슬라이스(time slice) 또는 타임 퀀텀(time quantum)이라고 불리는 일정 시간만큼 각 프로그램을 번갈아 실행시키는 방법이다.
- 현대 컴퓨터에서 일반 사용자 프로그램을 실행하는데 이용되는 타임 슬라이스 길이는 0.1초
- 여러 프로그램들에게 짧은 시간이나마 CPU를 교대로 배분해 주기 때문에, 각 프로그램은 프로세서를 한번 받아 실행한 후 조금만 더 기다리면 자기에게 CPU가 다시 돌아오므로 마치 CPU를 항상 가지고 있는 것처럼, 자신만이 CPU를 가지고 실행된다고 생각하게 된다. 여러 프로그램들이 하나의 프로세서를, 정확히는 프로세서 시간을 공유(sharing)한다고 느끼기 때문에 방식 이름도 타임쉐어링 시스템이라고 붙여졌다.
2-6. Multi-programming VS Time sharing
1) Multi-programming : batch processing, background processing
- 멀티프로그래밍은 상대적으로 오래 실행해야 하는 프로그램들을 여러 개 모아서 차례로 실행하는데 적당하다.
- 운영체제는 대화식 CPU 활용도가 떨어질 때, 블록 큐에 들어 있는 이런 프로그램을 꺼내 실행한다. 이런 실행 방식을 배치 프로세싱(batch processing)이라고 부른다.
- 멀티프로그래밍은 반응시간이 늦기는 하지만, 운영체제가 프로그램 간 교체하는 컨텍스트 스위치 회수가 적기 때문에 운영체제의 부담이 적다.
- 단위시간 당 실행을 마친 프로그램 수를 의미하는 throughput이 타임쉐어링에 비해 높다.
2) Time sharing : interactive processing, foreground processing
- 사람이 컴퓨터 앞에서 명령을 치고 결과를 보며 대화형으로 작업하는 프로그램(예: 문서 편집기, 웹 브라우져)에 적당하다.
- 반응시간이 짧은 장점이 있어서 프로그램 실행을 요청한 사용자가 지루함을 느끼지 않고 프로그램 진행 상황이나 결과를 확인할 수 있다.
- 그러나 자주, 짧은 타임슬라이스 시간이 다 지나갈 때마다, 실행 프로그램을 교체해 주어야 해서 운영체제가 작업하는데 시간이 오래 걸리는 단점이 있다. 프로그램 간 교체를 context switch 라고 하는데 운영체제의 중요한 작업 중의 하나이다.
2-7. Process Scheduling
- 프로세스 스케줄링은 CPU 스케줄링 또는 잡 스케줄링(job scheduling)이라고도 불린다.
- CPU로 하여금 다음에 어떤 프로그램을 실행할 것인지 결정하는 일을 의미한다.
- 실행 가능한 여러 프로그램들 중에서 어느 프로그램이 프로세서 자원을 배정받을 지를 결정하는 것이며, 운영체제 내 스케줄러(scheduler)라는 함수가 제공하는 기능이다.
3. 운영체제 기능
3-1. 운영체제의 주요 기능
- 프로세스 관리
- 메인 메모리 관리
- 파일 관리
- 입출력 관리
- 보조기억장치 관리
- 네트워킹
- 정보 보안 관리
- 명령해석시스템
3-2. 네트워킹과 분산시스템
- 분산시스템을 통해 일 처리 시간을 단축하거나 다른 컴퓨터에 있는 자원을 공유하거나, 데이터나 서비스를 여러 대 컴퓨터에 중복해 제공한다. 즉 다중화한다.
- 서비스나 데이터의 가용성(availability)을 높일 수 있다. 한 서버에 고장이 생겨도 다른 서버에서 서비스를 계속할 수 있기 때문이다.
3-3. 운영체제 명령어 해석 방식
- 사용자가 내리는 명령이든, 프로그램이 내리는 명령이든 모든 명령은 시스템 콜 형태로 변환되어 운영체제에 전달된다.
1) 사용자가 운영체제게 서비스를 요청하는 방법
- 문장 형식으로 타이핑하는 방법
- 모니터 화면에 보이는 그래픽사용자인터페이스(GUI)에서 마우스를 움직여 화면에서 명령을 내리는 방법
2) 프로그램도 운영체제에게 명령을 내려 서비스를 요청하는 방법
- 시스템 콜(system call)이라는 미리 정의된 함수를 사용한다.
- 실행중인 응용프로그램에서 시스템 콜 중의 하나인 함수를 호출하면, 시스템 콜이 다시 운영체제 내부 함수들을 호출함으로써, 요청한 운영체제 서비스를 실행한다. 따라서 시스템 콜은 사용자 프로그램과 운영체제 사이의 대화 창구 역할을 한다.
3-4. 멀티프로세서 컴퓨터에서의 운영체제
- Symmetric multi processing (SMP)
- 현대 컴퓨터는 대부분 프로세서를 여러 개 가지고 있다.
- CPU를 여러 개 가진 컴퓨터를 symmetric multiprocessor 시스템이라고 부르고 이런 컴퓨터에서 프로그램을 실행하는 방식을 멀티프로세싱(multiprocessing)이라고 부른다.
- SMP 멀티프로세서 컴퓨터에는 프로세서가 여러 개 있으며, 각 프로세서가 각기 멀티프로그래밍이나 타임쉐어링 방식으로 다수의 사용자 프로그램들을 실행한다.
- 우체국 예를 들으면 창구 직원이 동시에 여러 명 있고 각 직원이 타임쉐어링으로 여러 손님들을 서비스하는 것
- 운영체제는 각 프로세서에게 실행할 프로그램을 지정해 준다. 예를 들어, 첫 번째 프로세서에게 사용자 프로그램 1,2,3번을 타임쉐어링 방식으로 실행하게 하고 두 번째 프로세서에게 프로그램 4,5번을 멀티프로그래밍으로 실행하도록 지시할 수 있다.
- 프로세서는 운영체제의 지시에 따라 메모리에 위치한 해당 프로그램의 명령어를 자신 프로세서에 가져와 실행시킨다.
- 멀티프로세서 컴퓨터에서 프로그램을 실행하는 하드웨어인 프로세서가 여러 개일 뿐이며 이들을 관리하는 운영체제는 하나이고 그 운영체제가 각 하드웨어에게 작업 지시를 하는 것이므로 단일 프로세서 컴퓨터에서의 프로그램 실행 방식과 크게 다르지 않다.
3-5. 멀티프로그래밍과 멀티프로세싱의 차이
- Concurrent programming: CPU 1개가 여러 개의 프로그램을 왔다 갔다 실행하지만 어느 순간에는 꼭 프로그램 하나만 실행한다 (Interleaving)
- Parallel programming : 전체적으로는 멀티프로세싱으로 실행하는데 각 프로세서 하나 입장에서 보면 멀티프로그래밍으로 실행하는 것이다. (Interleaving and Overlapping)
3-6. 운영체제의 구조
- 커널이라는 소프트웨어를 구현할 때, 어떤 구조로 하느냐에 따라 monolithic kernel 구조와 micro kernel 구조로 구분할 수 있다.
1) Monolithic Kernel
- 커널의 주요 기능이 커널 내부에, 즉 커널 모드에서 실행되도록 구현된 구조이다. 프로세스 관리, 메모리 관리, 파일 시스템, 프로토콜 스택 등이 모두 커널 모드에 구현되어 있다.
- 마이크로 커널 구조의 운영체제에 비해 운영체제 실행속도가 빠르므로 컴퓨터 성능이 우수하다.
- 유닉스와 리눅스 운영체제는 이 구조를 따른다.
2) Micro Kernel
- I/O 관리, 파일 관리와 같은 전통적인 운영체제 기능이 커널 내부에 존재하는 것이 아니라, 커널 외부로 옮겨서 사용자 프로그램(서버 프로세스) 형태로 실행된다.
- 운영체제의 기능을 일반 사용자 프로그램처럼 운영체제 외부로 옮겼기 때문에 운영체제 자체는 기본적인 기능만 남아서 크기가 작아진 것이다.
4. 운영체제 종류
4-1. 대표적인 운영체제의 종류
- Unix
- Linux
- Windows