Не могу понять, что это за функция aio_fsync
. Я читал man-страницы и даже googled, но не могу найти понятного определения. Можете ли вы объяснить это простым способом, желательно с примером?AIO in C on Unix - aio_fsync
ответ
aio_fsync только асинхронная версия FSYNC; когда они завершатся, все данные записываются обратно на носитель физического диска.
Примечание 1: aio_fsync() просто запускает запрос; операция fsync() не завершена до тех пор, пока запрос не будет завершен, как и другие вызовы aio_ *.
Примечание 2: включены только операции aio_ *, уже поставленные в очередь при вызове aio_fsync().
Как вы прокомментируете упоминалось выше, если вы не используете FSYNC или aio_fsync, данные будут все еще появляются в файле после того, как закончится ваша программа. Однако, если бы машина была отключена, ее, скорее всего, не было.
Это связано с тем, что при записи в файл ОС фактически записывает в Page Cache, который является копией дисковых секторов, хранящихся в ОЗУ, а не на сам диск. Конечно, еще до того, как он будет записан обратно на диск, вы все равно сможете видеть данные в ОЗУ. Когда вы вызываете fsync() или aio_fsync(), он гарантирует, что записи(), aio_writes() и т. Д. Для всех частей этого файла будут записаны на физический диск, а не только в ОЗУ.
Если вы никогда не вызываете fsync() и т. Д., ОС в конечном итоге будет записывать данные обратно на диск, когда у него есть свободное время. Или упорядоченное выключение ОС должно это сделать.
Я бы сказал, что вы обычно не беспокоитесь о том, чтобы вручную вызвать их, если только вам не нужно застраховать, чтобы ваши данные, например, запись журнала, были сброшены на физический диск и должны быть более подвержены внезапному сбою системы. Очевидно, что двигатели баз данных будут делать это для транзакций и журналов.
Однако есть и другие причины, по которым данные могут не сохраниться, и очень сложно обеспечить абсолютную согласованность перед отказами. Поэтому, если ваше приложение не нуждается в этом, тогда вполне разумно позволить ОС управлять этим для вас. Например, если выход .o компилятора завершился неполным/поврежденным, потому что вы включили питание компьютера в середине компиляции или вскоре после этого, это никого не удивило бы - вы просто перезапустили операцию сборки.
Что такое проблема? представляет собой целую проблему концепции aio или является единственной проблемной функцией 'aio_fsync'? Он выполняет только 'fsync'. Как описано выше, http://stackoverflow.com/questions/2340610. –
Итак, что же делает fsync? Записывать данные непосредственно с диска? Когда я должен его использовать? Потому что, если я его вообще не использую, материал все еще присутствует после выполнения кода. – Greyshack