운영체제에 대한 포괄적인 개념을 정리합니다. 주로 학교 수업에서 배운 내용들입니다. 수업에서 사용한 OSTEP 교재를 기반으로 정리하였습니다.
운영체제가 하는 것
운영체제는 컴퓨터 위에 첫 번째로 올라가서 동작하는 프로그램입니다. 기본적으로 컴퓨터가 동시에 여러개의 프로그램을 동작시킬 수 있도록 도와주는 역할을 합니다.
컴퓨터(하드웨어)와 프로그램(소프트웨어) 사이를 이어주어, 소프트웨어들이 하드웨어 자원을 안전하게 사용할 수 있도록 기능을 지원해 직접접근을 제한하며 대리자 역할을 합니다.
운영체제의 동작 계층을 커널이라고 하며 모든 프로그램들은 이 커널(운영체제)의 도움을 받아 컴퓨터에서 동작을 하게 됩니다.
커널
운영체제의 주요 동작이 이뤄지는 부분입니다. 컴퓨터가 동작하면서 지속적으로 커널모드 - 유저모드 간의 교체가 이뤄집니다.
유저모드에서는 일반적인 애플리케이션들이 실행될 때의 상태이며 하드웨어에 제한적 접근이 가능한 상태입니다.
커널모드에서는 운영체제의 주로 동작이 이뤄지며, 하드웨어에 직접적인 접근이 가능합니다.
애플리케이션이 하드웨어와의 상호작용을 하기 위해 커널은 시스템 콜이라는 API를 제공합니다.
시스템 콜
애플리케이션이 하드웨어에 접근하고 싶을 때 운영체제 커널이 제공하는 API를 호출해 간접적으로 접근합니다.
(e.g. printf호출시, 내부적으로 write 시스템콜 호출되어 콘솔에 출력)
이를 Limited Direct Execution라고 함.
애플리케이션이 시스템콜을 호출하면, 인터럽트가 발생해 커널모드에 진입하고 커널이 호출된 API에 따라 하드웨어와의 상호작용을 대신합니다.
프로세스
프로그램이 실행되면 메모리에 올라가 하나의 동작 상태를 가집니다. 이를 프로세스라고 합니다.
프로세스는 pcb에 레지스터 상태, 코드주소, 프로세스ID, 부모pid, 가상메모리를 위한 오프셋 및 테이블, 동작 상태(run, sleep, ready...), 커널 스택 주소... 등의 상태를 가집니다.
스레드
프로세스가 소유하는 각 코드 실행 흐름 단위입니다.
프로세스 시작시에 메인스레드가 생성되 엔트리포인트(main)에서부터 코드를 하나씩 실행합니다.
프로세스는 추가적으로 스레드를 생성할 수 있으며, 각 스레드는 tcb에 각 스레드의 정보를 저장합니다.
스레드는 tcb에 PC(Program Counter), Stack Pointer, register context 등과 같은 상태를 담고있습니다.
프로세스의 스레드끼리는 힙메모리와 정적 메모리를 공유할 수 있기에 서로간에 경쟁상태가 발생할 수 있습니다. 이를 동시성 제어를 통해 잘 조작해야합니다.
가상화
가상화는 개발자가 제작한 프로그램들이 컴퓨터 위에서 잘 돌아가기 위해 OS가 제공하는 기본 개념입니다.
모든 프로그램은 오직 자신만의 컴퓨터를 온전히 점유하고 있다는 착각 하에서 돌아갑니다.
실제로는 운영체제가 프로그램을 프로세스로 다뤄 메모리에 올린 뒤 지속적으로 스케줄링을 통해 프로세스(스레드)를 cpu에 올렸다 내렸다 반복합니다.
또한, 프로세스가 메모리에 접근할 때 운영체제가 알아서 오프셋을 조절하여 프로세스가 컴퓨터의 메모리를 안전하게 사용할 수 있도록 조절합니다.
이를 각각 스케줄링과 메모리 가상화라고 합니다.
스케줄링
OS는 지속적으로 cpu에서 돌아갈 프로세스를 선택해서 cpu위에 올립니다. 이를 스케줄링이라고 합니다.
주기적으로 하드웨어적으로 인터럽트가 발생하면서 cpu에 올라가있는 프로세스가 내려오고서 운영체제가 정책적으로 다음에
올라갈 프로세스에 올라갈 프로세스를 선택해 올리는 방식을 선점형 스케줄링이라고 합니다.
반면, 프로세스가 한 번 CPU에 올라가면 프로세스가 스스로 CPU에서 내려오지 않는 한 지속적으로 실행되는 시스템을 비선점형 스케줄링이라고 합니다.
현재 대부분의 운영체제는 선점형 스케줄링 방식으로 동작합니다.
비선점형 스케줄링
FIFO (First-In First-Out)
프로세스가 실행되면 queue구조로 대기열에 쌓여서 하나씩 순차적으로 실행됩니다.
프로세스가 종료되거나 sleep상태가 될 때까지(yield, IO의 경우) 계속 cpu를 점유합니다.
무조건적으로 순차적 실행이 되기 때문에 무거운 프로세스가 자리잡고 있다면 뒤에 도착한 프로세스들이 자신의 차례까지 너무 오래 기다려야한다는 단점이 있습니다.
SJF (Shortest Job First)
운영체제가 대기중인 프로세스를 탐색하며 실행시간이 제일 짧게 걸릴만한 프로세스들을 우선적으로 스케줄링하는 방식입니다.
비선점형 방식이기에 앞서 무거운 프로세스가 먼저 실행되고 있다면 뒤의 프로세스들이 한없이 밀린다는 단점이 여전히 있으며,
계속해서 실행시간이 짧은 프로세스만 선택해 실행시키면 무거운 프로세스는 한없이 뒤로 밀려 **기아상태(starvation)**가 될 수 있다는 문제점이 있습니다.
선점형 스케줄링
STCF (Shortest Time to Completion First)
OS가 실행중인 프로세스를 ready상태로 cpu에서 내릴 수 있는 선점형 방식입니다.
실행을 원하는 프로세스가 도착시 실행시간을 계산하여 제일 짧은 프로세스를 cpu로 올립니다.