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

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

алгоритм vfault /* обработка отказа из-за отсутствия (недоступности) данных */

входная информация: адрес, по которому получен отказ

выходная информация: отсутствует

{

 найти область, запись в таблице страниц, дескриптор дискового блока, связанные с адресом, по которому получен отказ, заблокировать область;

 if (адрес не принадлежит виртуальному адресному пространству процесса)  {

  послать сигнал (SIGSEGV: нарушение сегментации) процессу;

  goto out;

 }

 if (адрес указан неверно) goto out;/* возможно, процесс находился в состоянии приостанова */

 if (страница имеется в кэше)  {

  убрать страницу из кэша;

  поправить запись в таблице страниц;

  do  while (содержимое страницы не станет доступным) /* другой процесс получил такой же отказ, но раньше */

   sleep;

 }

 else { /* страница отсутствует в кэше */

  назначить области новую страницу;

  поместить новую страницу в кэш, откорректировать запись в таблице pfdata;

  if (страница ранее не загружалась в память и имеет пометку "обнуляемая при обращении")

   очистить содержимое страницы;

  else  {

   считать виртуальную страницу с устройства выгрузкиили из исполняемого файла;

   sleep (до завершения ввода-вывода);

  }

  возобновить процессы (ожидающие загрузки содержимого страницы);

 }

 установить бит доступности страницы;

 сбросить бит модификации и "возраст" страницы;

 пересчитать приоритет процесса;

out:

 снять блокировку с области;

}

Рисунок 9.21. Алгоритм обработки отказа из-за отсутствия (недоступности) данных

При обработке отказов из-за недоступности данных ядро не всегда прибегает к выполнению операции ввода-вывода, даже когда из дескриптора дискового блока видно, что страница загружена (в случае 2). Может случиться так, что ядро после выгрузки содержимого физической страницы так и не переприсвоило ее или же какой-то иной процесс в результате отказа загрузил содержимое виртуальной страницы в другую физическую страницу. В любом случае программа обработки отказа обнаруживает страницу в кэше, в качестве ключа используя номер блока в дескрипторе дискового блока. Она перенастраивает соответствующую запись в таблице страниц на только что найденную страницу, увеличивает значение счетчика ссылок на страницу и в случае необходимости убирает страницу из списка свободных страниц. Предположим, к примеру, что процесс получил отказ при обращении к виртуальному адресу 64К (Рисунок 9.22). Просматривая кэш, ядро устанавливает, что страничный блок с номером 1861 связан с дисковым блоком 1206.

|< Пред. 475 476 477 478 479 След. >|

Java книги

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