Главная » Ядро Linux » Страничный кэш и обратная запись страниц

0

ядре  операционной системы Linux  реализован один  главный дисковый кэш, который называется страничным (page cache).  Назначение этого кэша— минимизировать количество дисковых операций ввода-вывода путем  хранения в памяти тех данных, для  обращения к которым необходимо выполнять дисковые операции,

Эта глава посвящена рассмотрению страничного кэша.

Кэширование дисковых данных  важно  по двум причинам. Во-первых, доступ  к диску выполняется значительно медленнее, чем доступ к памяти. Доступ к данным в памяти выполняется значительно быстрее, чем к данным на диске.  Во-вторых, если к некоторым данным осуществлялся доступ, то с достаточно большой вероятностью к этим  же данным в ближайшем будущем  потребуется обратиться снова.  Принцип, согласно которому операции обращения к некоторым данным имеют  тенденцию группироваться друг с другом во времени, называется сосредоточенностью во времени  (temporal locality).  Сосредоточенность во времени гарантирует, что если данные кэшируются при  первом  доступе  к ним, то существует  большая вероятность удачного обращения в кэш  к этим данным в ближайшем будущем.

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

Отдельные дисковые блоки  также  могут  быть  привязаны к страничному кэшу с  помощью буферов  блочного ввода-вывода. Вспомните из  материала главы  13, "Уровень  блочного ввода-вывода", что буфер — это представление в памяти одного физического дискового блока.  Буферы играют  роль дескрипторов, которые отображают страницы памяти на дисковые блоки.  Поэтому страничный кэш  также  позволяет сократить количество обращений к диску при  выполнении операций блочного ввода-вывода как за счет кэширования, так и за счет буферизации операций блочно-

го ввода-вывода для выполнения в будущем.  Такой  тип кэширования часто называют "буферным кэшем", хотя на самом  деле это не отдельный кэш,  а часть страничного кэша.

Рассмотрим те типы  операций и данных,  которые  связаны со страничным кэшем. Страничный кэш  в основном пополняется при  выполнении страничных операций ввода-вывода, таких  как  read( )  и write() . Страничные операции ввода-вывода выполняются с целыми  страницами памяти, в которых  хранятся  данные, что соответствует операциям с более,  чем одним  дисковым блоком.  В страничном кэше  данные файлов  хранятся  порциями. Размер  одной  порции равен  одной  странице памяти.

Операции блочного  ввода-вывода работают  в каждый  отдельный момент  времени с одним  дисковым блоком.  Часто  встречающаяся операция блочного  ввода-вывода — это чтение  и запись  файловых индексов. Ядро предоставляет функцию bread( ) , которая  выполняет низкоуровневое чтение  одного  блока  с диска.  С помощью буферов дисковые блоки  отображаются на связанные с ними  страницы памяти  и благодаря этому сохраняются в страничном кэше.

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

Источник: Лав,  Роберт. Разработка ядра  Linux, 2-е  издание. : Пер.  с англ.  — М.  : ООО  «И.Д.  Вильяме» 2006. — 448 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии