При использовании O_NONBLOCK write () вызов write () будет принимать (то есть копировать в буфер в ядре) все, некоторые или никакие данные, которые вы ему передали (если были приняты некоторые байты, запишитеВозвращаемое значение () будет указывать, сколько байтов было принято ... если ни один из них не был принят, write () вернет -1 и errno будет установлено в EWOULDBLOCK).Количество байтов, которые принимает write (), будет зависеть от того, сколько места у него есть в буфере ядра в данный момент.После возвращения write () вы обязаны запомнить, сколько ваших байтов он принял, а затем вызвать select () (или poll () или какой-либо другой механизм), чтобы вы были уведомлены, когда в буфере будет больше свободного места.,Когда станет доступно больше места (т. Е. Когда-нибудь в будущем), вы можете снова вызвать write (), чтобы передать больше байтов в буфер.
aio_write (), с другой стороны, «возьмет на себя ответственность»данных, которые вы передаете в функцию, и уведомить вас позже, когда она закончит запись данных.С aio_write () вам не нужно беспокоиться о том, что вызов принимает только часть вашего буфера данных;он либо примет всю вещь, либо выдает ошибку.Это сделает логику ввода-вывода вашего приложения в этом отношении немного проще;однако я думаю, что асинхронный ввод-вывод имеет свой собственный набор усложняющих факторов, поэтому он не всегда может быть выигрышным.(Я сам не использовал aio _ * (), поэтому не могу сообщить подробности)
Что касается того, почему функция write (), похоже, не занимает больше времени, так как длина записываемых данных увеличивается... это потому, что неблокирующая запись () только копирует (ни один, или некоторые, или все) данных, которые вы передаете ему, в буфер, а затем немедленно возвращает;на самом деле он не ждет, пока данные попадут на диск.Копирование (относительно небольшой) последовательности байтов из буфера вашего приложения в буфер в ядре всегда будет быстрым, и количество копируемых байтов никогда не будет больше, чем количество пустого пространства, доступного в настоящее время в буфере в ядре, поэтомучетное число байтов, скопированных в write (), ограничено / мало.