[운영체제] Process
수업시간에 배운 프로세스에 관한 내용을 정리해보고자 한다.
What is process?
소프트웨어는 시스템 프로그램과 사용자 응용 프로그램으로 나뉘고, 운영체제를 흔히 시스템 프로그램의 종류로 구분한다.
모든 프로그램은 보조기억장치에 저장되고, 주기억장치(메인메모리)에 로드되어 CPU를 할당받아 실행되어 작업을 처리한다.
이러한 프로그램은 실행중인 상태가 아닌 보조기억장치에 저장되어 있는 것을 말하고, 커널에 의해 Time slice를 할당받아 CPU를 점유하고 있는 상태로써 실행중인 프로그램을 프로세스라고 한다.
CPU가 하나인 단일 프로세서 상에서 프로세스의 상태는 커널에의해 관리되어 진다.
Process State
커널은 프로세스의 상태를 4가지로 분류한다.
- Waiting (대기상태) : CPU를 할당받아 실행상태가 되기 위해 기다리고 있는 상태로 언제든지 CPU를 할당받으면 실행상태가 될수 있게 준비하고 있는 상태이다.
- Running (실행상태) : CPU를 할당받아 실행중인 상태로, CPU의 개수만큼 실행상태의 프로세스가 생성된다.
- Sleeping (슬립상태) : I/O작업이나 그에 상응하는 어떠한 사건이 발생하여 완료되기를 기다리는 상태이다.
- Zombie (좀비상태) : 프로세스가 종료되어 커널에 의해 사용중이던 자원을 회수되는 상태이다.
Process State Transition(State Diagram)
커널은 프로세스가 생성(Fork) 되면 대기큐(Waiting Queue)의 맨끝(Queue는 FIFO = First In First Out)에 삽입하여 Waiting(대기상태)로 만든다.
대기상태의 프로세스는 Dispatcher(Scheduler)에 의해 Dispatch(프로세스를 CPU에 올리는 스케줄링 행위)되면 Running(실행상태)가 된다. 이때의 실행상태인 프로세스는 CPU의 개수만큼 만들어지며, CPU를 점유하고 있는 상태이다.
실행중인 프로세스의 Time Slice(커널에 의해 할당받은 CPU 할당 시간)가 만료되면 대기큐의 맨끝에 삽입되어 Waiting이 된다. 이는 자원을 효율적이고 공정하게 관리한다는 운영체제의 원칙에 의해 수행된다는 점을 인지하여야 한다. 대기큐의 맨끝이 아닌 앞에 위치하게 되면 CPU를 다시 할당받아 CPU를 독점하는 일이 발생하게 되고 이러한 동작은 컴퓨터의 성능에 심각한 악영향을 미칠수 밖에 없다.(내가 원하는 프로그램을 실행시켰는데 실행되지 않고 계속 대기한다고 생각해보자…)
또한, 실행중인 프로세스의 Time Slice가 만료되었는데도 불구하고 CPU를 내놓지 않는다면 Clock(클럭)이 해당 프로세스에게 Interrupt(인터럽트 : CPU를 가로막아 제어권을 뺏어오는 행위)를 발생시켜 운영체제가 제어권을 갖도록 하고, 운영체제는 해당 프로세스를 Waiting으로 만들고 대기큐의 맨앞에 있는 프로세스를 Running으로 만든다.
Clock은 커널내에서 시간을 측정하는 역할을 하는데 시간을 측정하여 프로세스의 Time Slice가 만료 되엇음을 커널에게 알리거나, 프로세스를 WakeUp시키거나, 성능을 측정할때 사용된다.
실행중인 프로세스가 I/O 작업(입출력작업) 혹은 그에 상응하는 사건의 작업이 발생하면 실행중인 프로세스는 스스로 Sleeping( 다른말로 Block상태 즉,잠자고있는상태)에 빠지게 되며, 이때 슬립큐(Sleep Queue)의 맨끝에 삽입된다.
슬립큐 역시 FIFO방식으로 구현되는데, 여기서 한가지의 의문점이 들었었다. 슬립큐에 진입하는 프로세스들의 입출력작업의 수행시간의 양은 다 달라서 상대적으로 짧거나 길텐데, 나중에 진입한 프로세스의 입출력작업이 상대적으로 짧았다면 앞의 상대적으로 긴 입출력작업을 수행하는 프로세스가 WakeUp 될때까지 기다려야하는가? 라는 의문이생겼다. 만약 그러하다면 성능상의 문제가 발생하지 않을까?
입출력작업은 입출력장치인 하드웨어에서 처리하고, 입출력장치는 하나가 아니라 여러개로 구성된다. 또한 각각의 입출력장치 마다 슬립큐를 별도로 가지므로, 각각의 별도의 슬립큐에서 FIFO방식으로 구성이되어도 슬립큐가 다르므로 위의 문제가 발생하지 않는것이다.
작업이 끝날때 까지 슬립큐에 대기하던 프로세스는 I/O 작업 혹은 그에 상응하는 사건의 작업이 완료되면 WakeUp(Sleeping->Waiting) 시켜 대기큐의 맨끝에 삽입된다.
이러한 입출력작업 또는 그에 상응하는 사건이 발생하거나 Time Slice가 만료되는 동작들에 의해 CPU를 점유하던 프로세스가 다른 프로세스에게 CPU를 이양하게 되는데 이러한 스케줄링 알고리즘 동작에 대한 일련의 과정을 Context Switching(문맥교환) 이라고 한다.
프로세스가 종료되면 Zombie(좀비상태) 가 되고, 커널이 이 프로세스가 사용중이던 자원을 회수한다. 자원 회수가 완료되면 Zombie에서 제거된다.
중요한 부분은 하나의 경우를 빼고 모든 상태천이는 커널에 의해 수행되지만, I/O작업이 발생했을때 Sleeping 으로의 상태천이는 프로세스가 자의로 전환한다는 것이다.
Process Scheduling Algorithm
Scheduler의 역할은 어떤 프로세스를 Fork(생성)하고 , Dispatch(CPU를 할당받도록하여 실행상태로 만듦)하고, Sleeping으로 만들거나 Waiting으로 만들거나 종료시킬 것인가를 결정하는 것이다.
또한 Scheduler는 만들어진 Scheduling Algorithm에 따라 위의 동작들을 수행한다. (즉, 주된목적은 실행가능한 프로세스를 결정하는것)
프로세스 스케줄링 알고리즘은 다음 네가지의 원칙을 이행하여야 한다.
- 공정성(Fairness)
- 효율성(Efficiency)
- 빠른 응답시간(Fast Response Time)
- 높은 생산성(High Throughput)
위의 네가지 원칙을 이행하면서 스케줄링 알고리즘은 크게 세가지로 분류된다.
- 선점 스케줄링 : 현재 실행중인 프로세스가 긴급한 실행을 요구하는 프로세스가 발생했을 때 CPU를 즉시 양보하는 스케줄링 방법
- 비선점 스케줄링 : 현재 실행중인 프로세스가 긴급한 실행을 요구하는 프로세스가 발생했을 때 양보하지 않는 스케줄링 방법
- 조건부 선점 스케줄링 : 현재 실행중인 프로세스가 긴급한 실행을 요구하는 프로세스가 발생했을때 남은 작업을 모두 완료하고 CPU를 양보하는 스케줄링 방법
선점 스케줄링 알고리즘의 종류
선점 스케줄링 알고리즘으로 분류되는 것들 중에서 흔히 배우는 것들은 다음과 같다.
- 우선순위 스케줄링 알고리즘 : 우선순위 값이 높은 프로세스 부터 Running 으로 만들수 있도록 하는 알고리즘
특정요인(비용을 많이 지불한 프로세스가 우선순위 값이 높도록)에 따라 프로세스의 우선순위 를 조정시켜 준다.
이후 대기큐에 진입한 프로세스들을 Sort()하여 우선순위 값이 높은 프로세스를 먼저 실행할수 있도록 하는데, 우선순위 값이 높아 프로세스가 대기큐로 재진입하여도 다시 CPU를 점유하는 이른바 CPU독점 행위가 발생할수 있기 때문에 반드시 CPU를 내놓고 대기큐로 재진입 할때는 우선순위 값을 감소시켜 주어야 한다. (이는 스케줄링 원칙중 공정성에 해당)
우선순위 값을 할당하는 방법에는 정적할당과 동적할당 방법이 있는데, 사용자 응용 프로그램의 경우에는 동적으로 할당해주며 시스템 프로그램의 경우 빠르게 그리고 먼저 수행시키기 위해 정적으로 우선순위값을 고정적으로 높게 할당해 준다. Unix OS에는 사용자 영역내에서 우선순위값을 높이는 nice(1) 명령어가 있다.
우선순위 스케줄링 알고리즘은 알고리즘이 간다하고, 구현하기 간단하며 , 대체로 성능이 우수하다는 장점이 있는 반면 Starvation(기근 : 우선순위가 높은 프로세스가 CPU를 독점)이 발생할 가능성이 있다. 따라서 이를 해결하기 위해 우선순위 값을 감소시켜 준다고 위에서 설명하였다.
- 다중큐 스케줄링 알고리즘 : 우선순위 스케줄링을 기반으로 여러개의 클래스(여러개의 대기큐)들로 그룹화하여 만들어놓고 우선순위가 높은 클래스(대기큐) 순서대로 그룹내에서 Round Robin 방식(FIFO)으로 프로세스를 실행시키도록 만드는 알고리즘
다중큐 스케줄링 알고리즘은 각 클래스가 우선순위값의 범위가 되어 해당 우선순위값을 가지는 프로세스를 탐색할때 탐색비용이 적게든다는 특징이 있다.(해당하는 우선순위값의 범위에 있는 그룹만 탐색하면 되니까)
장점으로는 우선순위값에 따라 그룹화하여 클래스단위로 프로세스를 관리하기 때문에 프로세스의 관리가 용이하다는 것이고, 단점으로는 클래스(대기큐)의 관리가 복잡하다.
- SJF(Shortest Job First) 알고리즘 : 작업의 수행시간이 가장 짧은 프로세스를 먼저 실행시키도록 만드는 알고리즘
SJF의 경우 프로세스의 작업시간을 알수 잇을때만 사용이 가능하지만, 작업시간을 알아 SJF를 사용할수있다면 성능의 개선이 매우크다.
특히 멀티미디어 시대가 되면서 이전의 문자나 숫자, 이진코드와같은 ASCII 데이터를 다루다가 이미지,동영상,음악파일 과같은 데이터들을 사용이 많아지면서 SJF 알고리즘을 많이 사용한다고 한다.
적용예를 살펴보자면, 수행시간이 1,20,15,10 분이 걸리는 동영상 파일이 있다고 가정해보자. (도착시간은 0분으로 가정)
Round Robin방식으로 수행하면 첫번째 파일의 수행시간은 1분,그다음은 21(1+20)분, 그다음은 36(1+20+15)분, 그다음은 46(1+20+15+10)분이 걸려 전체 평균 수행시간은 약26분이 걸린다.
그에비해 SJF방식으로 수행하면 첫번째파일의 수행시간은 1분, 그다음은 11분, 그다음은 26분, 그다음은 46분이 걸려 전체평균 수행시간은 약21분이 걸린다.
비선점 스케줄링 알고리즘의 종류
비선점 스케줄링으로 분류되는 알고리즘은 가장 흔히 알고있는 Round Robin이 있다.
- Round Robin 알고리즘 : 대기큐에 있는 프로세스들을 FIFO방식으로 실행시키도록 만드는 알고리즘(맨앞의 프로세스가 실행상태가 되고 대기큐에 재진입하는 프로세스는 대기큐의 맨끝으로 진입)
Round Robin의 성능은 ‘Time Slice를 얼마나 할당하는가’ 가 핵심이 된다. Time Slice를 너무적게 할당하면 실행상태의 프로세스가 너무 잦은 전환이 발생하여 CPU효율이 떨어지고, 너무 크게주면 짧은 상호작용을 하는 프로세스의 요구에 대해 부적절한 응답을 얻을수 있다. 실례로 Unix OS는 Time Slice를 1초로 할당한다.
Round Robin은 가장 간단하고 구현이 쉽고 성능이 대체적으로 우수하다는 장점이 있지만, 비선점 알고리즘으로써 긴급한 실행을 요구하는 프로세스의 실행이 늦어질 가능성이 있다는 단점이 있다.
댓글남기기