2014-09-15 2 views
2

Насколько я понимаю, поведение write() по умолчанию (если файл не открыт с использованием O_DIRECT или O_SYNC и т. Д.) В Linux - это кешированные операции записи и записи откладываются в кеше страницы.Поведение обратной ссылки на грязную страницу Linux, если write() дважды на ту же страницу

Рассмотрим следующий сценарий:

1) программа для записи 1KB данных в файл на 5000 смещение, следовательно, делает соответствующую страницу грязную страницу

2) та же программа позже написать 1KB данных в тот же файл с тем же самым смещением, если предыдущая страница еще не очищена pdflush, так что будет делать ядро?

Я полагаю, что ядро ​​Linux может выполнить одно из следующих действий:

а) предыдущая грязная страница промываются перед вторичной записью() может произойти

б) предыдущая грязная страница переписывается и pdflush только очищать буфер после вторичной записи() на диск

с) я мог бы в корне неправильно, как вторая запись() использовать новую страницу ..

ответ

1

Ответ на ваш вопрос: предыдущая грязная страница перезаписывается.

Грязная страница будет чистой после того, как поток флеш-памяти отпишет ее на поддерживающее устройство. Но даже страница снова написана и не загрязнена, она все равно может использоваться для того же смещения файла.

На следующих условиях страницы будут возвращены в систему приятелей.

  • Файл закрыт. Таким образом, все страницы кэша этого файла будут освобождены.
  • drop_caches is triggerd
  • Свободная память ниже водяного знака, страницы кэша будут исправлены.

Если у Вас есть заинтересованы в нем, я призываю вас, чтобы добавить журнал в do_generic_file_read проверить.Результат page = find_get_page (mapping, index) может показать вам фактический адрес структуры страницы, соответствующий индексу файла.

http://lxr.free-electrons.com/source/mm/filemap.c#L1478

1

ядро ​​смывных потоки запускаются при инициализации системы, они активируются, когда слишком много грязных буферов, в случаях, когда требуется больше буферов и доступно очень мало памяти.

Пропущенные грязные страницы перед вторичной записью(), если в системе было превышено соотношение грязной страницы (записи), что означает, что количество грязных страниц в памяти превысило порог сертификации, что vm tunable с помощью sysctl, если ваше приложение не вручную вызывает сценарий fsync() или sync().

Примечание: pdflush был заменен использованием потоков промывки для информации о поддерживающем устройстве (BDI) в новых версиях ядра. pdflush - в 2.6 или более ранних версиях ядра flush - in 2.6.32.

Этих потоки ядра могут быть настроены с/Proc/SYS/VM/bdflush файла: age_buffer, b_flushtime = тики + age_buffer

Надеется, что это помогает!

+0

Благодарим за ответ. Фактически здесь мое предположение состоит в том, что первая запись() еще не очищена (скажем, отношение намного меньше порога, а вторичная запись() происходит менее чем через 30 секунд после первой записи, 30 секунд - значение по умолчанию для vm.dirty_expire_centisecs). Поскольку в обеих записях мы записываем один и тот же файл из одного и того же смещения, и длина одинакова, я полагаю, что они должны быть подкреплены одной и той же страницей, поэтому остается вопрос, будет ли грязная страница после первой записи() принудительно сфотографироваться до того, как произойдет вторая запись()? –

+0

Поскольку вы не намереваетесь использовать флаг O_SYNC, ваша вторая запись не сразу будет скрываться на диске, что приведет к запуску потока flush только при завершении второй записи, исходя из предположения, что он не превысил vm.dirty_expire_centisecs или Параметры vm.dirty_ratio. – askb

Смежные вопросы