Буфер кэша в UNIX является, по сути, кэшем диска. Дисковые операции ввода-вывода работают через этот буфер. Передача данных между буфером и пространством пользовательского процесса всегда происходит с использованием DMA. Поскольку и буфер, и область ввода-вывода процесса размещены в основной памяти, DMA используется для осуществления копирования "память-память". В этом случае процессор не используется, но расходуются циклы шины.
Для управления буфером кэша поддерживаются три списка.
• Список свободных слотов. Список всех слотов кэша (в UNIX слот рассматривается как буфер; каждый слот хранит один сектор диска), доступных для распределения.
• Список устройств. Список всех буферов, связанных в данный момент с каждым диском.
• Очередь драйвера ввода-вывода. Список буферов, участвующих в операциях ввода-вывода конкретного устройства (или находящихся в состоянии ожидания операций).
Каждый буфер должен находиться либо в списке свободных слотов, либо в списке очереди драйвера ввода-вывода. Буфер, однажды назначенный устройству, остается назначенным ему, даже если он попадает в свободный список, — до тех пор, пока он не будет реально востребован и назначен другому устройству. Реально эти списки представляют собой списки указателей на буфера.
При обращении к номеру физического блока определенного устройства операционная система прежде всего выполняет проверку наличия этого блока в буфере кэша. Для минимизации времени поиска список устройства организован в виде хэш-таблицы с использованием методики, аналогичной методу переполнения с цепочками, рассматривавшемуся в приложении к главе 8 (рис. 8.24,6). Общая организация буфера кэша показана на рис. 11.15. Хэш-таблица фиксированной длины содержит указатели на буфер кэша. Каждая ссылка на (устройство # блок #) отображается в определенную запись хэш-таблицы. Указатель в этой записи указывает на первый буфер в цепочке. Указатель, связанный с каждым буфером, указывает на следующий буфер в цепочке. Следовательно, для всех обращений вида (устройство # блок #), соответствующих одной записи хэш-таблицы, искомый блок окажется в цепочке этой записи поля хэш-таблицы, если, конечно, данный блок имеется в кэше. Таким образом, при использовании хэш-таблицы длиной N длительность поиска в кэше снижается в N раз.
Рис. ll.l5. Организация буфера кэша в UNIX
Для замещения блоков используется алгоритм LRU. После того как дисковому блоку выделяется буфер, он не может быть использован для другого блока до тех пор, пока все остальные буфера не окажутся занятыми, причем позднее рассматриваемого. Список свободных слотов сохраняет этот порядок.