Разработка ядра Linux
Шрифт:
Как было показано в предыдущем разделе, поиск в страничном кэше выполняется на основании информации объекта
Основной код для работы с базисными деревьями находится в файле
Старая хеш-таблица страниц
Для ядер до серии 2.6 поиск в страничном кэше не выполнялся с помощью базисных деревьев. Вместо этого поддерживалась глобальная хеш-таблица всех страниц памяти в системе. Специальная хеш-функция возвращала двухсвязный список значений, связанных с одним значением ключа. Если нужная страница находится в кэше, то один из элементов этого списка соответствует этой нужной странице. Если страница в кэше отсутствует, то хеш-функция возвращает значение
Использование глобальной хеш-таблицы приводило к четырем основным проблемам.
• Хеш-таблица защищалась одной глобальной блокировкой. Количество конфликтов при захвате этой блокировки было достаточно большим даже для не очень больших машин. В результате страдала производительность.
• Размер хеш-таблицы был большим, потому что в ней содержалась информация обо всех страницах памяти в страничном кэше, в то время как важными являются лишь страницы, связанные с одним конкретным файлом.
• Производительность в случае неудачного обращения в кэш (когда искомая страница памяти не находится в кэше) падала из-за необходимости просматривать все элементы списка, связанного с заданным ключом.
• Хеш-таблица требовала больше памяти, чем другие возможные решения.
Применение в ядрах серии 2.6 страничного кэша на основании базисных деревьев позволило решить эти проблемы.
Буферный кэш
В операционной системе Linux больше нет отдельного буферного кэша. В ядрах серии 2.2 существовало два отдельных кэша: страничный и буферный. В первом кэшировались: страницы памяти, а в другом — буферы. Эти два кэша не были объединены между собой. Дисковый блок мог находиться в обоих кэшах одновременно. Это требовало больших усилий по синхронизации двух кэшированных копий, не говоря уже о напрасной трате памяти.
Так было в ядрах серии 2.2 и более ранних, но начиная с ядер Linux серии 2.4 оба кэша объединили вместе. Сегодня существует только один дисковый кэш — страничный кэш.
Ядру все еще необходимо использовать буферы для того, чтобы представлять дисковые блоки в памяти. К счастью, буферы описывают отображение блоков на страницы памяти, которые в свою очередь находятся в страничном кэше.
Демон
Измененные (dirty, "грязные") страницы памяти когда-нибудь должны быть записаны на диск. Обратная запись страниц памяти выполняется в следующих двух случаях.
• Когда объем свободной памяти становится меньше определенного порога, ядро должно записать измененные данные обратно на диск, чтобы освободить память.
• Когда несохраненные данные хранятся в памяти достаточно долго, то ядро должно их записать на диск, чтобы гарантировать, что эти данные не будут находиться в несохраненном состоянии неопределенное время.
Эти два типа записи имеют разные цели. В более старых ядрах они выполнялись двумя разными потоками пространства ядра (см. следующий раздел). Однако в ядре 2.6 эту работу выполняет группа (gang [87] ) потоков ядра
87
Слово "gang" не является жаргонным. Этот термин часто используется в компьютерных науках, чтобы указать группу чего-либо, что может выполняться параллельно.
Во-первых, потоки
88
Да, название функции не совсем верное. Должно было бы быть
Функция продолжает запись до тех пор, пока не выполнятся два следующих условия.
• Указанное минимальное количество страниц записано на диск.
• Объем свободной памяти превышает соответствующее значение параметра
Выполнение этих условий гарантирует, что демон
Во-вторых, назначение демона
Системный администратор может установить эти значения с помощью каталога
Таблица 15.1. Параметры для настройки демона
Переменная | Описание |
---|---|
dirty_background_ratio | Объем свободной оперативной памяти, при котором демон pdflush начинает обратную запись незаписанных данных |
dirty_expire_centisecs | Время, в сотых долях секунды, в течение которого незаписанные данные могут оставаться в памяти, перед тем как демон pdflush не запишет их на диск при следующем периоде обратной записи |
dirty_ratio | Процент от общей оперативной памяти, соответствующий страницам памяти одного процесса, при котором начинается обратная запись незаписанных данных |
dirty_writeback_centisecs | Насколько часто, в сотых долях секунды, процесс bdflush возвращается к выполнению для обратной записи данных |
laptop_mode | Переменная булевого типа, которая включает или выключает режим ноутбука (см. следующий раздел) |