운영체제란?
- 일종의 소프트웨어
- 하드웨어 바로 윗단에 설치되는 소프트웨어
- 하드웨어와 각종 소프트웨어, 사용자를 연결해주는 계층
좁은 의미의 운영체제
: 커널
- 운영체제의 핵심 부분
- 컴퓨터 전원을 켜서 부팅이 이루어진 이후로 항상 메모리에 상주하는 부분
넓은 의미의 운영체제
- 커널을 포함해서 여러 주변 시스템을 다루는 유틸리티들을 포함한 개념
- 일례로 Windows를 설치하면 파일 복사 등의 프로그램들도 함께 설치됨
- 이러한 필요한 유틸리티들도 포함하여 운영체제의 범주에 넣기도 함
운영체제의 역할
- 가장 중요한 역할은 하드웨어의 효율적 관리 (컴퓨터 시스템의 자원을 효율적으로 관리)
- 컴퓨터 시스템의 자원 == 하드웨어 자원 (프로세서, 기억장치, 입출력 장치 등) + 소프트웨어 자원 (프로세스, 파일, 메시지 등)
- 주어진 자원으로 최대한의 성능을 내도록 하는 것
- 즉, 효율성 & 형평성이 고려된 자원 분배가 필요함
- 사용자가 컴퓨터를 편리하게 사용할 수 있게 해주는 것
- 사용자 및 운영체제 자신을 보호
- 현대의 컴퓨터는 여러 프로그램이 한 대의 컴퓨터에서 동시에 실행되는 것을 지원하고 있음
운영체제의 분류
현재의 운영체제는 multi tasking / multi user / time sharing 방식 사용
동시 작업 가능 여부
-
단일 작업 (single tasking)
- 한 번에 하나의 작업만 처리
- 이전의 운영체제는 single tasking만 가능했음 (MS-DOS 등)
- 한 명령의 수행을 끝내기 전에 다른 명령을 수행시킬 수 없음
- 설계하기가 매우 쉬웠음
- 전화만 받는 전화기, 엘리베이터 등 특수목적의 기기의 경우, 기능이 1개이기 때문에 단일 작업 지원함
-
다중 작업 (multi tasking)
- 동시에 두 개 이상의 작업 처리
- 현대적인 운영체제는 다중 작업을 지원해주는 운영체제라고 생각해도 됨 (unix, windows, 스마트폰 내 운영체제 등)
사용자의 수
: 컴퓨터 한 대를 여러 사용자가 동시에 접속해서 쓸 수 있는가?
-
단일 사용자 (single user)
- single tasking은 당연히 single user만 지원함
- Windows는 기존에 single user만 가능했지만, 서버 기능을 추가시키면 multi user 기능이 지원이 되기도 함
-
다중 사용자 (multi user)
- UNIX, linux 등의 서버에 계정을 여러 개 만들고, 원격에서 계정을 통해 컴퓨터에 동시에 접속하는 것이 multi user용 운영체제라고 할 수 있음
- 사용자가 많을 경우,
- 각 사용자의 파일/메모리 접근을 다른 사용자가 볼 수 없게 하는 보안 기능
- 사용자 간 형평성 있는 자원 관리
- 등의 기능이 필요함
처리 방식
-
일괄 처리(batch processing)
- 작업을 바로바로 처리하는 게 아니라, 작업을 모아서 한꺼번에 처리
- 현대의 운영체제에서는 찾아보기 어려움
-
시분할(time sharing)
- 현대의 운영체제, 지금 사용하는 컴퓨터 그자체로 이해해도 됨
- 여러 작업이 동시에 실행
- 자세히 살펴보면 운영체제가 작은 시간단위마다 각각의 작업에 리소스를 할당하는 식으로 나누어서 지원하는 방식
- 각각의 사용자 입장에서는 interactive한 서비스를 받을 수 있음
- 짧은 응답시간
- 시간의 제약조건을 만족하지 않음
- 사용자가 엄청 늘어나면 다소 느리다는 느낌을 받을 수 있음
- 사람이 느끼기에 빠르게 해주면서, 주어진 자원을 최대한 활용하는 것이 목적
- 따라서 정확한 시간을 지켜주는 시스템은 아님
-
실시간(Realtime OS)
용어 정리
- multitasking
- 일반적인 용어
- task가 동시에 여러개 돌아가고 있음
- 엄밀히 말하면 CPU는 매 순간 1개의 프로그램만 실행함
- 짧은 시간간격으로 분할, 할당하기 때문에 동시 실행되는 것처럼 보임
- 하나의 프로그램이 끝나기 전에 다른 프로그램이 실행 가능한 경우를 일반적으로 multi-tasking이라고 부름
- multiprogramming
- 메모리에 여러 프로그램이 동시에 올라가는 방식을 multi programming이라고 함
- multi-tasking이 되려면 당연히 메모리에 여러 프로그램이 동시에 올라가야 하지만, 특별히 메모리 측면을 강조한 것
- time sharing
- CPU의 시간을 분할하여 나누어쓴다는 의미를 강조한 것
- multiprocess
- 위와 비슷한 용어
- process = 실행 중인 프로그램
- ↔️ multiprocessor
- 하나의 컴퓨터에 CPU(processor)가 여러 개 붙어있음을 의미
- processor = CPU = 처리기
- multi-tasking이 당연히 지원될 것
- CPU가 여러개 있어야 한다는 점에서 하드웨어적으로 다른 시스템임
운영체제의 예
UNIX
- 대형 컴퓨터를 위해 만들어진 운영체제
- multi-tasking, multi-user 지원
- unix 운영체제를 만들기 위해 아예 프로그래밍 언어를 새로 만듦 : C언어
- UNIX 운영체제 코드의 대부분을 C언어로 작성
- 어셈블리어로 코드를 작성하기 어려웠기 때문
- C언어는 기계어와 가까운 언어임
- 초창기에는 소스코드를 공개함
- 누구나 가져다 쓰기 쉬움
- 프로그램 개발에 용이
- 일반인이 초기에 배우기에는 약간 어려움
- 높은 이식성
- 하나의 컴퓨터에서 돌아가는 unix를 기계어집합이 다른 컴퓨터에 이식하기 쉬움
- 최소한의 커널 구조
- 커널 : 메모리에 상주하는 핵심 부분
- 커널의 크기를 작게 만들어서 메모리에서 운영체제가 차지하는 부분을 작게 함
- 다양한 버전
- System V, FreeBSD, SunOS, Solaris
- Linux
- 개인이 쓰기에도 좋은, 여러 환경에서 사용 가능
- Android의 운영체제 커널
MS 계열
- 개인용 컴퓨터를 위해 만들어진 운영체제
- single-user, single-tasking 지원하는 것으로 출발함
- DOS
- 단일 작업용 운영체제
- 640KB의 메모리 크기 지원
- MS Windows
기타
- ios 등이 나오면서 운영체제가 여러 형태로 발전하는 중
운영체제의 구조
CPU 스케줄링
- 어떤 프로그램에 CPU를 할당할 것인가?
- 일반 사회에서는 선착순이 공정하다고 인정되는데, 왜 CPU는 그렇지 않은가?
- 컴퓨터에서는 천문학적인 시간차가 발생함
- Disk <<<< Memory <<< CPU 속도 차이 너무 많이 남
- 시간 차이를 완충하고, 주어진 자원의 특성을 최대한 활용하는 관리 방식 필요
- CPU를 짧게 쓰는 Task에 먼저 CPU를 주면 전체적인 만족도가 높아짐
- 줬다 뺏었다 하는 방식을 주로 많이 씀
메모리 관리
- 메모리 공간은 한정되어 있는데, 어떤 프로그램에 메모리를 얼만큼 할당할 것인가? 메모리가 꽉찼을 때 어떤 것을 쫓아내야 하는가?
- 1/n은 적절하지 않음
- 메모리를 많이 필요로 하는 프로그램에 메모리를 많이 주는 게 좋을 수도 있음
- 프로그램 수가 많으면 각각의 메모리 공간이 너무 작아짐 → CPU가 프로그램 실행하려 했는데 필요한 부분이 메모리에 없음 → Disk에서 읽어와야 함 → 원활한 실행 안됨
- 즉, CPU에서 원활하게 실행되기 위해서 필요한 정도의 메모리는 할당되어야 함
- Working Set model : 적당량의 프로그램만 메모리에 올리고 나머지는 Disk로 쫓아내는 느낌. 어느정도 실행되고 나면 다시 Disk에 있는 애들 메모리로 올림.
- 미래에 사용할 것들은 최대한 놔두고 그렇지 않은 것들은 밀어낸다.
파일 관리
- 디스크에 파일을 어떻게 보관할 것인가?
- 조각으로 나누어서 관리 / 연속적으로 관리 등
- Disk에서 파일에 접근하려면 Disk 내의 Head가 움직이면서 파일을 읽어야 하기 때문에, 메모리와는 상당히 다름
- Disk에도 스케줄링이 필요함
- Disk에 들어온 요청들을 어떤 순서로 처리할 것인가?
- head에 가까운 요청이 있다면 그것을 먼저 처리하는 것이 성능이 좋을 것
- 엘리베이터 스케줄링과 유사함
- 먼저 온 것을 먼저 처리하는 것이 반드시 좋지는 않음
- CPU와는 사뭇 다른 문제
- CPU는 너무 빠르기 때문에, 이 좋은 자원을 어떻게 활용할 것인가? 에 대한 이야기임
- 디스크는 Head가 움직이기 때문에, 어떻게 하면 움직임을 최소화 할 것인가? 에 대한 이야기임
입출력 관리
- IO 디바이스를 어떻게 관리할 것인가? 각기 다른 입출력장치와 컴퓨터 간에 어떻게 정보를 주고 받게 할 것인가?
- I/O 디바이스는 컴퓨터 내부의 CPU, memory, Disk에 비해 많이 느림
- I/O와 컴퓨터 내부가 교신하면서 처리해야 하는데, 워낙 느리다보니 정보를 주고받는 것이 중요한 이슈가 됨
- 기본적으로 Interrupt라는 것으로 관리함
- I/O 디바이스가 CPU에게 알려주어야 하는 것이 있으면 Interrupt를 걸어서 CPU에게 알려줌
- CPU는 다음 작업을 하기 전에 이를 처리해줌
- CPU가 최대한 방해받지 않도록 하는 것이 목적
프로세스 관리
- 컴퓨터 내에서 돌아가고 있는 프로그램들을 어떻게 관리할 것인가?
기타
참고 링크
KOCW 운영체제 - 이화여대 반효경 교수 (2014-1) 2강