프로세스는 CPU execution과 I/O wait의 cycle로 구성된다.
CPU burst(CPU execution)는 CPU에 의해 직접 수행되는 작업의 부분이다. I/O작업이 거의 없고 CPU가 참여, 명령하고 실행한다.
I/O burst(I/O execution)는 CPU에 의하지 않고 일어나는 작업의 부분이다. CPU가 참여하는 순간이 잠시 있다.
일반적으로 프로세스는 많은 수의 짧은 CPU burst들 혹은 적은 수의 긴 CPU burst들로 구성되며, 이들의 편중에 따라 I/O-bound프로그램과 CPU-bound프로그램으로 나눌 수 있다.
따라서
I/O-bound 프로그램은 짧은 CPU burst들이 많이 있는 것이고 CPU-bound 프로그램은 긴 CPU burst들이 조금 있는 것이다.
CPU burst와 I/O burst들의 분포는 적절한 스케줄링 알고리즘을 선정하는데 매우 중요하다.
Short-term scheduler는 빈도수가 가장 높다. Short-term scheduler가 레디큐에 있는 메모리의 프로세스 중에 선택한 다음 dispatcher가 CPU제어를 할당한다. CPU제어에는 컨텍스트 스위치, 유저 모드로 스위치, 유저 프로그램에서 재시작 하기 위해 적절한 위치로 이동하는 것을 할 수 있다.
short-term scheduler는 가능한 빨라야하며 매번 스위치가 일어날 때마다 디스패치 모듈이 구동된다.
Dispatch latency(디스패치 때문에 지연되는 시간)는 디스패치가 프로세스 하나를 정지시키고 다른 하나를 구동시키는데 걸리는 시간이다. (context swtich time + 레디큐에서 프로세스를 고르는 시간)
선점 스케줄링(preemptive): 강제성을 띄고 있으며 해당 프로세스 스스로가 아닌 타의에 의한 강제적인 스케줄링이다.
비선점 스케줄링(nonpreemptive): 강제성을 띄고 있지 않고 프로세스가 스스로 일을 수행하는 것이다. 자의에 의해 그만두기 전까지 수행한다.
CPU스케줄링에 있어서 결정이 필요한 4가지 경우가 있다.
preemptive(선점) 스케줄링일 때 2개 이상의 프로세스들이 공유 데이터를 사용하는 경우 문제가 발생할 수 있다.
데이터를 변경하는 중에 강제로 할당된 CPU가 다른 프로세스에 할당된다면 문제가 생긴다.
그리고 어떤 프로세스가 커널 모드에서 중요한 데이터, 예를 들면 프로세스 테이블의 수정, 프로세스의 생성 등과 같은 중요 업무 수행 중에 선점될 경우 문제가 발생할 수 있다.
이러한 문제를 해결하기 위해서는 프로세스 동기화가 필요하다.
(스케줄링 알고리즘이 좋은지 판단하는 근거 기준)