Ограничения размера для вызова write()

Jul 17, 2012 18:17


Если значение count превышает значение SSIZE_MAX, то результат вызова writeO
не определен.
Если выполнить write() со значением count, равным нулю, то вызов мгновенно
вернет значение 0.


Поведение вызова write()
Когда write() возвращает значение, это означает, что ядро скопировало данные
из предоставленного буфера в буфер ядра, но нет никакой гарантии, что данные
были записаны в указанное целевое местоположение. Действительно, этот вызов
возвращает значение слишком быстро, чтобы так действительно происходило.
Несоответствие производительности процессоров и жестких дисков делало
бы такое поведение мучительно очевидным.
Вместо этого, когда приложение из пользовательского пространства выполняет
системный вызов writeO, ядро Linux делает несколько проверок, а затем
просто копирует данные в буфер. Позже в фоновом режиме ядро собирает все
«грязные» буферы, сортирует их оптимальным способом и записывает их содержимое
на диск (этот процесс называется отложенной записью (writeback)).
Благодаря этому создается впечатление, что вызовы writeO работают чрезвы-
чайно быстро, возвращая значение практически мгновенно, а ядро может откладывать
фактическую запись на диск на периоды бездействия и потом сразу же
обрабатывать большие пакеты запросов.
Отложенная запись не меняет семантику POSIX. Например, если выполняется
вызов на считывание только что записанных данных, еще находящихся в
буфере, то этот запрос удовлетворяется из буфера, а не возвращает «устаревшие
» данные с диска. Такое поведение действительно повышает производительность,
так как данные считываются из кэша в памяти без обращения к диску.
Запросы на чтение и запись чередуются, как положено, и результаты всегда
возвращаются ожидаемые - конечно же, если в системе не происходит аварийный
сбой до того, как данные попадают на диск! Даже если приложение будет
считать, что запись произошла успешно, в такой ситуации данные никогда не
окажутся в нужном месте на диске.

Previous post Next post
Up