Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Олифер. Сетевые операционные системы.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
16.5 Mб
Скачать

Традиционный дисковый кэш

Рассмотрим традиционный дисковый кэш на примере его организации в ОС Unix, где он появился в первых же версиях.

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

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

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

Рис. 8.6. Организация традиционного дискового кэша

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

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

Интерфейс диспетчера кэша образует следующие функции.

  • Функция bwrite при сброшенных признаках B_ASYNC и B_DELWRI в buf (рассматриваются далее) выполняет синхронную запись. В результате немедленно инициируется физический обмен с внешним устройством. Процесс, выдавший запрос, переходит в состояние ожидания результата выполнения операции ввода-вывода, используя функцию sleep. В данном случае в процессе может быть предусмотрена собственная реакция на ошибочную ситуацию. Такой тип записи используется тогда, когда необходима гарантия правильного завершения операции ввода-вывода.

  • Функция bwrite при установленном признаке B_ASYNC и сброшенном признаке B_DELWRI выполняет асинхронную запись. Признак B_ASYNC задает асинхронный характер выполнения операции, при этом так же, как и в предыдущем случае, инициируется физический обмен с устройством, однако завершения операции ввода-вывода функция bwrite не дожидается и немедленно возвращает управление. В этом случае возможные ошибки ввода- вывода не могут быть переданы в процесс, выдавший запрос. Такая операция записи целесообразна при поточной обработке файлов, когда ожидание завершения операции ввода-вывода не обязательно, но есть уверенность в возможности повторения этой операции.

  • Функция bwг1te с установленными признаками B_ASYNC и B_DELWRI выполняет отложенную запись. При этом передача данных из системного буфера не производится, а в заголовке буфера делается отметка о том, что буфер за­полнен и может быть выгружен, если потребуется его освободить. Управление немедленно возвращается вызвавшей функции.

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

Упрощенный алгоритм выполнения запросов к подсистеме буферизации приведен на рис. 8.7.

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

Рис. 8.7. Упрощенная схема выполнения запросов диспетчером дискового кэша