하드디스크를 통해 입출력 작업이 일어나는 시간보다 CPU가 훨씬 빠르게 동작하기 때문이다. 일반적으로 입출력 작업(하드디스크 접근)에 소요되는 시간이 CPU 작업에 소요되는 시간의 1400만배에 해당한다. 예를 들어 입출력 작업을 실행시키고 나면 프로세스는 1400만 CPU 사이클만큼 기다려야 한다.
따라서 입출력 작업을 실행하는 프로세스로부터 CPU를 뺏어 레디 큐에 있는 프로세스 하나를 선택하여 CPU를 할당해주는 Process/Context Switching이 일어나게 되는 것이다.
위의 세 가지 경우에서 기다려야 할 때 (blocking) CPU를 다른 프로세스에게 할당하면 시스템의 성능이 향상된다.
입력/출력 동작에는 일반적으로 2단계가 존재한다.
1) Read
2) Write
입력(Read)의 경우를 예로 들어보자면, 1단계와 2단계가 일어나는 동안 계속 blocking 되어 기다리는 방식이다.
▶ 1단계와 2단계가 모두 완료될 때까지 blocking
1단계가 일어나는 동안 다른 일들을 수행하는 것이 기본 아이디어이다. 다만 1단계가 완료되었는지 지속적으로 확인하는 과정이 동반된다. (polling)
이 경우 데이터가 준비되지 않았을 경우 커널 쪽에서 EWOULDBLOCK 오류를 리턴해준다.
▶ 2단계에서만 blocking
여러 개의 파일 디스크립터로부터 입출력을 수행할 때 사용한다.
커널에게 1단계가 완료될 경우 signal(신호)를 보내 알려달라고 하는 방식이다.
▶ 2단계에서만 blocking
커널에게 1단계와 2단계 모두가 완료될 경우 signal(신호)를 보내 알려달라고 하는 방식이다.
▶ 1, 2단계 모두 blocking 필요 없음 (프로세스는 다른 일을 수행할 수 있음)