CPU 시간을 아주 짧은 조각으로 쪼개서 여러 Process 에게 돌아가며 나눠주는 방식이다. 조각이 사람이 느끼기 어려울 만큼 짧기 때문에, 실제로는 한 순간에 하나만 실행되고 있어도 여러 프로그램이 동시에 도는 것처럼 보인다.
CPU 코어 하나는 한 번에 명령 하나만 실행한다. 여러 프로세스를 동시에 굴리는 것처럼 보이게 만드는 방법은 두 가지인데, 코어를 여러 개 두어 진짜로 병렬 실행하거나(parallelism), 하나의 코어를 시간으로 쪼개 번갈아 실행하는 것(concurrency)이다. 시분할은 뒤쪽이다.
어떻게 돌아가나
각 프로세스에 time quantum (또는 time slice) 이라는 실행 시간 한도를 준다.
- 스케줄러가 프로세스 하나를 골라 CPU 를 넘긴다
- quantum 이 끝나거나 프로세스가 입출력을 기다리게 되면 타이머 인터럽트가 걸린다
- 지금 프로세스의 레지스터·프로그램 카운터를 process control block 에 저장하고, 다음 프로세스의 것을 불러온다 (Context Switching)
- 1 로 돌아간다
어떤 순서로 고를지는 CPU Scheduling 의 문제다. 시분할과 짝을 이루는 대표적인 정책이 라운드 로빈으로, 대기 중인 프로세스를 순서대로 한 quantum 씩 돌린다.
quantum 길이의 절충
quantum 을 짧게 잡으면 각 프로세스가 CPU 를 받기까지의 대기 시간이 줄어 반응이 빨라진다. 대신 전환 횟수가 늘어나고, 전환마다 드는 context switching 비용이 전체 처리량을 깎는다.
길게 잡으면 반대가 된다. 전환 비용은 줄지만, 앞의 프로세스가 quantum 을 다 쓸 때까지 뒤가 기다려야 해서 반응이 굼떠진다. quantum 이 무한히 길어지면 프로세스가 스스로 CPU 를 내놓을 때까지 기다리는 비선점 방식과 같아진다.