운영체제(Operating System, OS)
란?
컴퓨터 하드웨어와 소프트웨어 중간에 위치하여 이 둘을 연결하는 소프트웨어 계층입니다.
협의의 운영체제(커널) : 운영체제의 핵심 부분으로 메모리에 상주하는 부분
광의의 운영체제 : 커널 뿐만 아니라 각종 주변 시스템 유틸리티를 포함한 개념
크게 자원 관리
, 컴퓨터 시스템 환경 제공
2가지가 존재합니다.
컴퓨터 시스템의 자원을 효율적으로 관리하는 것이 주목적입니다.
여기서 자원은 프로세서, 기억장치, 입출력 장치 등을 의미합니다.
사용자간의 형평성
있는 자원 분배와 주어진 자원으로 최대한의 효율
을 내는 것이 목적입니다.
또한, 악의적인 소프트웨어가 컴퓨터 시스템과 자원을 함부로 다루지 못하도록 보호합니다.
운영체제는 사용자에게 컴퓨터 시스템을 편리하게 사용할 수 있는 환경을 제공합니다.
소프트웨어와 하드웨어 중간 계층에 존재하여 사용자가 하드웨어를 직접 다루는 복잡한 상황이 발생하지 않도록 합니다.
동시 작업 가능 여부, 처리 방식 등에 따라 운영체제를 분류할 수 있씁니다.
한 번에 하나의 작업만 처리합니다.
ex) MS-DOS 프롬프트 상에서는 한 명령의 수행을 끝내기 전에 다른 명령을 수행시킬 수 없음.
동시에 두 개 이상의 작업 처리합니다.
현대에는 다중 작업을 지원하는 OS가 주로 사용됩니다.
ex) UNIX, MS Windows 등에서는 한 명령의 수행이 끝나기 전에 다른 명령이나 프로그램을 수행할 수 있음
작업 요청의 일정량을 모아서 한꺼번에 처리합니다.
다음 작업이 수행되기 위해서는 현재 작업이 완전히 종료될 때까지 기다려야 합니다.
일정한 시간 단위로 분할
하여 사용합니다.짧은 Response Time
을 갖습니다.정해진 시간(Deadline)
안에 어떠한 일이 반드시 종료됨이 보장되어야 하는 실시간 시스템을 위한 OS입니다.
제한된 시간안에 요청을 처리해 결과를 제공하는 환경입니다.
OS는 어떤 프로세스에게 CPU를 제공할지 스케쥴링합니다.
현실 세계에서 생각해봤을 때, 먼저 대기 큐에 들어온 프로세스에게 CPU를 제공해야 한다고 생각할 수 있습니다. (FCFS 방식)
하지만, 이러한 방식은 다음과 같은 문제가 존재합니다.
맨 앞에 매우 오래 걸리는 프로세스가 있다면, 그 뒤에 매우 짧은 작업을 수행하는 프로세스는 한없이 기다려야만 합니다.
이러한 문제를
Convoy Effect
라고 부릅니다.
효율적으로 자원을 사용해야 하는 운영체제의 취지와는 상반되는 상황입니다.
실제로는 프로세스의 우선순위
, 남은 처리 시간
등을 고려하여, 형평성있게 작업을 쪼개서 실행하는 Time Sharing
방식으로 운영합니다.
이후 CPU Scheduling 포스팅에서 자세히 다루겠습니다.
OS는 프로세스에게 얼마만큼의 Memory를 할당할지 관리합니다.
한 프로세스에게 너무 많은 메모리를 할당하면 다른 프로세스는 극소량의 메모리를 할당받아 원활하게 프로그램을 실행시키지 못하는 문제가 발생합니다.
이러한 문제를 해결하기 위해 OS는 메모리의 지역성(Locality)
을 활용한 Working Set
모델을 사용합니다.
지역성(Locality)은 프로세스가 일정 시간동안 특정한 메모리 위치에 자주 접근한다는 특성입니다.
지역성을 활용하여 특정 시간동안 자주 접근하는 프로세스의 일부 Page들을 작업 집합(Working Set)으로 구성하여 메모리에 상주시키는 방식입니다.
그러면 메모리에 없는 프로세스의 일부분을 메모리에 적재하기 위해 디스크를 조회하는 무겁고 불필요한 오버헤드를 최소화할 수 있습니다.
이 외에도, Memory는 한정되어 있기 때문에, 가득 찼을 때 어떤 메모리를 내쫓아야 하는지 결정하는 것도 중요합니다.
예를 들어, CPU에서 자주 접근하는 메모리 공간을 내쫓아서는 안 됩니다.
이러한 상황을 적절히 관리하기 위해 FIFO, LRU, Optimal Solution, Second chance Algorithm 등 다양한 방식을 고려합니다.
이후 Memory Management 포스팅에서 자세히 다루겠습니다.
OS는 디스크에 파일을 어떻게 보관할지 관리합니다.
File System 또한 CPU와 메모리처럼 스케쥴링 방식이 존재합니다.
Disk를 읽을 때 내부적으로는 플래터(Platter)
라는 동그란 판을 돌아가면서 데이터를 읽습니다.
이 때, 가능한 조금만 움직여서 원하는 데이터에 접근하는 것이 관건입니다.