모든 프로세스는 CPU를 필요로 한다!
이러한 프로세스에 대해서 공정하고 합리적이게 CPU 자원을 할당하기 위해서는 운영체제는 각각의 결정을 내려야 한다.
이렇게 운영체제가 CPU 자원을 프로세스에게 공정하고 합리적이에 배분하는 것을 CPU 스케줄링(scheduling) 이라 한다.
우선순위가 높은 프로세스에는 대표적으로 입출력 작업이 많은 프로세스 가 있고 왜? 입출력 작업이 많은 프로세스를 먼저 실행하는 것이 더 효율적일까??
그 이유는 일반적으로 대부분 프로세스들은 CPU와 입출력장치를 모두 사용하며 실행한다. 즉 실행상태와 대기상태를 반복한다
CPU 명령어 실행 -> 보조기억장치 저장 -> CPU 명령어 실행 -> 화면 출력 -> CPU 명령어 실행 -> ...
프로세스 마다 입출력 장치를 이용하는 시간과 CPU를 이용하는 시간의 양의 차이가 당연히 존재하는데,
CPU버스트(burst)와 입출력 버스트
"-----------------------------------실행 흐름--------------------------->>>>"
| CPU 사용 ( CPU버스트 ) | 입출력장치 사용( IO버스트 ) | CPU 사용 | • • •
- 이와 같이 입출력 버스트가 빈번하게 일어나는 프로세스는 입출력 집중 프로세스라고 한다.
왜냐하면 입출력 작업은 대기상태에 많이 머무르게 되기 때문이다. 그래서 각각의 상황에 맞게 CPU를 배분하는 것이 효율적이다 !
PCB에 운영체제는 각 프로세스의 우선순위를 명시하고 CPU는 자연스럽게 순서에 맞게 프로세스를 실행한다.
프로세스 우선순위 직접 확인하기
윈도우에서 Process Explorer라는 소프트웨어를 통해 우선순위 확인가능!
PCB에 적힌 우선순위를 운영체제가 일일이 확인하는 것은 비효율적이다. CPU를 원하는 프로세는 한두개가 아니고 또 프로세스가 생겨날 수 도 있기 때문이다.
게다가 CPU 자원뿐만아니라 메모리에 적재되고 싶어하는 프로세스도 존재하기 때문에, 운영체제가 매번 PCB를 확인하고 순서를 정하는 것은 비효율적이다
그래서 운영체제가 사용하는 것은 스케줄링 큐 (scheduling queue) 이다. 참고로 스케줄링 큐는 자료구조의 큐와 같이 선입선출 방식일 필요는 없다.
운영체제가 관리하는 대부분의 자원은 이렇게 큐로 관리된다. 또한 대표적인 큐로는
예시 ( CPU를 번갈아가며 실행 )
준비상태에서 접어든 프로세스가 디스패치 됨 -> 실행
-> 실행이 끝나면 타이머 인터럽트가 발생해 준비상태로 간다. 만약 입출력장치를 사용해야 된다면 대기상태로 돌입한다.
-> 입출력작업이 완료 되면 인터럽트 신호 발생하고 준비상태로 넘어간다.
만약 어떤 프로세스가 급한 요청을 한다면????
이럴때 두가지 방법이 있따
운영체제가 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케줄링 방식이다
장점은 어느 한 프로세스의 자원 독점을 막고 프로세스들에 골고루 자원을 분배 할 수 있따.
-> 프로세스마다 정해진 시간만큼 CPU를 사용하고 정해진 시간을 모두 소비하면 타이머 인터럽트가 발생하여 운영체제가 해당 프로세스로부터 CPU자원을 빼앗아 다른 프로세스를 주는 방식은 선점형 스케줄링의 일종이다.
다만 단점은 그만큼 컨텍스트 스위칭(문맥교환)과정에서 오버헤드가 발생할 수 있다.