스케줄링의 개념
단일 처리 시스템에서는 실행 중인 프로세스(A)가 존재하는데 다른 프로세스(B)가 입출력을 요청하면 그 프로세스(B)는 이전의 프로세스(A)의 자원을 놓을때까지 대기하고 있어야합니다. 하지만 다중 프로그래밍에서는 여러 프로세스들이 동시에 돌아갈 수 있으며, 프로세스가 자원(프로세서 등)을 요청하면 운영체제는 그 자원을 적절히 분배하여 프로세스에게 할당합니다. 그래서 다음과 같은 장점을 얻을 수 있습니다.
1. CPU의 활용 극대화
2.프로세스 처리율(시간 당 작업량)을 늘릴 수 있습니다.
프로세스는 필요한 자원을 할당받기 위해 큐에 대기합니다. 그래서 그 큐에 있는 프로세스를 어떻게 스케쥴링하는지가 프로세스 스케줄링 알고리즘이라고 합니다. 그레서 어떤 스케줄링 알고리즘이 있는지 봅시다.
잠깐 프로세스 스케줄링에 관한 용어 몇가지만 알아보고 가도록 합시다. 대기 시간, 실행 시간, 반환 시간입니다.
용어 | 설명 |
대기 시간 | 자원의 할당을 대기하는 시간을 의미합니다. |
실행 시간 | 실제로 프로세스가 자원을 할당받은 다음 작업을 수행하는 시간을 의미합니다. |
반환 시간 | 작업을 완료하는데 소요되는 전체 시간으로 대기 시간과 실행 시간을 모두 포함합니다. |
1 선입선처리 스케줄링(First Come First Served, First In First Out)
선입선처리(FCFS, FIFO) 알고리즘은 말 그대로 먼저 요청한 프로세스가 먼저 자원을 제공받으며 이미 사용중이라면 사용이 끝날때까지 기다려야하는 스케줄링 방식입니다.
프로세스 5개가 있고, 각가 P1의 실행시간 10, P2의 실행시간 5, P3의 실행시간 6, P4의 실행시간 9, P5의 실행시간 10이라고 할때 반환 시간을 알아보도록 하죠.
프로세스 | 도착 시간 | 실행 시간 |
P1 | 0 | 10 |
P2 | 1 | 28 |
P3 | 2 | 6 |
P4 | 3 | 4 |
P5 | 4 | 14 |
먼저 요청한 프로세스가 먼저 제공받으니 P1부터 차례대로 자원을 할당받습니다. 그래서 프로세스의 반환시간과 대기시간을 구하면 아래와 같습니다.
프로세스 | 반환시간 | 대기시간 |
P1 | 10 | 0 |
P2 | 37 | 9 |
P3 | 42 | 36 |
P4 | 45 | 41 |
P5 | 58 | 44 |
평균 | 평균 반환 시간 (10+37+42+45+58)/5 = 38.4 |
평균 대기 시간 (0+9+36+41+44)/5 = 26 |
장점 | 1) 스케줄링이 단순합니다. 2) 모든 프로세스가 실행될 수 있습니다. 3) 프로세서가 지속적으로 유용한 프로세스를 수행하여 처리율이 높습니다. |
단점 | 1) 비선점방식의 스케줄링이므로 대화형 작업에는 부적합합니다. 2) 만약 어떤 프로세스의 수행시간이 길면 대기시간이 늘어납니다. 그래서 짧고 간단한 작업은 계속 기다려야합니다. |
2. 최소 작업 우선 스케줄링(Shortest Job First)
프로세스의 실행 시간을 이용하여 가장 짧은 시간을 갖는 프로세스가 먼저 자원을 할당받는 방식입니다. 이 방식은 선점할 수도 있는 스케줄링 방식입니다. 이전에 FIFO방식은 중간에 다른 프로세스가 들어오면 그 프로세스는 대기해야했죠? 이 스케줄링 방식은 선점 또는 비선점이 가능합니다. 위와 같은 프로세스라고 할때 비선점형 SJF 스케줄링의 결과는 아래와 같습니다.
프로세스 | 반환시간 | 대기시간 |
P1 | 10 | 0 |
P2 | 61 | 33 |
P3 | 18 | 12 |
P4 | 11 | 7 |
P5 | 30 | 16 |
평균 | 평균 반환 시간 (10+61+18+11+30)/5 = 26 |
평균 대기 시간 (0+33+12+7+16)/5 = 13.6 |
자 P1이 먼저 요청해서 자원을 할당받아 놓은 상태인데, P2가 도착합니다. 비선점형이기 때문에 P2는 우선 기다리고 있는데 P1의 작업이 끝나기 전에 P3, P4 ,P5의 요청이 도착하네요. 그러면 실행 시간이 가장 작은 P4가 자원을 할당받아 쓰고 그 다음인 P3이 자원을 할당받아 사용합니다. 이렇게 되면 위와 같은 결과가 도출되지요.
그렇다면 비선점형 SJF는 어떨까요? 아래의 표가 선점형 SJF의 결과입니다.
프로세스 | 반환시간 | 대기시간 |
P1 | 20 | 10 |
P2 | 61 | 33 |
P3 | 10 | 5 |
P4 | 4 | 0 |
P5 | 30 | 16 |
평균 | 평균 반환 시간 (20+61+10+4+30)/5 = 25 |
평균 대기 시간 (10+33+4+0+16)/5 = 12.6 |
이해를 돕기 위해서 아래의 간트 차트를 보세요. P1이 먼저 도착해서 수행하고 있는 와중에 P2가 도착하는데요. P2는 수행되어야할 시간이 P1보다 크니 P1은 계속 작업을 수행합니다. 그러다가 P3가 도착하는데 P1이 수행해야할 시간보다 P3의 수행시간이 더 짧으니 P3가 작업을 수행합니다. 그런데 P4가 다음에 도착하네요. P4가 더 적은 시간을 갖으니 P4를 수행합니다. 이때 P4가 끝나면 남아있는 프로세스 중에서 가장 적은 수행시간을 갖는 P3의 작업을 이어서 하게 됩니다.
장점 | 1) 항상 짧은 작업을 먼저 처리하게 되니까 평균 대기시간이 가장 짧습니다. |
단점 | 1) 수행시간이 긴 작업은 짧은 작업에 밀려 기아가 발생합니다. 2) 실행 시간을 예측할 수 없어 실용적이지 못합니다. 3) 짧은 작업이 먼저 실행되므로 공정하지 못한 정책입니다. |
3. 우선순위 스케줄링
우선순위 스케줄링은 프로세스마다 우선순위라는 속성이 붙게 됩니다. 우선순위 스케줄링도 역시 선점, 비선점형으로 스케줄링이 가능합니다. 숫자가 높을 수록 우선순위가 높고 만약 우선순위가 같다면 FIFO방식으로 동작합니다.
프로세스 | 도착 시간 | 실행 시간 | 우선순위 |
P1 | 0 | 10 | 3 |
P2 | 1 | 28 | 2 |
P3 | 2 | 6 | 4 |
P4 | 3 | 4 | 1 |
P5 | 4 | 14 | 2 |
그래서 아래는 선점형에서의 결과를 나타낸 표입니다. 약간 헷갈릴 수 있을텐데요. P1 먼저 수행하다가 P3가 오면 우선 순위가 P3가 더 높으니까 P1은 대기하고 P3가 작업을 수행합니다.
프로세스 | 반환시간 | 대기시간 |
P1 | 16 | 6 |
P2 | 43 | 15 |
P3 | 6 | 0 |
P4 | 59 | 55 |
P5 | 54 | 40 |
평균 | 평균 반환 시간 (16+43+6+59+54)/5 = 35.6 |
평균 대기 시간 (6+15+0+55+40)/5 = 23.2 |
다음은 비선점형일때의 결과 표입니다.
프로세스 | 반환시간 | 대기시간 |
P1 | 10 | 0 |
P2 | 43 | 15 |
P3 | 14 | 8 |
P4 | 59 | 55 |
P5 | 54 | 40 |
평균 | 평균 반환 시간 (10+43+14+59+54)/5 = 36 |
평균 대기 시간 (0+15+8+55+40)/5 = 23.6 |
만약 우선순위가 낮은 프로세스가 높은 프로세스에 의해 실행이 되고 있지 않은 상황이라면 어떻게 될까요? 이때는 그 프로세스의 우선순위를 점차 높여 처리받게끔 하는 에이징이라는 기법을 사용합니다.
장점 | 1) 각 프로세스의 중요성에 따라서 작업을 수행하기 때문에 합리적입니다. 2) 실시간 시스템에서 사용가능합니다. |
단점 | 1) 높은 우선순위를 갖는 프로세스가 계속적으로 스케줄링이 되면 우선순위가 낮은 프로세스는 자원을 할당받지 못하기 때문에 기아가 발생할 수 있습니다. |
4. 라운드 로빈 스케줄링(Round-Robin)
라운드 로빈 스케줄링은 시분할 시스템을 위해 설계된 스케줄링 기법입니다. 이 스케줄링은 작은 단위의 시간인 시간 할당량(Time-Slice)을 정의하여 그 시간 만큼 자원을 할당하는 방식입니다. 그래서 그 시간안에 작업을 끝내지 못하면 다음 프로세스가 다시 그 시간만큼 자원을 할당받아씁니다. 여기서 시간 할당량을 5로 정하고 간트 차트와 결과를 보면 아래와 같습니다.
각 프로세스들은 공정하게 5만큼의 시간 동안 작업을 진행하는 것을 볼 수 있네요.
프로세스 | 반환시간 | 대기시간 |
P1 | 29 | 19 |
P2 | 61 | 33 |
P3 | 33 | 27 |
P4 | 16 | 7 |
P5 | 45 | 31 |
평균 | 평균 반환 시간 (29+61+33+16+45)/5 = 36.8 |
평균 대기 시간 (19+33+27+7+31)/5 = 23.4 |
장점 | 1) 모든 프로세스가 공정하게 스케줄링을 받을 수 있습니다. 2) 실행 큐에 프로세스의 수를 알고 있을때 유용합니다. 3) 프로세스의 짧은 응답시간을 갖고 최악의 응답시간을 알 수 있습니다. 4) 평균 대기시간이 FIFO와 SJF보다 적습니다. |
단점 | 1) 성능은 규정 시간량의 길이에 따라 달라지므로 작업이 비슷한 길이가 좋은데, 너무 길면 FIFO로 변하고 짧으면 문맥 교환(Context Switching) 비용이 증가합니다. 2) 하드웨어적 타이머가 필요합니다. 3) 미완성 작업은 규정 시간량(시간 할당량)을 마친 후 프로세서를 기다리니까 평균 처리 시간이 높습니다. |
'컴퓨터 > 운영체제(주로 리눅스)' 카테고리의 다른 글
[리눅스] 쉘 스크립트(Shell script) 기본 문법, 작성방법(변수,반복문,비교문,종료상태 등) (2) | 2021.03.07 |
---|---|
[리눅스] 커널(kernel)과 쉘(shell)의 개념, 쉘을 이해해보자 (0) | 2021.03.07 |
[리눅스] cmake에 대한 개념 설명과 CMakeLists.txt 작성법 (0) | 2021.02.24 |
[운영체제/리눅스] 교착상태(deadlock)의 원인과 쓰레드를 통한 교착상태 발생 예제와 회피방법(pthread_mutex_timed_lock) (0) | 2020.12.31 |
[리눅스] 정적라이브러리 작성, 공유 라이브러리 작성, 차이점 보기 (1) | 2020.12.28 |