소켓 I / O를 효율적으로 수행하는 것은 kqueue, epoll, IO 완료 포트 등으로 해결되었습니다. 비동기 파일 I / O를 수행하는 것은 일종의 후발입니다 (Windows의 중첩 된 I / O 및 posix AIO에 대한 solaris 초기 지원과는 별개).
소켓 I / O를 수행하려는 경우 위의 메커니즘 중 하나를 사용하는 것이 좋습니다.
따라서 AIO의 주요 목적은 비동기 디스크 I / O 문제를 해결하는 것입니다. 이것이 Mac OS X이 소켓이 아닌 일반 파일에 대해서만 AIO를 지원하는 이유 일 가능성이 큽니다 (kqueue가 더 나은 방법이기 때문입니다).
쓰기 작업은 일반적으로 커널에 의해 캐시되고 나중에 플러시됩니다. 예를 들어 드라이브의 읽기 헤드가 블록이 기록 될 위치를 지나가는 경우입니다.
그러나 읽기 작업의 경우 커널에서 읽기 우선 순위를 지정하고 순서를 지정하려면 AIO가 실제로 유일한 옵션입니다. 커널이 (이론적으로) 어떤 사용자 수준 응용 프로그램보다 더 잘 할 수있는 이유는 다음과 같습니다.
- 커널은 응용 프로그램 디스크 작업뿐만 아니라 모든 디스크 I / O를보고 글로벌 수준에서 주문할 수 있습니다.
- 커널은 디스크 읽기 헤드가 어디에 있는지 알고 있으며, 헤드를 최단 거리로 이동하기 위해 최적의 순서로 전달하는 읽기 작업을 선택할 수 있습니다.
- 커널은 원시 명령 대기열 을 활용 하여 읽기 작업을 더욱 최적화 할 수 있습니다.
- readv ()보다 lio_listio ()를 사용하여 시스템 호출 당 더 많은 읽기 작업을 수행 할 수 있습니다. 특히 읽기가 (논리적으로) 연속적이지 않은 경우 시스템 호출 오버 헤드를 약간 절약 할 수 있습니다.
- 읽기 또는 쓰기 호출에서 차단할 추가 스레드가 필요하지 않기 때문에 AIO를 사용하면 프로그램이 약간 더 간단해질 수 있습니다.
즉, posix AIO에는 매우 어색한 인터페이스가 있습니다. 예를 들면 다음과 같습니다.
- 유일하게 효율적이고 잘 지원되는 이벤트 콜백 수단은 신호를 통한 것이므로 프로세스 전역 신호 네임 스페이스의 신호 번호를 사용하기 때문에 라이브러리에서 사용하기가 어렵습니다. OS가 실시간 신호를 지원하지 않는다면, 어떤 요청이 실제로 완료되었는지 확인하기 위해 모든 미해결 요청을 반복해야 함을 의미합니다 (예 : Linux가 아닌 Mac OS X의 경우). 다중 스레드 환경에서 신호를 포착하면 몇 가지 까다로운 제한이 발생합니다. 일반적으로 시그널 핸들러 내부의 이벤트에 반응 할 수 없지만 시그널을 발생 시키거나 파이프에 쓰거나 signalfd () (리눅스에서)를 사용해야합니다.
- lio_suspend ()는 select ()와 동일한 문제를 가지고 있으며 작업 수에 따라 확장되지 않습니다.
- 구현 된대로 lio_listio ()는 전달할 수있는 작업의 수가 상당히 제한되어 있으며 이식 가능한 방식으로이 제한을 찾는 것은 사소한 일이 아닙니다. sysconf (_SC_AIO_LISTIO_MAX)를 호출해야합니다.이 경우 실패 할 수 있습니다.이 경우 반드시 정의되지 않은 AIO_LISTIO_MAX 정의를 사용할 수 있지만 지원이 보장되는 것으로 정의 된 2를 사용할 수 있습니다.
posix AIO를 사용하는 실제 응용 프로그램의 경우 지원을 도입 할 때 성능 측정을 게시 한 lighttpd (lighty)를 살펴볼 수 있습니다 .
대부분의 posix 플랫폼은 현재 posix AIO를 지원합니다 (Linux, BSD, Solaris, AIX, tru64). Windows는 겹친 파일 I / O를 통해이를 지원합니다. 내 이해는 Solaris, Windows 및 Linux만이 진정으로 비동기를 지원한다는 것입니다. 다른 OS는 비동기를 에뮬레이트하는 반면 파일 I / O는 드라이버까지 내려갑니다. 커널 스레드가있는 I / O. Linux는 예외입니다. glibc의 posix AIO 구현은 사용자 수준 스레드를 사용하여 비동기 작업을 에뮬레이트하는 반면 기본 비동기 I / O 인터페이스 (io_submit () 등)는 드라이버가 지원한다고 가정 할 때 완전히 비동기식입니다. .
나는 모든 fd에 대해 posix AIO를 지원하지 않지만 일반 파일로 제한하는 것이 OS 사이에서 상당히 일반적이라고 생각합니다.