Запись старых грязных страниц на диск
Как было сказано ранее, ядро старается не допустить "голодной смерти” из-за того, что некоторые страницы слишком долго не записываются на диск. Поэтому, если какая-то страница остается грязной в течение заранее установленного отрезка времени, ядро принудительно запускает операцию ее записи на диск.
Работа по нахождению старых грязных страниц поручается потоку ядра pdflush, который периодически пробуждается. На этапе инициализации ядра функция page writeback init устанавливает динамический таймер wb_timer так, чтобы ОН ДОХОДИЛ ДО нулевого значения через dirty_writeback_centisecs сотых секунды (обычно 500, но это значение можно изменить в файле /proc/sys/vm/dirty_writeback_centisecs). Функция-таймер wb timer fn вызывает функцию pdflush operation , передавая ей адрес функции обратного ВЫЗОВа wb_kupdate .
Функция wb kupdate просматривает кэш страниц в поисках старых грязных" индексных дескрипторов. Она выполняет следующие действия:
1. Вызывает функцию sync supers о для записи "грязных” суперблоков на диск. Хотя этот вызов, строго говоря, не имеет отношения к записи страниц, находящихся в кэше, он гарантирует, что никакой суперблок не останется грязным” дольше, чем в течение пяти (как правило) секунд.
2. Записывает в поле oider than this дескриптора writeback controi указатель на значение в тиках, соответствующее текущему времени минус 30 секунд. Тридцать секунд— это максимальный интервал, в течение которого странице разрешается быть грязной.
3. На основании переменной page state (своей у каждого процессора) определяет приблизительное количество грязных страниц, находящихся в данный момент в кэше.
4. Многократно вызывает функцию writeback_inodes , пока либо количество страниц, записанных на диск, не достигнет значения, определенного на предыдущем шаге, либо все страницы старше 30 секунд не будут записаны. В течение этого цикла выполнение функции может быть приостановлено, если очередь запросов переполнится.
5. Вызывает mod_timer ДЛЯ Запуска динамического таймера wb timer, который дойдет ДО нуля через dirty writeback centisecs СОТЫХ секунды С МО- мента вызова этой функции (или через одну секунду после настоящего момента, если выполнение этой функции затянется надолго).
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | Следующая страница