Добавлен: 29.10.2018
Просмотров: 48083
Скачиваний: 190
3.6. Проблемы реализации
271
путем копирования ее самой или указателя на нее в какой-нибудь аппаратный регистр
(или регистры). Чтобы уменьшить количество ошибок отсутствия страниц, в память
могут быть загружены некоторые страницы процесса или все его страницы (например,
точно известно, что понадобится страница, на которую указывает счетчик команд).
При возникновении ошибки отсутствия страницы операционная система должна счи-
тать данные аппаратных регистров, чтобы определить, чей виртуальный адрес вызвал
ошибку. На основе этой информации она должна вычислить, какая страница востре-
бована, и найти ее место на диске. Затем она должна найти для новой страницы под-
ходящий страничный буфер, удалив из него, если необходимо, какую-нибудь старую
страницу. Потом она должна считать востребованную страницу в страничный блок.
И наконец, она должна вернуть назад счетчик команд, заставив его указывать на ко-
манду, вызвавшую ошибку, и дать этой команде возможность повторного выполнения.
При завершении процесса операционная система должна освободить его таблицу стра-
ниц, его страницы и дисковое пространство, которое занимали эти страницы, когда на-
ходились на диске. Если некоторые из этих страниц совместно используются другими
процессами, то страницы в памяти и на диске могут быть освобождены только тогда,
когда будет прекращена работа последнего использующего их процесса.
3.6.2. Обработка ошибки отсутствия страницы
Наконец-то мы добрались до подробного описания всего, что происходит при возник-
новении ошибки отсутствия страницы. Складывается следующая последовательность
событий:
1. Аппаратное прерывание передает управление ядру, сохраняя в стеке значение
счетчика команд. На большинстве машин в специальных регистрах центрального
процессора сохраняется информация о состоянии текущей команды.
2. Запускается код стандартной программы на ассемблере, предназначенный для
сохранения регистров общего назначения и другой изменяющейся информации,
чтобы защитить ее от разрушения со стороны операционной системы. Эта стан-
дартная программа вызывает операционную систему как процедуру.
3. Операционная система определяет, что произошла ошибка отсутствия страницы,
и пытается определить, какая виртуальная страница востребована. Зачастую эта
информация содержится в одном из аппаратных регистров. В противном случае
операционная система должна взять значение счетчика команд, извлечь команду
и провести ее разбор программным способом, чтобы определить, что происходило
в тот момент, когда возникла ошибка.
4. Когда известен виртуальный адрес, вызвавший ошибку, система проводит про-
верку адреса на приемлемость и доступа к этому адресу — на согласованность
с системой защиты. При отрицательном результате проверки процессу посыла-
ется сигнал или же он уничтожается. Если адрес вполне приемлем и не возникло
ошибки защиты, система проверяет, не занят ли страничный блок. Если свободные
страничные блоки отсутствуют, запускается алгоритм замещения страниц, чтобы
выбрать кандидата на удаление.
5. Если выбранный страничный блок содержит измененную страницу, она включается
в план сброса на диск и происходит переключение контекста, приостанавливающее
процесс, в котором произошла ошибка, и позволяющее запуститься другому процес-
272
Глава 3. Управление памятью
су, пока перенос страницы на диск не завершится. В любом случае блок помечается
как занятый, чтобы он не мог быть задействован другим процессом.
6. Как только страничный блок очистится (либо немедленно, либо после сброса его
содержимого на диск), операционная система ищет адрес на диске, по которому
находится востребованная страница, и в план включается дисковая операция,
предназначенная для ее извлечения. Пока страница загружается, процесс, в ко-
тором произошла ошибка, остается приостановленным и запускается другой
пользовательский процесс, если таковой имеется.
7. Когда дисковое прерывание показывает, что страница получена, таблицы страниц
обновляются, чтобы отобразить ее позицию, и блок получает пометку нормального
состояния.
8. Команда, на которой произошла ошибка, возвращается к тому состоянию, в ко-
тором она находилась с самого начала, и счетчик команд переключается, чтобы
указывать на эту команду.
9. Процесс, в котором произошла ошибка, включается в план, и операционная си-
стема возвращает управление стандартной программе на ассемблере, которая ее
вызвала.
10. Эта стандартная программа перезагружает регистры и другую информацию о со-
стоянии и, если не произошло ошибки, возвращается в пространство пользователя
для продолжения выполнения.
3.6.3. Перезапуск команды
Когда программа обращается к странице, отсутствующей в памяти, команда, вызвавшая
ошибку, останавливается на полпути, и происходит перехват управления и передача
его операционной системе. После извлечения операционной системой востребованной
страницы она должна перезапустить команду, вызвавшую передачу управления. Но это
проще сказать, чем сделать.
Чтобы выявить природу данной проблемы в ее наихудшем виде, представим себе
центральный процессор, имеющий двухадресные команды, например Motorola 680x0,
который широко используется во встроенных системах. Возьмем, к примеру, показан-
ную на рис. 3.25 команду из 6 байт
MOV.L #6(A1),2(A0)
Чтобы перезапустить команду, операционная система должна определить, где находит-
ся первый байт команды. Значение счетчика команд на момент передачи управления
зависит от того, какой из операндов вызвал ошибку, и от того, как устроен микрокод
центрального процессора.
Рис. 3.25. Команда, вызвавшая ошибку отсутствия страницы
3.6. Проблемы реализации
273
На рис. 3.25 показана команда, начинающаяся по адресу 1000, которая осуществляет
три обращения к памяти: к слову самой команды и к двум смещениям на операнды.
В зависимости от того, какое из этих трех обращений вызвало ошибку страницы, на
момент возникновения ошибки счетчик команд может иметь значение 1000, 1002 или
1004. Зачастую операционная система не может однозначно определить, где начинается
команда. Если на момент ошибки счетчик команд имеет значение 1002, операционной
системе невозможно сообщить, является ли слово в ячейке 1002 адресом памяти,
связанным с командой в ячейке 1000 (то есть местом, где находится операнд), или же
кодом операции, принадлежащим команде.
Дело может принять еще более печальный оборот. Некоторые режимы адресации про-
цессоров 680x0 используют автоинкремент, значит, может проявиться побочный эффект
от команды, которая должна увеличить значение одного или нескольких регистров.
Команды, использующие автоинкрементный режим, также могут вызвать ошибку. В за-
висимости от особенностей микрокода инкремент может быть произведен до обращения
к памяти, и в таком случае операционная система перед перезапуском команды должна
программным способом уменьшить значение регистра. Или же автоинкремент может быть
осуществлен после обращения к памяти, в этом случае на момент передачи управления он
не будет выполнен и со стороны операционной системы не должно быть никаких обратных
действий. Существует также режим автодекремента, вызывающий сходные проблемы.
Точные данные о том, проводится или не проводится автоинкремент или автодекремент
перед соответствующим обращением к памяти, могут изменяться от команды к команде
и от одной модели центрального процессора к другой.
К счастью, на некоторых машинах разработчики центральных процессоров предоста-
вили решение, которое чаще всего выражается в виде скрытого внутреннего регистра,
в который перед выполнением каждой команды копируется значение счетчика команд.
У этих машин также может быть второй регистр, сообщающий о том, какой из реги-
стров уже подвергся автоинкременту или автодекременту и на какое именно значение.
Располагая данной информацией, операционная система может однозначно устранить
все последствия работы команды, вызвавшей ошибку, позволяя перезапустить эту ко-
манду. Если эта информация недоступна, операционная система должна каким-то обра-
зом исхитриться, чтобы определить, что произошло и как можно исправить ситуацию.
Похоже на то, что разработчики аппаратуры не смогли решить эту проблему, опустили
руки и переложили все на плечи разработчиков операционных систем. Славные ребята.
3.6.4. Блокировка страниц в памяти
Хотя в этой главе ввод-вывод информации рассматривался мало, тот факт, что у ком-
пьютера есть виртуальная память, не означает, что ввод-вывод отсутствует. Виртуаль-
ная память и операции ввода-вывода взаимодействуют весьма тонким образом. Рас-
смотрим процесс, который только что сделал системный запрос на чтение из какого-то
файла или устройства в буфер, находящийся в его адресном пространстве. В ожидании
завершения операции ввода-вывода процесс приостанавливается, и разрешается работа
другого процесса. В этом другом процессе возникает ошибка отсутствия страницы.
Если алгоритм замещения страниц имеет глобальный характер, то появляется не-
большой, но не нулевой шанс, что страница, содержащая буфер ввода-вывода, будет
выбрана на удаление из памяти. Если устройство ввода-вывода в данный момент на-
ходится в процессе переноса данных в режиме прямого доступа к памяти (DMA) на
274
Глава 3. Управление памятью
эту страницу, то ее удаление приведет к тому, что часть данных будет записана в буфер,
которому они принадлежат, а другая часть — записана поверх только что загруженной
страницы. Одно из решений этой проблемы состоит в блокировке в памяти страниц,
занятых в операциях ввода-вывода, чтобы они не были удалены. Блокировку страницы
часто называют прикреплением (pinning) ее к памяти. Другое решение состоит в про-
ведении всех операций ввода-вывода с использованием буфера ядра с последующим
копированием данных в пользовательские страницы.
3.6.5. Резервное хранилище
Рассматривая алгоритмы замещения страниц, мы видели, как выбирается страница
для удаления, но не уделяли слишком много внимания тому, куда она помещается
на диске при выгрузке. Настало время рассмотреть некоторые вопросы, связанные
с управлением работой дискового устройства.
Простейший алгоритм для выделения страничного пространства на диске предус-
матривает наличие на нем специального раздела подкачки (свопинга) или, что еще
лучше, отделения дискового устройства от файловой системы (чтобы сбалансировать
загруженность операциями ввода-вывода). Подобным образом работает большинство
UNIX-систем. В этом разделе отсутствует обычная файловая система, тем самым ис-
ключаются все издержки перевода смещения в файлах в адреса блоков. Вместо этого
везде используются номера блоков относительно начала раздела.
При запуске системы раздел подкачки пуст и представлен в памяти единой записью
с указанием начального адреса и размера. По простейшей схеме при запуске перво-
го процесса за ним резервируется участок пространства раздела, соответствующий
размеру первого процесса, а оставшаяся область сокращается на эту величину. При
запуске новых процессов им выделяется участок раздела подкачки, равный по раз-
меру их основным образам. При завершении процессов их дисковые пространства
освобождаются. Раздел подкачки управляется как список свободных участков. Более
приемлемые алгоритмы будут рассмотрены в главе 10.
С каждым процессом связывается дисковый адрес его области подкачки, то есть тот
адрес, по которому в разделе подкачки хранится его образ. Эта информация хранится
в таблице процессов. При этом упрощается вычисление адреса записи страницы: нуж-
но лишь прибавить смещение страницы внутри виртуального адресного пространства
к началу области подкачки. Но перед тем как процесс сможет начать работу, область
свопинга должна быть инициализирована. Один из способов инициализации заключа-
ется в копировании всего образа процесса в область свопинга, чтобы его можно было
получать по мере необходимости. Другой способ заключается в загрузке всего процесса
в память и разрешении ему по мере необходимости выгружать страницы.
Но с этой простой моделью связана одна проблема: размеры процессов после их за-
пуска могут изменяться. Хотя размер текста программы обычно не меняется, область
данных иногда может расти, а стек всегда склонен к росту. Следовательно, может быть
лучше резервировать отдельные области подкачки для текста, данных и стека и давать
возможность каждой из этих областей состоять более чем из одного дискового участка.
Другая крайность заключается в полном отказе от какого-либо предварительного рас-
пределения, выделении дискового пространства для каждой страницы при ее выгрузке
на диск и его изъятии при обратной загрузке страницы в память. При этом находящие-
ся в памяти процессы вообще не привязываются к пространству свопинга. Недостаток
3.6. Проблемы реализации
275
такого способа заключается в необходимости хранения в памяти дискового адреса,
чтобы отслеживать на диске каждую страницу. Эти два альтернативных варианта по-
казаны на рис. 3.26.
Рис. 3.26. Таблица страниц: а — замещение страниц со статической областью подкачки;
б — динамическое резервное хранение страниц
На рис. 3.26, а показана таблица страниц с восемью страницами. Страницы 0, 3, 4 и 6
находятся в оперативной памяти, страницы 1, 2, 5 и 7 — на диске. Размер области сво-
пинга совпадает по размеру с виртуальным адресным пространством процесса (восемь
страниц), а у каждой страницы есть фиксированное место, в которое она записывается
при удалении из основной памяти. Для вычисления этого адреса нужно знать только
о том, где начинается принадлежащая процессу область замещения страниц, посколь-
ку страницы хранятся в ней рядом, в порядке их виртуальных номеров. У страницы,
находящейся в памяти, всегда есть ее копия на диске (закрашенная область), но эта
копия может устареть, если страница с момента загрузки подверглась изменению. На
рис. 3.26, а в памяти закрашенными областями показаны отсутствующие в ней стра-
ницы. Страницы, соответствующие закрашенным областям, на диске должны быть
заменены (в принципе) копиями в памяти, хотя, если страница памяти должна быть
сброшена на диск и не подвергалась модификации со времени своей загрузки, то будет
использована ее дисковая (закрашенная) копия.
У страниц, изображенных на рис. 3.26, б нет фиксированных адресов на диске. При
выгрузке страницы на лету выбирается пустая дисковая страница и соответствующим
образом обновляется карта диска (в которой имеется место для одного дискового
адреса на каждую виртуальную страницу). Страница в памяти не имеет своей копии
на диске. Записи страниц на карте диска содержат либо неправильный адрес диска,
либо бит, помечающий их как неиспользующиеся.
Возможность иметь фиксированный раздел подкачки предоставляется не всегда.
Например, могут отсутствовать доступные дисковые разделы. В таком случае может
использоваться один или несколько заранее выделенных файлов внутри обычной