Linux async (io_submit) запись v/s нормальная (буферизованная) запись
Поскольку запись в любом случае выполняется немедленно (копирование в буфер ядра и возврат), в чем преимущество использования io_submit для записи?
На самом деле, это (aio/io_submit) кажется хуже, так как вы должны выделить буферы записи в куче и не можете использовать стековые буферы.
Мой вопрос только о пишет, а не читает.
РЕДАКТИРОВАТЬ: Я имею в виду относительно небольшие записи (не более нескольких КБ), а не МБ или ГБ, поэтому буферное копирование не должно быть большой проблемой.
1 ответ
Копирование буфера в ядро не обязательно происходит мгновенно.
Сначала ядру нужно найти свободную страницу. Если его нет (что весьма вероятно под сильным давлением записи на диск), он должен принять решение об его исключении. Если он решит удалить грязную страницу (вместо того, чтобы, например, исключить ваш процесс), ему придется написать ее прежде, чем он сможет использовать эту страницу.
В linux есть проблема, связанная с насыщением записи на медленный диск, кеш страниц заполняется грязными страницами, поддерживаемыми медленным диском. Когда ядру по какой-либо причине требуется страница, для ее получения требуется много времени, и в результате вся система зависает.
Размер каждой отдельной записи менее важен, чем давление записи системы. Если в очереди уже есть миллион маленьких записей, возможно, вам придется заблокировать их.
Относительно того, живет ли выделение в стеке или в куче, также не так важно. Если вам нужно эффективное распределение блоков для записи, вы можете использовать выделенный распределитель пула (из кучи) и не платить за распределитель кучи общего назначения.
aio_write () обходит это, вообще не копируя буфер в ядро, это может быть даже DMAd прямо из вашего буфера (учитывая требования выравнивания), что означает, что вы, вероятно, также сохраните копию.