개요
•
프로세스란, 실행 중인 프로그램을 말한다.
•
우리가 사용하는 컴퓨터에서는 정말 많은 프로세스들이 실행되고 있다.
•
프로세스들은 실행을 위해 CPU, Memory 등의 자원들을 운영체제로부터 할당받아 사용한다.
•
운영체제가 프로세스들에게 효율적으로 자원을 할당하는 것을 프로세스 스케줄링이라고 한다.
•
프로세스 스케줄링 이해를 위해, 기본적인 개념부터 차근차근 알아보도록 하자.
프로그램(Program)
•
프로그램이란, 명령어들의 집합이다.
•
여기서 말하는 명령어는 CPU가 실행하는데 필요한 명령어이다.
•
즉, 프로그래밍 언어로 작성된 소스 코드를 컴파일하여 만들어진 명령어들의 집합이다.
◦
Ex) UNIX 계열 운영체제의 .out 파일, Windows 운영체제의 .exe 파일.
•
프로그램은 보조기억장치에 저장되어 있다.
프로세스(Process)
•
프로그램이 실행되어 메모리에 적재된 상태를 말한다.
•
실행 중인 프로그램이라고 볼 수 있다.
◦
Ex) 게임 프로그램(실행파일) 실행 → 게임 프로세스 생성.
•
프로세스 생성시, 운영체제가 프로세스에 필요한 자원을 할당한다.
•
이때, 프로세스들은 각각의 독립된 메모리 영역을 할당 받는다.
◦
각 프로세스들은 자신만의 독립된 메모리 영역을 가지고 있으므로, 프로세스간 통신은 불가능하다.
◦
프로세스간 통신을 위해서는 파이프, 시그널, 공유메모리, 파일 등을 사용해야 한다.
프로세스 제어 블록(Process Control Block(PCB))
•
프로세스와 관련된 정보를 저장하는 곳이다.
•
각 프로세스마다 자신만의 PCB를 가지고 있다.
•
프로세스 ID(PID), 프로세스 상태 등의 정보들을 저장하고 있다.
•
운영체제는 PCB를 통해 각 프로세스를 식별한다.
•
PCB는 중요한 정보들을 저장하고 있기 때문에, 커널 메모리 영역에 저장된다.
◦
커널 메모리 영역(운영체제 영역) : 시스템에서 사용해야하는 필수적인 데이터나 중요한 정보들을 저장하기 위해 사용하는 메모리 영역.
◦
사용자 메모리 영역 : 각 프로세스가 할당 받는 메모리 영역(Code, Data, Heap, Stack).
•
PCB에 저장되는 정보들은 아래와 같다.
◦
프로세스 ID (PID) : 프로세스 식별 번호.
◦
레지스터 값 : 프로세스가 사용 하던 레지스터 값. (프로그램 카운터 등)
◦
프로세스 상태 : CPU를 사용 중인 상태인지, CPU 사용을 위해 기다리는 상태인지 등.
◦
CPU 스케줄링 정보 : 언제, 어떤 순서로 CPU를 할당 받을지.
◦
메모리 관리 정보 : 프로세스가 적재된 메모리 위치.
◦
사용한 파일 및 입출력 장치 정보 : 프로세스가 어떤 입출력 장치나 파일을 사용했는지.
문맥 교환(Context Switching)
•
모든 프로세스들은 실행을 위해 CPU 자원이 필요하지만, CPU 자원은 한정되어있다.
•
따라서, 모든 프로세스는 동시에 CPU 사용이 불가능하며, 프로세스들은 차례대로 돌아가면서 특정 시간 동안 CPU를 사용한다.
•
즉, 프로세스들은 운영체제가 할당해준 특정 시간만큼 번갈아가면서 CPU를 사용한다.
•
이때, 실행 중이던 프로세스에서 다른 프로세스로 실행 순서가 넘어갈 때, 운영체제는 현재까지 실행 중이던 프로세스의 정보를 PCB에 저장하고, 다음에 실행할 프로세스의 정보를 해당 프로세스의 PCB로부터 불러온다.
•
이 과정을 문맥 교환이라고 한다.
•
문맥 교환은 아주 빠르게 수행되기 때문에(현대 시스템에서는 수십 usec 정도), 사용자 입장에서는 여러 개의 프로세스가 동시에 실행되고 있는 것처럼 보인다.
•
문맥 교환이 자주 일어나게 된다면, 그만큼 오버헤드가 발생할 수 있다.
◦
오버헤드 : 특정 기능을 수행하는데 추가적으로 시간, 자원이 소모되는 것.
프로세스 상태(Process Status)
•
프로세스가 실행될 때, 각 프로세스는 여러 가지의 상태를 거치며 실행된다.
1.
생성 상태(New) : 프로세스가 이제 막 메모리에 적재되어 PCB를 할당 받은 상태.
2.
준비 상태(Ready) : CPU를 할당 받으면 실행이 가능하지만, 자신의 차례를 기다리는 상태.
3.
실행 상태(Running) : CPU를 할당 받아 실행 중인 상태.
•
일정 시간 동안만 CPU 사용이 가능하다.
•
할당된 시간을 모두 사용하면, 타이머 인터럽트가 발생하며 다시 준비 상태로 변경된다.
4.
대기 상태(Waiting) : 입출력 요청을 받게되어 입출력 작업을 완료할 때까지 대기하는 상태.
•
입출력 작업이 끝나고 입출력 완료 인터럽트를 받을 때까지 대기하는 상태이다.
•
정확히는 특정 이벤트가 일어나기까지 기다리는 것이며, 대부분의 이벤트가 입출력 작업이다.
5.
종료 상태(End) : 프로세스가 종료된 상태.
프로세스 스케줄링(Process Scheduling)
•
운영체제가 프로세스들에게 공정하고 합리적으로 자원을 배분하는 것을 말한다.
•
특정 자원의 할당을 원하는 프로세스들은, 해당 자원의 스케줄링 큐에서 대기한다.
◦
대표적인 스케줄링 큐에는 준비 큐와 대기 큐가 있다.
▪
준비 큐 : CPU 사용을 위해 기다리는 큐.
▪
대기 큐 : 입출력 장치 사용을 위해 기다리는 큐.
◦
스케줄링 큐는 반드시 선입선출(FIFO) 방식은 아니며, 프로세스들이 대기하는 공간일 뿐이다.
•
운영체제는 스케줄링 큐에서 대기하는 각 프로세스들의 우선순위를 고려하여 자원을 배분한다.
프로세스 스케줄링 알고리즘(Process Scheduling Algorithm)
•
운영체제가 프로세스 스케줄링을 위해 사용하는 실질적인 방법이다.
•
대표적인 CPU 할당을 위한 프로세스 스케줄링 알고리즘의 종류는 아래와 같다.
1.
선입 선처리 스케줄링
•
준비 큐에 삽입된 순서대로 CPU를 할당해주는 방식이다.
•
먼저 실행되는 프로세스들의 실행 시간이 길다면, 대기 중인 프로세스들이 기다리는 시간이 매우 길어질 수 있다.
2.
최단 작업 우선 스케줄링
•
실행 시간이 가장 짧은 프로세스부터 CPU를 할당해주는 방식이다.
3.
라운드 로빈 스케줄링
•
준비 큐에 삽입된 순서대로 CPU를 할당하지만, 정해진 시간(타임 슬라이스)만큼만 할당해주는 방식이다.
•
정해진 시간동안 전부 실행되지 못했다면, 맨 마지막 순서로 돌아가서 다시 기다린다.
4.
최소 잔여 시간 우선 스케줄링
•
정해진 시간만큼 CPU를 할당하되, 다음 프로세스는 남은 작업 시간이 가장 적은 프로세스를 선택하는 방식이다.
5.
우선순위 스케줄링
•
프로세스들에 우선순위를 부여하고, 우선순위가 높은 프로세스부터 실행시키는 방식이다.
•
우선순위가 같다면, 선입 선처리로 처리한다.
•
우선순위가 낮은 프로세스는 무한정 실행되지 못하는 기아(Starvation)현상이 발생한다.
•
기아 현상 방지를 위해 오래 기다린 프로세스의 우선순위를 점차 높이는 에이징(Aging)기법을 사용한다.
6.
다단계 큐 스케줄링(Multilevel Queue Scheduling)
•
우선순위별로 준비 큐를 여러 개 사용하는 스케줄링 방식이다.
•
우선순위가 가장 높은 큐에 있는 프로세스를 먼저 처리한다.
•
우선순위가 가장 높은 큐가 비어 있으면, 그 다음 우선순위 큐를 처리한다.
•
우선 순위가 낮은 프로세스는 기아 현상이 발생할 수 있다.
7.
다단계 피드백 큐 스케줄링
•
큐 간의 이동이 가능한 다단계 큐 스케줄링이다.
•
우선순위가 가장 높은 큐부터 처리를 하되, 일정 시간(타임 슬라이스)동안 못 끝낸 경우 그 다음 우선 순위 큐로 다시 이동하여 대기한다.
•
CPU 사용 시간이 길수록 우선 순위가 내려가게 된다.
•
즉, CPU 사용 시간이 긴 CPU 집중(CPU Bound) 프로세스는 우선 순위가 상대적으로 낮아지고, CPU 사용 시간이 짧고 입출력 작업이 많은 입출력 집중(I/O Bound) 프로세스는 우선 순위가 상대적으로 높아진다.
•
또한, 에이징 기법을 통해 기아 현상을 방지한다.
참고 자료
•
혼자 공부하는 컴퓨터구조 + 운영체제 - 강민철.