Chapter 9 ~ 11, 운영체제, 프로세스와 스레드, CPU 스케줄링까지
- 기본 미션: p. 304의 확인 문제 1번 풀고 인증하기
- 선택 미션: Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입될 때 선입 선처리, 최단 작업 우선, 라운드 로빈, 우선순위 스케줄링에서 어떤 프로세스로 CPU를 할당 받는지 정리해보기
프로그램 실행에 필요한 요소들을 시스템 자원이나 자원이라고 한다. 이 자원을 각 프로그램마다 할당하고, 프로그램이 올바르게 실행되도록 돕는 프로그램이 운영체제(operating system)이다.
운영체제는 커널 영역이라는 공간에 따로 적재되어 실행된다. 커널 영역을 제외한 나머지 영역인 사용자가 이용하는 응용 프로그램이 적재되는 영역은 사용자 영역이라고 한다.
커널(kernel)은 자원에 접근하고 조작하는 기능, 프로그램이 올바르고 안전하게 실행되는 기능같은 운영체제의 핵심 서비스를 담당한다. 운영체제가 제공하는 서비스 중 커널에 포함되지 않는 서비스도 있는데 대표적으로 사용자 인터페이스(UI, User Interface)와 그래픽 유저 인터페이스(GUI, Graphical User Interface)가 있다.
이중 모드(dual mode)란 CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식이다. 사용자 모드(user mode)는 운영체제의 서비스를 제공받을 수 없는 실행 모드이며, 커널 모드(kernel mode)는 운영체제의 서비스를 제공받을 수 있는 실행 모드이다.
운영체제는 커널 모드로 실행되어 있다. 그러나 일반적인 응용 프로그램들은 사용자 모드로 실행되어 있기에 자원에 접근할 수 없다. 그렇기에 운영체제에 요청을 보내 커널 모드로 전환되어야 한다. 이때 운영체제 서비스를 제공받기 위한 요청을 시스템 호출(system call)이라고 한다.
또한, 시스템 호출은 소프트웨어 인터럽트이다. 그렇기에 시스템 호출이 발생하면 CPU는 지금까지의 작업을 백업하고, 커널 영역 내에 시스템 호출을 수행하는 인터럽트 서비스 루틴을 실행한 뒤 다시 기존에 실행하던 응용 프로그램으로 복귀하여 실행을 계속한다.
프로세스(process)는 실행 중인 프로그램을 의미한다. 컴퓨터가 부팅되는 순간부터 많은 프로세스들이 실행된다. 그리고 컴퓨터에서 확인해보면 사용자가 볼 수 있는 공간에서 실행되는 프로세스도 있지만, 보이지 않는 공간에서 실행되는 프로세스도 있다. 전자는 포그라운드 프로세스(foreground process)라고 하며, 후자는 백그라운드 프로세스(background process)라고 한다. 이때, 백그라운드 프로세스 중 사용자와 상호작용하지 않고 정해진 일만 수행하는 프로세스를 유닉스 체계의 운영체제에서는 데몬(darmon)이라고 부르고, 윈도우 운영체제에서는 서비스(service)라고 부른다.
일반적으로 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있기에 CPU는 이 프로세스들을 조금씩 번갈아 가며 실행한다. 이때, 운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분한다. 이를 위해 운영체제는 프로세스 제어 블록(이하 PCB, Process Control Block)을 이용한다.
PCB는 커널 영역에 생성되며, 각각의 프로세스를 식별하기 위해 관련된 정보를 저장하는 자료 구조이다. PCB는 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기된다. 아래는 PCB에 담기는 정보이다.
하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보를 문맥(context)이라고 한다. 문맥은 해당 프로세스의 PCB에 표현되어 있다. 프로세스가 CPU를 사용할 수 있는 시간이 다 되거나 인터럽트가 발생하면 운영체제는 해당 프로세스의 PCB에 문맥을 백업한다. 그리고 뒤이어 실행할 프로세스의 문맥을 복구한다. 이처럼 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 프로세스를 실행하는 것을 문맥 교환(context switching)이라고 한다.
프로세스가 생성되면 커널 영역에 PCB가 생성된다. 반대로 사용자 영역에서는 하나의 프로세스가 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다.
프로세스는 여러 상태를 거치며 실행된다. 그리고 운영체제는 프로세스의 상태를 PCB를 통해 인식하고 관리한다.
프로세스가 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다. 이때 프로세스를 생성한 프로세스를 부모 프로세스(parent process), 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스(child process)라고 한다. 이처럼 프로세스가 프로세스를 낳는 과정을 도표로 그려서 만든 트리 구조를 프로세스 계층 구조라고 한다.
프로세스 생성 기법을 더 자세히 설명하자면 부모 프로세스가 fork라는 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성해내고, 만들어진 복사본인 자식 프로세스는 exec라는 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.
스레드(thread)는 프로세스를 구성하는 실행의 흐름 단위이다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있다. 만약 프로세스에 스레드가 하나만 있다면 단일 스레드 프로세스가 된다. 그러나 두 개 이상의 스레드가 있다면 멀리 스레드 프로세스가 된다. 이처럼 스레드라는 개념이 도입되면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 되었다.
여기서 중요한 점은 프로세스의 스레드들은 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한 채 프로세스 자원을 공유하며 실행한다.
컴퓨터의 실행 과정에서 여러 프로세스를 동시 실행하는 것을 멀티프로세스(multiprocess), 그리고 여러 스레드로 프로세스를 동시에 실행하는 것을 멀티스레드(multithread)라고 한다.
프로세스는 비디오 재생이나 디스크 백업 작업을 담당하는 입출력 집중 프로세스(I/O bound process)와 복잡한 수학 연산, 컴파일, 그래픽 처리 작업을 담당하는 CPU 집중 프로세스(CPU bound process)가 있다. 그리고 프로세스마다 CPU를 할당할 수 있는 우선 순위(priority)가 있다. 일반적으로 입출력 집중 프로세스가 CPU 집중 프로세스보다 우선 순위가 높은데, 입출력 집중 프로세스는 잠깐 실행하면 바로 대기 상태에 들 것이기에 해당 프로세스를 먼저 처리해 버리면 다른 프로세스가 금방 CPU를 사용할 수 있기 때문이다.
운영체제는 CPU, 메모리, 입출력장치를 사용하고 싶은 프로세스들에 '줄을 서서 기다릴 것'을 요구한다. 이 줄을 스케줄링 큐(scheduling queue)로 구현하고 관리한다. 또한 운영체제가 관리하는 큐에는 다양한 종류가 있다. 대표적인 큐로 준비 큐와 대기 큐가 있다. 준비 큐(ready queue)는 CPU를 이용하고 싶은 프로세스들이 서는 줄을 의미하고, 대기 큐(waiting queue)는 입출력장치를 이용하기 위해 대기 상태에 접어든 프로세스들이 서는 줄을 의미한다.
선점형 스케줄링(preemptive scheduling)은 프로세스가 CPU를 비롯한 자원을 사용하고 있더라도 운영체제가 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케줄링 방식이다. 프로세스가 정해진 시간만큼 자원을 사용한 뒤 시간이 됐다면 타이머 인터럽트를 발생하고 운영체제가 해당 프로세스로부터 자원을 빼앗아 다음 프로세스에 할당하는 방식이 선점형 스케줄링의 일종으로 볼 수 있다.
반면 비선점형 스케줄링(non-preemptive scheduling)이란 하나의 프로세스가 자원을 사용하고 있다면 그 프로세스가 종료되거나 대기 상태에 들기 전까진 다른 프로세스가 끼어들 수 없는 스케줄링 방식이다. 다시 말해 하나의 프로세스가 자원 사용을 독점할 수 있는 스케줄링 방식이라 할 수 있다.
운영체제가 프로세스들에게 공정하고 합리적으로 CPU 자원을 배분하는 것을 CPU 스케줄링(CPU scheduling)라고 한다. 그리고 스케줄링 알고리즘이 있으며 종류가 매우 다양하다.
p. 304의 확인 문제 1번 풀고 인증하기
1. 다음은 프로세스 상태를 보여주는 프로세스 상태 다이어그램입니다. (1)부터 (5)까지 올바른 상태를 적어 보세요.
준비 큐에 A,B,C,D 순으로 삽입될 때 선입 선처리, 최단 작업 우선, 라운드 로빈, 우선순위 스케줄링에서 어떤 프로세스로 CPU를 할당 받는지 정리해보기
선입 선처리 스케줄링: A-B-C-D 순으로 실행한다.
최단 작업 우선 스케줄링: 프로세스 중 CPU 이용 시간의 길이가 짧은 순으로 실행한다.
라운드 로빈 스케줄링: 정해진 타임 슬라이스만큼의 시간 동안 A-B-C-D 순으로 돌아가며 실행한다.
우선 순위 스케줄링: 우선 순위에 따른 순서대로 실행한다.