Разница между aio_write () и O_NONBLOCK write () - PullRequest
4 голосов
/ 13 сентября 2010

В чем разница между aio_write () и O_NONBLOCK write ()? Кроме того, я использую write () для текстового файла, используя файловый дескриптор, используя функцию O_NONBLOCK, и сравниваю производительность с aio_write (), устанавливая таймер до и после функции.

Кажется, что функция write () заняла бы больше времени для записи в файл, когда длина строки увеличивается, но aio_write () все еще поддерживается примерно в то же время.

Почему это так? В чем разница между NONBLOCK и асинхронным?

Спасибо

1 Ответ

11 голосов
/ 13 сентября 2010

При использовании O_NONBLOCK write () вызов write () будет принимать (то есть копировать в буфер в ядре) все, некоторые или никакие данные, которые вы ему передали (если были приняты некоторые байты, запишитеВозвращаемое значение () будет указывать, сколько байтов было принято ... если ни один из них не был принят, write () вернет -1 и errno будет установлено в EWOULDBLOCK).Количество байтов, которые принимает write (), будет зависеть от того, сколько места у него есть в буфере ядра в данный момент.После возвращения write () вы обязаны запомнить, сколько ваших байтов он принял, а затем вызвать select () (или poll () или какой-либо другой механизм), чтобы вы были уведомлены, когда в буфере будет больше свободного места.,Когда станет доступно больше места (т. Е. Когда-нибудь в будущем), вы можете снова вызвать write (), чтобы передать больше байтов в буфер.

aio_write (), с другой стороны, «возьмет на себя ответственность»данных, которые вы передаете в функцию, и уведомить вас позже, когда она закончит запись данных.С aio_write () вам не нужно беспокоиться о том, что вызов принимает только часть вашего буфера данных;он либо примет всю вещь, либо выдает ошибку.Это сделает логику ввода-вывода вашего приложения в этом отношении немного проще;однако я думаю, что асинхронный ввод-вывод имеет свой собственный набор усложняющих факторов, поэтому он не всегда может быть выигрышным.(Я сам не использовал aio _ * (), поэтому не могу сообщить подробности)

Что касается того, почему функция write (), похоже, не занимает больше времени, так как длина записываемых данных увеличивается... это потому, что неблокирующая запись () только копирует (ни один, или некоторые, или все) данных, которые вы передаете ему, в буфер, а затем немедленно возвращает;на самом деле он не ждет, пока данные попадут на диск.Копирование (относительно небольшой) последовательности байтов из буфера вашего приложения в буфер в ядре всегда будет быстрым, и количество копируемых байтов никогда не будет больше, чем количество пустого пространства, доступного в настоящее время в буфере в ядре, поэтомучетное число байтов, скопированных в write (), ограничено / мало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...