Насколько я понимаю, поведение write() по умолчанию (если файл не открыт с использованием O_DIRECT или O_SYNC и т. Д.) В Linux - это кешированные операции записи и записи откладываются в кеше страницы.Поведение обратной ссылки на грязную страницу Linux, если write() дважды на ту же страницу
Рассмотрим следующий сценарий:
1) программа для записи 1KB данных в файл на 5000 смещение, следовательно, делает соответствующую страницу грязную страницу
2) та же программа позже написать 1KB данных в тот же файл с тем же самым смещением, если предыдущая страница еще не очищена pdflush, так что будет делать ядро?
Я полагаю, что ядро Linux может выполнить одно из следующих действий:
а) предыдущая грязная страница промываются перед вторичной записью() может произойти
б) предыдущая грязная страница переписывается и pdflush только очищать буфер после вторичной записи() на диск
с) я мог бы в корне неправильно, как вторая запись() использовать новую страницу ..
Благодарим за ответ. Фактически здесь мое предположение состоит в том, что первая запись() еще не очищена (скажем, отношение намного меньше порога, а вторичная запись() происходит менее чем через 30 секунд после первой записи, 30 секунд - значение по умолчанию для vm.dirty_expire_centisecs). Поскольку в обеих записях мы записываем один и тот же файл из одного и того же смещения, и длина одинакова, я полагаю, что они должны быть подкреплены одной и той же страницей, поэтому остается вопрос, будет ли грязная страница после первой записи() принудительно сфотографироваться до того, как произойдет вторая запись()? –
Поскольку вы не намереваетесь использовать флаг O_SYNC, ваша вторая запись не сразу будет скрываться на диске, что приведет к запуску потока flush только при завершении второй записи, исходя из предположения, что он не превысил vm.dirty_expire_centisecs или Параметры vm.dirty_ratio. – askb