Виртуальная память
Обработка ситуации отсутствия страницы в памяти
Если в таблице страниц имеется ссылка на страницу, отсутствующую в памяти, первое же обращение по такой ссылке приведет к прерыванию и вызову ОС (ситуации page fault – отсутствие страницы в памяти)
ОС по таблицам определяет, что именно произошло:
Если имеет место неверная ссылка (на страницу, отсутствующую в логической памяти), то работа программы прекращается.
Если же имеет место обычное отсутствие страницы в памяти, то ОС должна разместить его в основной памяти. Для этого ОС выполняет следующий алгоритм:
- Найти незанятый фрейм в основной памяти ;
- Считать содержимое страницы в данный фрейм ;
- Изменить элемент таблицы страниц: validation-бит установить равным 1;
- Продолжить работу программы. Напомним, что программа после прерывания продолжается с той же команды, которая была прервана из-за отсутствия страницы. Поэтому теперь программа продолжит нормально выполняться, и обращение к странице произойдет успешно.
Этапы обработки ситуации отсутствия страницы в памяти показаны на рис. 18.4.
Этап 1 – выполнение команды load M, которая прерывается по отсутствию страницы в памяти; 2 – прерывание и вызов ОС; 3 – обращение к странице, находящейся в файле откачки на диске; 4 – считывание страницы в память на свободный фрейм; 5 – изменение элемента таблицы страниц; 6 – повторное (успешное) выполнение команды.
Отсутствие свободного фрейма. Оценка производительности стратегии обработки страниц по требованию.
На этапе 4 (рис. 18.4) возможна ситуация отсутствия свободного фрейма в основной памяти. При этом ОС должна выполнить замещение страницы (page replacement) – найти страницу, загруженную в память, но реально не используемую, и откачать ее.
Для оптимальной реализации стратегии замещения страниц требуется алгоритм, приводящий к наименьшему возможному числу отказов страниц. Возможные решения мы рассмотрим немного позже в данной лекции.
Дадим общую оценку производительности обработки страниц по требованию.
Введем коэффициент отказов страниц (Page Fault Rate) p:> 0 <= p <= 1.0.
Если p = 0, то имеет место отсутствие отказов страниц.
Если p = 1, то каждое обращение к странице приводит к отказу.
Оценим теперь эффективное время доступа (Effective Access Time - EAT):
EAT = (1 – p) * время доступа к памяти + p * (время реакции на отказ + [ время откачки страницы ] + время подкачки страницы + время рестарта)
Дадим необходимые пояснения к данной формуле. Оценка времени складывается из двух слагаемых. Первое слагаемое соответствует ситуации, когда отказ страницы не имеет места, и оценивает среднее время доступа к странице в этом случае. Второе слагаемое вычисляет оценку времени в случае отказа страницы. В нем первая компонента – суммарное время реакции апппратуры и ОС на отказ страницы, вторая (необязательная) – время откачки страницы (если она требуется для замещения страниц), третья – время подкачки страницы, четвертая – время рестарта программы. Если коэффициент p рассматривать как вероятность отказа страницы, то величина EAT будет математическим ожиданием общего времени доступа к странице.
Преимущества виртуальной памяти при создании процессов
Благодаря механизму виртуальной памяти, могут быть использованы следующие оптимизации расходования памяти при создании процессов:
- Копирование по записи (Copy-on-Write)
- Отображение файлов в память (Memory-Mapped Files).
Принцип совместного использования страниц процессами (или копирование по записи - Copy-On-Write, COW) позволяет первоначально родительскому и дочернему процессам использовать одни и те же страницы памяти. Если какой-либо процесс модифицирует разделяемую страницу, то только в этом случае данная страница копируется. Принцип COW обеспечивает более эффективное создание процесса, так как копируются только модифицируемые страницы. Свободные страницы распределяются из списка страниц, инициализированных нулями.
Использование при вводе-выводе файлов, отображаемых в память, позволяет рассматривать файловый ввод-вывод как обычное обращение к памяти путем отображения блока на диске в страницу памяти.
Первоначально файл читается с использованием запроса страниц по требованию. Часть файла размером с одну страницу читается из файла в физическую страницу (фрейм). Последующие чтения из файла и записи в файл трактуются как обычные обращения к памяти. Это упрощает доступ к файлу, по сравнению с системными вызовами read() и write(). Это позволяет также нескольким процессам отображать в память один и тот же файл, по тому же принципу, как они совместно используют какие-либо страницы.
На рис. 18.5 иллюстрируется концепция файла, отображаемого в память.
Процессы A и B совместно используют файл, причем каждому блоку файла соответствует страница в памяти. Эти страницы имеют одни и те же номера в таблицах страниц виртуальной памяти процессов. Страницы, присутствующие в памяти, фактически являются частями файла, обрабатываемого при вводе-выводе, благодаря этому, гораздо быстрее, чем обычный файл. По окончании обмена, при закрытии файла, система записывает все его измененные части на диск.
Подобный механизм имеется в большинстве операционных систем. Например, в системе Solaris он реализуется командой и системным вызовом mmap (memory map).