[운영체제] 개요
운영체제 개요
운영체제란?
운영체제를 간단히 설명하면, 입/출력, 하드디스크가 메인보드에 연결되서 프로그램이 실행될 때, 이런 하드웨어를 지시하고 조정하는 주체입니다.
운영체제를 공부하면 응용 프로그램을 구현할 때 안정성과 속도 개선 측면에서 이점이 있습니다.
컴퓨터 시스템 역할
컴퓨터 시스템의 역할은 6개 있습니다.
- Booting
- Running (Process or memory management)
- Controlling (Process scheduling)
- Receiving(input), Printing(output) (I/O device management)**
- Shutting
OS의 구조(간략히 설명)
(Application program - utility program) - OS - 컴퓨터 하드웨어의 계층구조를 가집니다.
프로그램 입장에서 하드웨어를 이용해야 하는데, 하드웨어를 컨트롤 하는 건 어렵기에 중간 계층(interface)인 OS를 이용합니다.
service
OS가 프로그램에게 기능을 제공하는 것을 service라고 합니다.
제공하는 서비스는 크게 4가지로 구성되어 있다.
- Program execution
- Access to computer resources (하드웨어, data 등)
- Error detection and response
- Accounting (통계 자료 수집, 퍼포먼스 모니터) ex) 작업 관리자
컴퓨터 구조
운영체제는 컴퓨터 구조 지식 또한 요구합니다.
복습을 해보자면, 컴퓨터 구조에서는 프로세서(CPU)와 메인 메모리, I/O controller 들이 bus로 연결되있습니다.
OS는 보조기억장치 스토리지에 들어가있고, 메인 메모리에 로드됩니다..
여기서, OS가 메인 메모리에 로드되는 부분에 대해 의아할 것인데, 이는 폰 노이만 컴퓨터 구조에서 프로그램이 실행되려면, 프로그램이 메인 메모리에 있어야 하기 때문입니다.
여기서, OS는 보조기억장치에 있으므로, 복사(초기화, 설정)를 수행합니다.
이 과정에서 운영체제 기능 중 반드시 메모리에 상주하는 부분을 kernel 이라고 합니다.
따라서 엄밀하게는 kernel != OS이지만, 적어도 이 과목을 공부할 때는 kernel == OS라고 같은 의미로 생각해도 됩니다.
컴퓨터 내부에서 프로그램 실행하기
serial processing
os가 없던 시절에서는 사람이 일일히 operation을 했는데
당연하게도 이는 준비 시간이 너무 크기 때문에, 자동화 할 수 있는 방법이 고안되었습니다.
그것이 바로 모니터라는 소프트웨어입니다.
monitor
메인 메모리안에 monitor라는 소프트웨어가 올라가서, 메인 메모리 남은 부분에 사용자 프로그램이 로드되어 동작되는 방식입니다.
따라서 모니터 소프트웨어는 사용자 프로그램을 제어하는 소프트웨어이고, OS의 아버지격 프로그램입니다.
uni-programming
이러한 모니터를 이용하면 여러 개의 프로그램을 묶어서 일괄 처리할 수 있고, 이를 simple-batch system이라고 합니다.
이러한 시스템은 프로세스를 수행할 때 한 번에 하나씩 메인 메모리로 로드해 수행하는 uni-programming으로 동작합니다.
이제 어떤 프로세스를 수행할 때 CPU의 활용도(utilization)을 계산하려 한다 해봅시다.
컴퓨터를 다룰 때, 보통 입/출력에 소요되는 시간은 cpu 연산보다 매우 느리다는 것입니다..
따라서 입/출력 wait시간을 포함하면, 활용도(utilization) 수치가 정말 낮습니다.
multi-programming
이 문제를 해결하기 위해, waiting할 때 다른 프로세스 실행하는 것은 어떨까요? 그렇다면 utilization 수치를 높일 수 있을 것입니다..
하지만, 멀티 프로그래밍은 모니터 프로그램만으로는 할 수 없습니다.
멀티 프로그래밍은 uni-프로그래밍에 비해 두 가지를 요구하는데,
첫 번째로, 여러 개의 프로그램이 메인 메모리에 상주해야 하므로 큰 메인 메모리 용량을 요구합니다.
두 번째로, 만약 프로그램 a를 실행하지못할때 (terminate, wait) 다음 프로그램으로 무엇을 택해야 할때, 이러한 선택을 os에서 해야하고 그에 대한 기준이 필요합니다.
이를 process scheduling이라고 합니다.
process scheduling은 kernel function으로 수행되고, 스케쥴링의 기준은, 들어온 순서 or 우선순위.. 로 할 수 있고, 이는 나중에 자세히 다룰 예정이다.
정리하면, 멀티 프로그래밍의 trade-off 관계는 다음과 같습니다.
메인 메모리 크기, os에 process scheduling 기능 추가 vs 멀티프로그래밍
Timesharing
Multi-programming 개념을 확장해보자,
이전에서는 프로그램이 wait, terminate 될 때까지 계속 서비스를 받고 다음 프로그램으로 넘기지만,
Time sharing에서는 각 프로그램에 대해 일정한 시간을 부여하여 이러한 일정 시간이 끝났을 경우 다른 프로그램이 동작되도록 하는 방식입니다. (번갈아가면서 실행)
이러한 일정한 시간을 time slice, time quantum이라고 하고, 보통 1/10sec, 100ms입니다.
이러한 방식은 각 프로그램이 내가 CPU를 혼자 쓰고 있다는 착각을 줍니다(Good Effect).
이는 프로그램의 response time(처음 실행되기 까지 기다려야 하는 시간, 반응 시간)을 줄여줍니다.
Multiprogramming vs Timesharing
이 중에서 어느 것이 무조건 좋다기 보단, 서로 장단점이 있습니다.
오래 실행해야 하는 프로그램이고 여러 개 모아서 한 번에 실행해야 할 때, Multiprogramming이 유리하고,
빠른 반응을 요구(interactive)하는 프로그램이면, Timesharing이 유리합니다=.
항목 | Multiprogramming | Timesharing |
---|---|---|
사용 목적 | 배치 처리 (Batch processing), 백그라운드 처리 | 상호작용(대화형) 처리 (Interactive processing), 포그라운드 처리 |
오버헤드 | Timesharing보다 적음 | Multiprogramming보다 많음 |
성능 특성 | 처리량(Throughput)이 좋고 프로세서 활용도(Utilization)이 높음 | 반응 시간(Response time)이 더 짧음 |
용어 정리:
Throughput: 단위 시간당 완료된 작업 수
Response time: 사용자가 명령을 내린 순간부터 실행이 시작되기까지의 시간
여기서 오버헤드가 발생하는데 왜 발생하냐면, Context switch로 인해 발생합니다. Context switch에 대해서도도 나중에 설명합니다.
정리하면, Time sharing이 Multiprogramming에 비해 Context switch가 많이 발생한다는 것을 유추할 수 있습니다.
Symmetric multiprocessing(SMP)
현대 컴퓨터는 프로세서(CPU)를 여러 개 가지고 있습니다.
각 프로세서가 사용자 프로그램을 실행하는데 이용되면(같은 함수를 실행할 수 있으면) 이를 SMP라고 부릅니다..
만약, 프로세서간에 하는 일이 다르다면, 비대칭형 멀티프로세싱이라 합니다.
만약 CPU가 여러 개라면 OS는 여러 개인가요? 아닙니다! OS는 하나입니다.
유의할 점은, Multi-programming(CPU 한 개가 번갈아가면서 실행)과 Multi-processing(CPU 여러 개, 여러 개의 프로그램이 동시에 진행)은 다르다는 것입니다.
Multi-programming은 Concurrent programming이라고도 하고,
Multi-processing은 Parallel programming이라고도 합니다.
운영체제 내부 기능
정리
운영체제 내부 기능은 크게 4가지로 나눌 수 있습니다.
- 관리 기능 (프로세스, 메인 메모리, 파일, 입출력, 보조기억장치) (나중에 배움!)
- 보호, 보안 관리 기능 (컴퓨터 보안에서 배움!)
- Networking (컴퓨터, 데이터 통신에서 배움!)
- Command-Interpreter System(명령 해석)
관리 기능에 대해 자세히 들어가기 전에 앞서, 용어를 정리한다.
Networking 과 Distributed Systems
분산 시스템은 개별적인 컴퓨터들을 컴퓨터 네트워크로 묶어 하나의 응용프로그램을 실행하는 시스템입니다.
각 컴퓨터들은 자체 하드웨어와 운영체제를 지니고 있고, 분산 처리를 위해 한 소프트웨어가 있으며, 이는 각 컴퓨터의 운영체제 위에 탑재된다.
이러한 분산 시스템의 컴퓨터들은 통신 네트워크를 통해 연결되어있으며, 통신은 프로토콜을 이용해 이루어집니다.
옛날 초/중고등학생에서 컴퓨터실에서 친구들과 스타를 할 수 있지 않았나요? 바로 그게 프로토콜 통신입니다.
이러한 분산 시스템은 다음과 같은 3가지의 장점을 지닙니다.
- 처리 속도 증가(Computation speed-up)
- 데이터 가용성 증가(Increased data availability)
- 신뢰성 증가(Enhanced raliability)
Command-Interpreter System
사람이 내리는 명령을 어떤 의미인지 해석하고, 명령을 수행하기 위한 함수를 실행하는 것을 CIS라고 합니다.
Interface에 따라서 CLI(Command Line interface), Graphical User Interface(GUI)로 구별됩니다..
CLI에서 앞에 username@ubuntu:~
같은 것을 prompt라고 하고, 이는 명령어를 쳐도 되는 상태를 의미합니다.
명령어가 주어지면 문법에 대한 검사를 수행하고, 실제 명령어를 수행하는 윈도우의 어떤 함수에 전달합니다.
근데 사람이 아니라, 프로그램이 OS에게 어떤 명령을 내리고 싶다면, 이럴 때는 어떻게 해야 할까요?
이럴 때 바로, System call을 이용하는 것입니다.
System call
함수의 집합인데, 미리 어떤 기능을 수행하도록 정의된 함수입니다.
실행 중(Running)인 프로그램에서 System call을 Function Call을 한다면, 운영체제의 서비스를 실행하게 됩니다.
정리하면, Running program(Application program)과 OS의 중간 다리(interface) 역할을 수행합니다.
사실, CIS도 결국 System call을 부르는 것입니다.
결국 사람이든, 프로그램이든 OS(컴퓨터)에 명령을 전달하는 유일한 방법은 System call을 이용하는 것입니다..
커널의 구조
커널에는 다양한 설계 방식이 있지만, 대표적으로 2가지가 있습니다.
- monolithic kernel 운영체제의 모든 주요 기능을 하나의 커널 공간 내에 구현합니다.
특징: 운영체제 속도가 빠름, 성능이 우수, 유지보수 어려움
- micro kernel 운영체제의 일부 기능을 사용자 공간에서 별도의 프로세스로 실행합니다.
이때 운영체제의 핵심 기능(IPC(프로세스 통신 기능), 스케줄링, 기본 메모리 관리,하드웨어 컨트롤이라던지 프로세서 메모리 영역 보호 등)는 커널에 포함되어 있어야 합니다.
커널의 기능들이 커널 밖에서 구현되므로 크기가 작아지고, IOT, smartphone을 구현할 때 유리합니다.
특징: 확장성, 유연성 .. 등등
운영체제를 커스터마이징 할 수도 있고, 확장성과 유연성, Portability, Reliability 부분에서 monolithic kernel보다 유리합니다.
이는 개발자 입장에서도 편해서. Application program을 수정하는 것 처럼 단위로 컴파일, 수정, 실행이 가능합니다. 즉 유지보수가 쉽습니다.
반면 monolithic은 전체 단위로 컴파일 해야 하기 때문에, 유지보수가 어렵습니다.
물론 micro kernel의 단점은, 운영체제 실행 속도가 느립니다.
개인 pc에서는 OS 실행 속도가 그리 느껴지지 않으므로, micro kernel을 써도 문제가 없지만, 서버 pc에서는 속도 차이가 중요하기에 monolithic kernel을 주로 사용합니다.
왜 두 커널의 구조 간에 이런 속도 차이가 발생할까요?
왜냐하면, micro kernel에서는 kernel을 거치는 오버헤드가 존재해서입니다.
다른 OS들과, UNIX의 간략한 역사
안드로이드는 리눅스 기반 + 안드로이드로 구현된 OS입니다.
OS는 굉장히 다양한 형태로 존재하는데.
내장형 시스템의 OS. 작은 기기를 안정, 신속적으로 작동하게 개발된 특수 OS
real-time OS : 실시간 컴퓨터가 사용하는 OS가 real-time OS, ex) 메디컬 기기
등이 있습니다.
OS에서 혁신적이였던 등장을 꼽는다면 UNIX라고 할 수 있는데, UNIX는 c언어로 작성되었습니다.
UNIX가 개발되기 이전에는 OS에서 하드웨어 포팅 작업이 엄청 오래걸렸습니다.
따라서, OS 발전 작업 시간이 많이 걸렸는데, c언어로 구현된 UNIX가 나오면서 하드웨어가 달라져도 c언어 컴파일러로 쉽게 포팅이 가능해졌습니다. (일종의 확장성 혁신!!)
UNIX 또한 일반 OS와 같은 하드웨어 - 소프트웨어 계층 구조를 가집니다.
하드웨어 - 커널 - 시스템 콜 라이브러리 - (unix command and library, user written applications )