입출력 스케줄러
디스크의 Seek Time을 최소화 하기 위해 순서를 조작하여 탐색횟수와 서비스 시간을 최소화 하는 것.
주요 역할
- 인접한 요청들을 하나의 요청으로 병합
- 입출력 요청을 오름차순으로 정령
읽기는 요청 즉시 서비스되어야 하는 반면에, 쓰기는 버퍼 캐시에 데이터를 모아두고 처리할 수 있기 때문에 읽기가 쓰기보다 우선순위가 높다.
리눅스 스케줄러
- 리눅스 엘리베이터(리눅스 2.4) : 헤드가 한 방향으로 가면서 순차적으로 서비스를 제공하고, 정해진 시간 이상 대기한 starving 상태는 삽입정렬을 멈추고 먼저 해결
- 리눅스 2.6 스케줄러
- 데드라인(Deadline)
- 예측(Anticipatory) : 성능이 좋았던 프로세스에 대해 다른 요청이 와도 잠시 대기
- CFQ : 공평하게 스케줄링 제공
- NOOP : 스케줄링을 하지 않음
Anticipatory나 CFQ는 HDD에서 사용하고, NOOP은 SSD에서 사용
최적화 방법
- 같은 디렉토리에 속할수록 물리적으로 인접할 확률 높음
- 아이노드 번호 순서대로 물리블록이 정렬될 가능성이 높음(fstat, lstat, stat)
- 파일의 물리 디스크블록을 통해 입출력을 할 수 있음. (ret=icotl(fd, FIBMAP, &block)
=> 위 함수들은 다음 velog에서 나온다.