fsync с необработанным устройством fd - PullRequest
0 голосов
/ 07 октября 2019

Я запутался с fsync + direct IO.

Код легко понять так:

fd = open(filename, O_RDWR, 00644);
write(fd, data, size);
fsync(fd);

В этом случае write() напишетданные в кеш страницы, и fsync принудительно переведет все измененные данные в кеше страницы, на которые указывает fd, на дисковое устройство.

Но если мы откроем файл с флагом O_DIRECT, например,this,

fd = open(filename, O_RDWR|O_DIRECT, 00644);
write(fd, data, size);
fsync(fd);

В этом случае write() будет обходить кеш страницы, записывать непосредственно на диск устройства. Так что же будет делать fsync, в кеше страниц, на который ссылается fd.

, нет грязной страницы. И если мы откроем необработанное устройство, то что будет fsync делать,

fd = open('/dev/sda', O_RDWR|O_DIRECT, 00644);
write(fd, data, size);
fsync(fd);

В этом случае мы открываем необработанное устройство с O_DIRECT, на этом устройстве нет файловой системы. Что будет sync делать здесь?

1 Ответ

0 голосов
/ 13 октября 2019

Файловая система может вообще не реализовывать O_DIRECT, и в этом случае она не будет иметь никакого эффекта.

Если она реализует O_DIRECT, то это еще не значит, что она отправляется на диск, она только означает, что он минимально кэшируется кешем страниц . Он все еще может кэшироваться в другом месте, даже в аппаратных буферах.

fsync(2) - это явный контракт между ядром и приложением для сохранения данных таким образом, чтобы они не терялись и не потерялись. гарантированно будет доступен следующей вещи, которая хочет получить к ней доступ.

С файлами устройств драйверы устройств являются теми, которые реализуют флаги, в том числе O_DIRECT.

Linux действительно использует кеш страницкешировать для кеширования доступа к блочным устройствам и поддерживает O_DIRECT, чтобы минимизировать взаимодействие с кешем при записи непосредственно на блочное устройство.

В обоих случаях вам потребуется fsync(2) или вызов с эквивалентной гарантией вчтобы быть уверенным, что данные на диске постоянны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...