Операционные системы. Управление ресурсами


Буферизация - часть 3


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

  • если буфера нет в хеш-очереди и список свободных блоков пуст;
  • если буфер есть в хеш-очереди, но он занят.

При освобождении блока разблокируются все процессы, ждущие освобождения этого или любого блока.

Все современные ОС (OS/2, Windows 95, Windows NT) в той или иной степени применяют тотальное кэширование при обмене с дисками.

Второй пример - буферизация ввода в драйвере терминала. Задача такой буферизации - обеспечить накопление данных и возможность упреждающего ввода с терминала. Для этой буферизации характерны: последовательный ввод, сравнительно небольшие объемы данных в буфере, непостоянный объем информации, содержащейся в буфере. Буфер представляет собой цепочку блоков, каждый из которых имеет постоянную длину N. В каждом блоке имеются следующие поля:

  • указатель на следующий блок в цепочке;
  • смещение первого символа в поле данных;
  • смещение последнего символа в поле данных;
  • поле данных для хранения N символов.


Рис.6.7. Буфер терминала для Unix

Пример буфера при N=8 показан на Рисунке 6.7. Ядро ОС хранит указатели на первый и последний блоки цепочки и ведет список свободных блоков (очередь LIFO). Ядро обеспечивает:

  • назначение драйверу свободного блока;
  • возвращение блока в список свободных;
  • выбор первого символа из буфера (при этом возможно освобождение блока);
  • добавление символа в конец буфера (при этом возможно выделение нового блока).




Начало  Назад  Вперед



Книжный магазин