Архитектура операционной системы UNIX :: Бах Морис Дж.
Страница:
89 из 715
Если же, в начале выполнения алгоритма breada, первый блок обнаружился в буферном кеше, ядро тут же проверяет, находится там же и второй блок, и продолжает работу по только что описанной схеме.
алгоритм bread /* чтение блока */
входная информация: номер блока в файловой системе
выходная информация: буфер, содержащий данные
{
получить буфер для блока (алгоритм getblk);
if (данные в буфере правильные) return буфер;
приступить к чтению с диска;
sleep (до завершения операции чтения);
return (буфер);
}
Рисунок 3.13. Алгоритм чтения дискового блока
Алгоритм записи содержимого буфера в дисковый блок (Рисунок 3.15) похож на алгоритм чтения. Ядро информирует дисковод о том, что есть буфер, содержимое которого должно быть выведено, и дисковод планирует операцию ввода-вывода блока. Если запись производится синхронно, вызывающий процесс приостанавливается, ожидая ее завершения и освобождая буфер в момент возобновления своего выполнения. Если запись производится асинхронно, ядро запускает операцию записи на диск, но не ждет ее завершения. Ядро освободит буфер, когда завершится ввод-вывод.
алгоритм breada /* чтение блока с продвижением */
входная информация:
(1) в файловой системе номер блока для немедленного считывания
(2) в файловой системе номер блока для асинхронного считывания
выходная информация: буфер с данными, считанными немедленно
{
if (первый блок отсутствует в кеше) {
получить буфер для первого блока (алгоритм getblk);
if (данные
|< Пред. 87 88 89 90 91 След. >|