9 декабря 2005 г., 22:48:05, Вы писали:
IS> Во FreeBSD использовать zero copy sockets для произвольных данных,
IS> выравненных по 4К, сложно: нет простого метода узнать, когда можно
IS> менять буфер (читать в него новые данные или освобождать). Если буфер
IS> всё ещё используется ядром, то при попытке изменить данные будет
IS> page fault и ядро выделит новую страницу и скопирует туда данные
IS> этой страницы. Шило на мыло, если не хуже.
Согласен, если будет происходить COW то с zero copy будет еще хуже.
А метод из мана на практике не работает?
From an application standpoint, the best way to guarantee that the data
has been sent out over the wire and freed by the kernel (for TCP-based
sockets) is to set a socket buffer size (see the SO_SNDBUF socket option
in the setsockopt(2) man page) appropriate for the application and net-
work environment and then make sure you have sent out twice as much data
as the socket buffer size before reusing a buffer. For TCP, the send and
receive socket buffer sizes generally directly correspond to the TCP win-
dow size.
Это разумеется приблизительная оценка...