Архитектура операционной системы 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 След. >|