Какая философия стоит за таким подходом?
Эффективность (лучшее использование характеристик диска) и производительность (позволяет приложению продолжать работу сразу после записи).
Почему данные не записываются сразу?
Основное преимущество заключается в том, что ОС может свободно переупорядочивать и объединять непрерывные операции записи, чтобы улучшить использование полосы пропускания (меньше операций и меньше операций поиска). Жесткие диски работают лучше, когда запрашивается небольшое количество больших операций, в то время как приложения, как правило, требуют большого количества небольших операций. Другая очевидная оптимизация заключается в том, что ОС может также удалить все записи, кроме последней, когда один и тот же блок записывается несколько раз за короткий промежуток времени, или даже удалить все записи вместе, если за это время удаленный файл был удален.
Эти асинхронные операции записи выполняются послеwrite
того, как системный вызов возвращается. Это второе и наиболее заметное для пользователя преимущество. Асинхронная запись ускоряет работу приложений, поскольку они могут продолжать работу, не дожидаясь, пока данные действительно окажутся на диске. Тот же самый тип буферизации / кэширования также реализован для операций чтения, когда недавно или часто блоки чтения сохраняются в памяти вместо повторного чтения с диска.
Нет ли опасности, что запись не удастся из-за ошибки ввода-вывода?
Не обязательно. Это зависит от используемой файловой системы и имеющейся избыточности. Ошибка ввода-вывода может быть безвредной, если данные могут быть сохранены в другом месте. Современные файловые системы, такие как ZFS, самостоятельно исцеляют плохие блоки дисков. Также обратите внимание, что ошибки ввода-вывода не приводят к сбою современных ОС. Если они происходят во время доступа к данным, они просто сообщаются уязвимому приложению. Если они происходят во время доступа к структурным метаданным и подвергают файловую систему риску, она может быть перемонтирована только для чтения или недоступна.
Существует также небольшой риск потери данных в случае сбоя ОС, сбоя питания или аппаратного сбоя. По этой причине приложения, которые должны быть на 100% уверены, что данные находятся на диске (например, базы данных / финансовые приложения), выполняют менее эффективные, но более безопасные синхронные записи. Чтобы уменьшить влияние на производительность, многие приложения по-прежнему используют асинхронные записи, но в конечном итоге синхронизируют их, когда пользователь явно сохраняет файл (например, vim, текстовые процессоры).
С другой стороны, подавляющее большинство пользователей и приложений не нуждаются и не заботятся о безопасности, которую обеспечивают синхронные записи. В случае сбоя или перебоя в питании единственным риском часто является потеря в худшем случае последних 30 секунд данных. Если не происходит финансовых транзакций или чего-то подобного, что подразумевает затраты, значительно превышающие 30 секунд их времени, огромный выигрыш в производительности (который не является иллюзией, но вполне реальным) позволяет асинхронным операциям записи значительно превосходить риск.
Наконец, синхронных записей недостаточно для защиты записанных данных. Если ваше приложение действительно должно быть уверено, что его данные не могут быть потеряны, что бы ни происходило, необходимо установить репликацию данных на нескольких дисках и в нескольких географических точках, чтобы противостоять таким стихийным бедствиям, как пожар, наводнения и т. Д.