Почему именно файловый I/O блокируется? В современных ОС вполне можно
сделать его не блокирующим, и отпускать воркер на то время пока ОС не
заполнит буфер и не просигнализирует об этом. В чем в данной ситуации
концептуальное различие между сетевым I/O?
Концептуальное различие между сетевым и дисковым I/O заключается в том,
что в сетевом I/O имеем дело с потоками байт или пакетов, а в дисковом
-- с пространством байт или блоков.
Насколько я помню, в рассылке про ядро Linux кто-то писал, что
архитектура Unix не приспособлена для асинхронного дискового I/O,
поскольку там есть два архитектураных уровня -- кэш и файловая система,
в которых возможность выполнения операций асинхронно изначально не
закладывали.
То есть, надо либо код этих двух уровней переписать наизнанку, либо
использовать ядерные трэды.
Таким образом, сделать файловый I/O неблокирующимся нетривиально.
Приходится использовать специальный API, который не в каждой ситуации
реально асинхронный.