В данной главе была рассмотрена
структура буферного кеша и
различные способы, которыми ядро
размещает блоки в кеше. В
алгоритмах буферизации сочетаются
несколько простых идей, которые в
сумме обеспечивают работу
механизма кеширования. При работе с
блоками в буферном кеше ядро
использует алгоритм замены
буферов, к которым наиболее долго
не было обращений, предполагая, что
к блокам, к которым недавно было
обращение, вероятно, вскоре
обратятся снова. Очередность, в
которой буферы появляются в списке
свободных буферов, соответствует
очередности их предыдущего
использования. Остальные алгоритмы
обслуживания буферов, типа
"первым пришел - первым вышел"
и замещения редко используемых,
либо являются более сложными в
реализации, либо снижают процент
попадания в кеш. Использование
функции хеширования и хеш-очередей
дает ядру возможность ускорить
поиск заданных блоков, а
использование двунаправленных
указателей в списках облегчает
исключение буферов. Ядро идентифицирует нужный ему
блок по номеру логического
устройства и номеру блока. Алгоритм
getblk просматривает буферный кеш в
поисках блока и, если буфер
присутствует и свободен, блокирует
буфер и возвращает его. Если буфер
заблокирован, обратившийся к нему
процесс приостанавливается до тех
пор, пока буфер не освободится.
Механизм блокирования гарантирует,
что только один процесс в каждый
момент времени работает с буфером.
Если в кеше блок отсутствует, ядро
назначает блоку свободный буфер,
блокирует и возвращает его.
Алгоритм bread выделяет блоку буфер и
при необходимости читает туда
информацию. Алгоритм bwrite копирует
информацию в предварительно
выделенный буфер. Если при
выполнении указанных алгоритмов
ядро не увидит необходимости в
немедленном копировании данных на
диск, оно пометит буфер для
"отложенной записи", чтобы
избежать излишнего ввода-вывода. К
сожалению, процедура откладывания
записи сопровождается тем, что
процесс никогда не уверен, в какой
момент данные физически попадают
на диск. Если ядро записывает
данные на диск синхронно, оно
поручает драйверу диска передать
блок файловой системе и ждет
прерывания, сообщающего об
окончании ввода-вывода. Существует множество способов
использования ядром буферного
кеша. Посредством буферного кеша
ядро обеспечивает обмен данными
между прикладными программами и
файловой системой, передачу
дополнительной системной
информации, например, индексов,
между алгоритмами ядра и файловой
системой. Ядро также использует
буферный кеш, когда читает
программы в память для выполнения.
В следующих главах будет
рассмотрено множество алгоритмов,
использующих процедуры, описанные
в данной главе. Другие алгоритмы,
которые кешируют индексы и
страницы памяти, также используют
приемы, похожие на те, что описаны
для буферного кеша. Предыдущая
глава || Оглавление
|| Следующая глава
3.6 ВЫВОДЫ