thumbnail
혼자 공부하는 컴퓨터 구조 + 운영체제 - 운영체제와 CPU 스케줄링
Jul 30, 2023

혼공단 10기 4주차 학습 기록

운영체제(Operating system)

OS

운영체제는 프로그램이 실행되기 위해 필요한 자원을 할당하고 프로그램이 올바르게 실행되도록 하는 특수 프로그램으로, 컴퓨터가 부팅될 때마다 메모리 내 커널 영역(kernel space)에 따로 적재되어 실행된다. 커널 영역을 제외한 나머지 영역은 사용자 영역(user space)이라고 하며, 사용자가 이용하는 응용 프로그램이 적재된다.

커널(Kernel)

커널은 운영체제의 핵심 기능을 담당하는 운영체제의 심장과도 같은 핵심부이다. 여기서 핵심 기능이란, 자원에 접근하고 조작하는 기능과 프로그램이 올바르게 실행되도록 하는 기능을 말한다. 일반적으로 운영체제를 설명할 때는 커널을 지칭한다고 보면 된다.

이중 모드(Dual mode)

운영체제는 자원이 무질서하게 관리되는 것을 방지하기 위해 응용 프로그램으로부터 요청을 받고 자원 접근을 대행하는 역할을 한다. 이때, CPU가 명령어를 사용자 모드(user mode)커널 모드(kernel mode)로 구분하여 실행하는 이중 모드 방식을 사용한다. 전자는 커널 영역의 코드를 실행할 수 없지만 후자는 가능하다.

일반적인 응용 프로그램은 사용자 모드로 실행되므로 자원에 접근할 수 없지만 커널 모드로 실행되는 운영체제는 자원에 접근할 수 있다. 만약 사용자 모드로 실행되는 프로그램이 운영체제 서비스를 제공받고 싶다면 운영체제에 요청을 보내는 시스템 호출(system call)을 이용하면 된다.


프로세스와 스레드

프로세스(Process)

프로세스는 ‘실행 중인 프로그램’을 뜻한다. 맥 기준 ‘활성 상태 보기’에서 현재 실행 중인 프로세스를 확인할 수 있다.

프로세스 확인

프로세스 중 사용자가 볼 수 있는 공간에서 실행되는 프로세스를 포그라운드 프로세스(Foreground process)라 하며, 사용자가 보지 못하는 공간에 실행되는 프로세스를 백그라운드 프로세스(Background process)라고 한다. 또한, 백그라운드 프로세스 중 사용자와 직접 상호작용하지 않고 정해진 일만 수행하는 프로세스는 유닉스 기반 운영체제에서는 데몬(daemon), 윈도우 운영체제에서는 서비스(service)라고 부른다.

프로세스 제어 블록(PCB; Process Control Block)

CPU의 자원은 한정되어 있기 때문에 프로세스들은 순서대로 돌아가면서 정해진 시간만큼 CPU를 이용하게 된다. 여기서 운영체제는 프로세스 관련 정보가 담긴 프로세스 제어 블록(이하 PCB)으로 프로세스들의 실행 순서를 관리하고 자원을 배분한다.


PCB에 담기는 정보는 대표적으로 아래와 같다.


프로세스 ID(PID; Process ID)

프로세스 ID(PID)는 각 프로세스를 식별할 수 있는 고유 번호이다. 동일한 작업을 수행하는 프로그램이라도 실행할 때마다 다른 PID를 갖는 프로세스가 생성된다.

PID

레지스터값

각 프로세스는 정해진 시간이 끝나면 해당 작업을 멈추고 다음 순서로 넘어가기 때문에 작업을 이어서 진행하려면 이전까지 사용했던 레지스터 중간값들이 필요하다. 그래서 PCB에는 프로세스가 실행하며 사용했던 레지스터 값들이 저장되어 있다.


프로세스 상태와 CPU 스케줄링 정보

PCB에는 현재 프로세스가 어떤 작업을 하기 위해 대기하고 있는지에 대한 상태 정보와 어떤 순서로 CPU를 할당받을지에 대한 스케줄링 정보가 기록된다.


메모리 관리 정보

프로세스마다 메모리 저장 위치가 다르므로 어느 주소에 저장되어 있는지에 대한 정보도 담겨있다.

메모리 영역

메모리 영역

하나의 프로세스가 생성될 때, 커널 영역에는 PCB가, 사용자 영역에는 크게 네 가지 영역에 나뉘어 프로세스가 배치된다.


코드 영역(Code segment)

코드 영역에는 CPU가 실행할 명령어가 담겨 있다. 쓰기가 금지되어 있는 읽기 전용 공간이다.


데이터 영역(Data segment)

데이터 영역은 프로그램이 실행되는 동안 계속 유지해야 할 데이터들이 저장되는 공간이다. 대표적으로 어디서나 참조할 수 있는 값인 전역 변수가 이에 해당한다.


힙 영역(Heap segment)

힙 영역은 개발자가 직업 할당할 수 있는 저장 공간으로 할당 후 반환해야 한다는 특징이 있다. 만약 반환하지 않는다면 메모리 내에 해당 공간이 계속 남아있어 메모리 낭비가 일어나는 메모리 누수(memory leak) 현상이 발생한다.


스택 영역(Stack segment)

스택 영역은 데이터 영역과 달리 일시적인 데이터를 저장하는 공간이다. 매개 변수나 지역 변수처럼 해당 스코프 내에서만 참조하는 데이터들이 해당한다.


코드 영역과 데이터 영역은 크기가 고정된 영역이라는 의미로 정적 할당 영역이라고 부르며, 힙 영역과 스택 영역은 가변성이 있으므로 동적 할당 영역이라고 부른다. 일반적으로 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고 스택 영역은 높은 주소에서 낮은 주소로 할당되기 때문에 각 영역에서 할당되는 주소가 겹칠 일이 없다.

프로세스 상태와 계층 구조

프로세스 상태

프로세스는 생성, 준비, 실행, 대기, 종료 상태를 거치며 실행된다. 먼저 메모리에 적재되어 PCB를 할당받는 생성 상태를 거치면 준비 상태가 되어 자신의 차례를 기다린다. 순서가 되면 CPU를 할당받아 실행하는 실행 상태가 되며, 할당된 시간이 지나면 준비 상태로 되돌아가거나 중간에 특정 이벤트가 발생하면 (예를 들면 입출력 작업) 작업을 기다리는 대기 상태가 된다. 프로세스가 모든 작업을 완료하고 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.


프로세스들은 계층 구조를 이루며 동시에 실행된다. 상단에 있는 프로세스는 부모 프로세스(parent process), 부모에서 생성된 또 다른 프로세스를 자식 프로세스(child process)라 한다.


스레드(Thread)

스레드는 프로세스를 구성하는 실행 단위로 실행에 필요한 최소한의 정보를 가지고 자원을 공유하면서 실행된다. 여러 프로세스가 동시에 실행하는 것을 멀티 프로세스(multi process), 여러 스레드로 프로세스를 동시에 실행하는 것을 멀티 스레드(multithread)라고 한다.


그러면 단일 프로세스를 여러 개 실행하는 것과 여러 스레드로 하나의 프로세스를 실행하는 것은 어떤 차이가 있을까?


스레드는 자원을 공유한다는 점에서 여러 프로세스를 실행하는 것보다 메모리 낭비를 줄일 수 있다는 장점이 존재한다. 가령, 세 개의 프로세스를 단일 실행한다고 하면, PID, 메모리 주소를 제외한 나머지가 동일한 3개의 프로세스가 독립적으로 실행되고 메모리를 차지한다. 같은 프로그램을 실행하기 위해 동일한 내용이 중복해 존재하므로 그만큼 메모리 공간이 낭비되는 것이다.


반면, 한 프로세스 내에서 여러 스레드를 사용하면 몇몇 자원을 공유할 수 있으므로 메모리 공간을 더 효율적으로 사용할 수 있으며 협력과 통신에 유리하다. 그러나 하나의 스레드에 문제가 발생하면 다른 스레드에도 영향을 받기 때문에 멀티프로세스와 멀티스레드는 특정 방식이 더 좋고 나쁨이 아닌, 서로 다른 장단점을 가진다고 볼 수 있다.


CPU 스케줄링(CPU scheduling)

모든 프로세스는 CPU를 필요로 하고 자신이 CPU를 가장 먼저 사용하고 싶어 한다. 그래서 운영체제는 이 프로세스들에 적절히 자원을 분배하고 순서를 결정하는데, 이를 CPU 스케줄링이라고 한다.

프로세스 우선순위

대부분의 프로세스는 CPU 작업과 입출력 작업이 번갈아 가면서 실행된다. 실행 상태와 대기 상태를 반복한다는 것인데, 프로세스 종류마다 CPU 작업에 드는 시간과 입출력 작업에 드는 시간은 상이하다. CPU 작업이 많은 프로세스를 CPU 집중 프로세스(CPU bound process)라고 하며, 입출력 작업이 많은 프로세스를 입출력 집중 프로세스(I/O bound process)라고 한다.


입출력 집중 프로세스는 실행보다는 입출력을 위해 대기하는 상태에 더 머무르게 되므로 CPU 집중 프로세스보다 우선순위가 높게 설정된다. 입출력 집중 프로세스가 먼저 CPU를 사용하고 대기 상태에 접어들었을 때 CPU 집중 프로세스가 CPU를 사용해야 공백 기간이 적어져 효율적이기 때문이다.

스케줄링 큐(Scheduling queue)

운영체제가 매번 PCB를 검사해 순서를 결정하는 것은 비효율적이므로 프로세스들을 순서대로 줄을 세워 관리한다. 이를 스케줄링 큐라고 부르는데, 대표적으로 준비 큐(ready queue)와 대기 큐(waiting queue)로 나뉜다.

프로세스가 준비 상태냐 대기 상태냐에 따라 준비 큐, 대기 큐에 순서대로 줄을 서고, 자신의 순번이 돌아오면 CPU를 할당받는다.


만약, 프로세스가 순서대로 CPU를 사용하는 도중에 갑자기 급한 프로세스가 중간에 끼어들면 어떻게 될까?


선점형 스케줄링(Preemptive scheduling)

선점형 스케줄링

선점형 스케줄링은 CPU를 사용하고 있는 프로세스로부터 자원을 빼앗아 급한 프로세스에 넘겨주는 방식이다. 위에서 설명한 정해진 시간만큼만 CPU를 사용하고 다음 순서로 넘어가는 것이 바로 이 방식이다. 대부분의 운영체제는 선점형 스케줄링 방식을 이용한다.

어느 하나의 프로세스가 자원을 독점할 수 없기 때문에 프로세들에 자원을 적절히 분배할 수 있지만, PCB에 이전 프로세스 상태를 보관하고 새로운 프로세스 상태를 적재하는 문맥 교환 과정에서 오버헤드가 발생할 수 있다.


비선점형 스케줄링(Non-preemptive scheduling)

비선점형 스케줄링

반대로 비선점형 스케줄링은 한 프로세스가 CPU를 이용하고 있다면 그 프로세스가 스스로 종료되거나 대기 상태가 될 때까지 다른 프로세스가 끼어들 수 없는 방식이다.

문맥 교환 횟수는 선점형 스케줄링 방식보다 적어 오버헤드 발생 확률이 적지만 하나의 프로세스가 자원을 독점하기 때문에 모든 프로세스가 골고루 자원을 사용할 수 없다.


기본 미션

p.304

1. 다음은 프로세스 상태를 보여주는 프로세스 상태 다이어그램입니다. (1)부터 (5)까지 올바른 상태를 적어 보세요.

mission

정답:

  1. 생성 상태
  2. 준비 상태
  3. 실행 상태
  4. 종료 상태
  5. 대기 상태

추가 미션

Q. 준비 큐에 A, B, C, D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당받는가?

선입 선처리 스케줄링(FCFS; First Come First Served Scheduling)

선입 선처리 스케줄링은 말 그대로 먼저 들어온 순서대로 프로세스를 처리하는 비선점형 스케줄링 방식을 뜻한다. CPU를 먼저 요청한 순서대로 CPU를 할당받기 때문에 이전 프로세스가 작업이 끝나지 않았다면 무작정 기다려야만 하는 부작용이 존재한다.

세 개의 프로세스가 각각 CPU 사용 시간이 10ms, 15ms, 2ms라고 가정했을 때, 순서대로 일을 처리하면 마지막 프로세스는 단 2ms의 실행을 위해 대기 시간만 25ms를 소비해야 한다. 이런 현상을 호위 효과(convoy effect)라고 한다.


정답:

A, B, C, D 순서로 삽입되었으므로 선입 선처리 스케줄링 알고리즘 방식을 이용하면 동일하게 A, B, C, D 순서로 CPU를 할당받는다.


References

[📚book] 혼자 공부하는 컴퓨터 구조 + 운영체제

Table Of Contents
nxnaxx blog © 2022-2024 Powered By Gatsby.