Архитектура операционной системы UNIX   ::   Бах Морис Дж.

Страница: 106 из 715



алгоритм iget

входная информация: номер индекса в файловой системе

выходная информация: заблокированный индекс

{

 do  {

  if (индекс в индексном кеше)  {

   if (индекс заблокирован)  {

    sleep (до освобождения индекса);

    continue; /* цикл с условием продолжения */

  }

   /* специальная обработка для точек монтирования (глава 5) */

   if (индекс в списке свободных индексов)  убрать из списка свободных индексов;

   увеличить счетчик ссылок для индекса;

   return (индекс);

  }

  /* индекс отсутствует в индексном кеше */

  if (список свободных индексов пуст) return (ошибку);

  убрать новый индекс из списка свободных индексов;

  сбросить номер индекса и файловой системы;

  убрать индекс из старой хеш-очереди, поместить в новую;

  считать индекс с диска (алгоритм bread);

  инициализировать индекс (например, установив счетчик ссылок в 1);

  return(индекс);

 }

}

Рисунок 4.3. Алгоритм выделения индексов в памяти

Если ядро знает номера устройства и дискового блока, оно читает блок, используя алгоритм bread (глава 2), затем вычисляет смещение индекса в байтах внутри блока по формуле:

((номер индекса – 1) mod (число индексов в блоке)) * размер дискового индекса

Например, если каждый дисковый индекс занимает 64 байта и в блоке помещаются 8 индексов, тогда индекс с номером 8 имеет адрес со смещением 448 байт от начала дискового блока. Ядро убирает индекс в памяти из списка свободных индексов, помещает его в соответствующую хеш-очередь и устанавливает значение счетчика ссылок равным 1.

|< Пред. 104 105 106 107 108 След. >|

Java книги

Контакты: [email protected]