I/O Scheduler는 Block Layer에 해당하며, file system으로부터 bio structure에 대한 request submit을 받아 Block I/O에 대한 동작 요청을 I/O Request queue로 효율적으로 전달하는 역할을 한다.
여기서 효율적으로 라는 말에 집중을 해보자.
왜 효율적으로 해야할까? 갑자기 효율적이라는 말이 왜 나온 것일까?
그러기 위해서는 우선 Block I/O에 대해서 알아보아야 한다.
Block device는 개별 byte 단위가 아닌 일정 크기 (block) 단위로 접근하는 장치를 말한다.
그 예로 하드디스크와 같은 대용량 저장 장치를 들 수 있다.
전통적으로 이런 Block device는 Character device와는 다르게 파일 시스템이라고 하는 추상화 계층을 통해 간접적으로 접근하게 되며 따라서 프로그래머는 해당 저장 장치가 어떠한 종류의 장치인지와는 무관하게 일관된 방식으로 장치를 이용할 수 있는 것이다.
이런 하드디스크의 특징 중 하나는 읽고자하는 영역(LBA)의 순서를 어떻게 설정하느냐에 따라 성능이 크게 차이날 수 있다는 것이다.
따라서 다양한 알고리즘을 가진 I/O scheduler가 등장하게 되었다.
그럼 몇가지 스케쥴러에 대해 알아보도록 하자.
1. NOOP scheduler
No Operation scheduler. 즉 아무것도 하지 않는 scheduler이다.
SSD나 반도체 디스크 등 성능 좋은 디스크를 사용할 경우 굳이 scheduler가 아무것도 하지 않아도 SSD가 내부 scheduling 정책을 이용하여 I/O를 빠르게 서비스 해 줄 수 있기 때문에 선택하곤 한다.
커널은 아무것도 하지 않으므로 부하를 더욱 줄일 수 있다는 생각이 기저에 있다.
2. Deadline scheduler
I/O 대기시간의 deadline을 정해놓고, 그것이 가까운 lba부터 먼저 처리한다.
처리량보다는 지연에 최적화 된 스케줄링을 한다.
읽기 및 쓰기를 모두 균형있게 처리한다.
몇몇 프로세스가 많은 수의 I/O를 발생시키는 환경에 적합하다.
데이터 베이스의 파일 시스템에 많이 사용된다.
3. CFQ (Completely Fair Queueing) scheduler
프로세스마다 I/O queue를 가지고 최대한 균등하게 서비스하도록 예약한다.
많은 프로세스들이 세세한 I/O 를 많이 발생시킬 때 사용하면 좋다.