On Tue, May 01, 2007 at 06:12:24PM +0400, Exe wrote:
> >научите создателей ядра, как уйти от блокировки по чтению с диска.
> >Неблокирующийся sendfile() только на сети,а не на диске, причём как в
> >linux, так и в FreeBSD. В последней немного лучше ситуация, но тем не
> >менее - в случае быстрой сети получаем блокировку на диске при чтении.
>
> Как это - неблокирующийся на диске? Как Вы себе это представляете?
> Когда речь идет о передаче данных sendfile не блокируется т.к. он на самом
> деле ничего не отсылает и только пихает данные в буфер на отправку, поэтому
> он и не блокируется. А что делать когда он с диска считает? Отдельно
> посылать
> запросы на чтение и отдельно забирать считанные данные по мере их
> поступления?
Неблокирующийся на диске sendfile должен работать так:
*) если страница файла есть в памяти, то добавить её в буфер сокета (это
делается и сейчас);
*) если страницы нет, то инициировать чтение с диска и, не дожидаясь
его завершения, вернуться в программу с результатом EAGAIN или
аналогичным ему. При этом kqueue/epoll/etc должны понимать, что
готовность сокета - это не только свободное место в буфере, но
готовые данные с диска. Операция чтения должна сообщать о готовности
данных через kqueue/epoll/etc как о готовности сокета на запись.
> Это ничего не даст если диск один.
Это даст возможность процессу отдавать те файлы, страницы которых
есть в памяти, а не блокироваться на время чтения с диска.
--
Игорь Сысоев
http://sysoev.ru