Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пособие_Unix.doc
Скачиваний:
15
Добавлен:
26.11.2019
Размер:
2.41 Mб
Скачать

4.2 Свопинг

Механизмы управления памятью в ранних версиях UNIX ограничивались возможностями свопинга (swapping). Процессы загружались в оперативную память целиком друг за другом. В один момент времени в физической памяти машины размещалось некоторое количество процессов, а система являлась для них совместно используемым ресурсом.

Рисунок 4.2 - Свопинг

Если требовалось выполнить другой процесс, то один из существующих процессов выгружался из памяти. Выгружаемый процесс копировался в заранее определенную область свопинга (swapping partition), расположенную на диске. Некоторое пространство свопинга (swap space) выделялось для каждого процесса при его создании, поэтому область свопинга при необходимости была доступна.

4.3 Страничное замещение

Технология загрузки страниц по запросу (demand paging) появилась в системе UNIX после создания VAX-11/780 в 1978 году. В системах загрузки страниц по запросу память и адресное пространство процесса поделены на страницы фиксированного размера, которые помещаются в память или выгружаются по мере необходимости. Страницу физической памяти часто называют страничным фреймом (page frame) или физической страницей (physical page). В один момент времени могут выполняться сразу несколько процессов, при этом в физической памяти располагается лишь часть страниц каждого из них.

Рисунок 4.3 - Страницы и страничные фреймы

Каждая программа считает себя единственной в системе. Виртуальный адрес адреса состоит из номера страницы и смещение на этой странице. Аппаратная часть совместно с ОС преобразует номер виртуальной страницы в номер физического страничного фрейма и затем обращается к соответствующей ячейке памяти. Если требуемой страницы нет в оперативной памяти, ее необходимо туда загрузить. В идеальном случае ни одна из страниц не помещается в память до тех пор, пока она не потребуется. Большинство современных систем UNIX заранее загружают те страницы, которые, по мнению системы скоро потребуются.

Загрузка страниц по запросу может использоваться вместе с технологией свопинга, или отдельно.

Преимущества загрузки страниц по запросу:

  • Размер программы ограничивается только максимальным объемом виртуальной памяти, который на 32-разрядных машинах равен 4 гигабайтам;

  • Начальная загрузка программы происходит быстро, поскольку для начала работы программы не требуется полностью помещать ее в память;

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

  • Перемещение отдельных страниц памяти намного проще для системы, чем свопинг процессов или сегментов целиком.

Под адресное пространство процесса отводится некоторый набор адресов, начиная от 0 до некоторого максимума. В простейшем случае максимальная величина адресного пространства меньше объема ОП. Тогда процесс может заполнить свое адресное пространство, и памяти хватит на то, чтобы содержать его целиком.

Если же образ процесса полностью не помещается в ОП, то ОС хранит в ОП лишь часть адресов, а другую часть хранит на диске в определенном месте и при необходимости меняет их местами.

Рисунок 4.4 – Возможное местонахождение страниц процесса

В любой момент времени конкретная страница памяти процесса может находиться в одном из следующих состояний:

резидентная (resident). Страница загружена в основную память. Элемент таблицы страниц содержит номер странчного фрейма;

заполненная по необходимости (fill-on-demand). Процесс пока не произвел ссылку на такую страницу. Она будет помещена в память при первом обращении к ней. Существует два типа страниц, заполняемых при необходимости:

заполненная текстом (fill-from-text). При первом обращении в страницу считываются коды и данные из исполняемого файла;

заполненная нулями (zero-fill). Страница используется для хранения неинициализированных данных, и заполняется нулями при необходимости;

выгруженная (outswapped). Страница, которая была считана в память, а затем выгружена в область свопинга для того, чтобы освободить память для размещения другой страницы. Такие страницы могут быть восстановлены из области свопинга.

Виртуальная память процесса состоит из нескольких сегментов или областей.

///////Размер, содержимое и расположение сегментов в памяти определяется как самой программой (например, использованием библиотек, размером кода и данных), так и форматом исполняемого файла этой программы (COFF, ELF).///////

Рисунок 4.5 – Связь между структурами

Для контроля нахождения страниц в системе имеется специальная структура as, указатель на которую находится в структуре proc.

Структура as содержит:

  • указатель на список описателей сегментов

  • общий текущий размер физической памяти

  • указатель на некоторую аппаратно-зависимую структуру, данные которой используются при отображении виртуальных адресов в физические.

Описатель каждого сегмента содержит индивидуальные характеристики сегмента:

  • виртуальный адрес начала сегмента

  • размер сегмента в байтах

  • список операций, выполняемых над данными сегмента

  • статус сегмента (напр, в каком режиме к нему возможен доступ, допускается ли совместное использование)

  • указатель на таблицу описателей страниц сегмента

  • прямые и обратные ссылки по списку описателей

  • ссылка на общий описатель виртуальной памяти as

При осуществлении доступа к странице, сохраненной в области свопинга, ядро обрабатывает страничную ошибку, читая необходимую страницу из этой области. Для этого ядру необходимо поддерживать карту свопинга, описывающую местонахождение всех страниц, находящихся в области свопинга.

Рисунок 4.5 - Схема перемещения страниц

Если страница должна быть удалена из памяти повторно, ее сохранение в области свопинга происходит только в том случае, когда ее содержимое не совпадает с предыдущей копией. Так происходит в случае, когда страница была модифицирована после последнего чтения из области свопинга. Тогда страница является “грязной” (dirty). Следовательно, нужно уметь распознавать подобные страницы. Не нужно хранить в области свопинга текстовые страницы, так как их можно считать прямо из выполняемого файла.

Страничная система может использовать четыре различных типа карт трансляции адресов для поддержки виртуальной памяти.

Рисунок 4.7 - Преобразование адресов

Аппаратное преобразование адресов. Для выполнения каждой команды, осуществляющей доступ к памяти, аппаратная часть должна транслировать виртуальный адрес программы в адрес ячейки физической памяти. Любой компьютер обладает некоторым механизмом аппаратного преобразования адресов.

Карта адресного пространства. Если аппаратная часть не может преобразовать адрес, генерируется страничная ошибка (page fault). Это происходит, если страница не находится в основной памяти или аппаратура не может произвести трансляцию адреса. В этом случае обработчик ошибки ядра, будет помещать нужную страницу в основную память.

Карта физической памяти. Ядру часто нужно производить обратное преобразование и определять процесс, являющийся владельцем данной страницы в оперативной памяти, а также номер виртуальной страницы для нее. Например, при удалении активной страницы из памяти ядру необходимо пометить ее как недействительную. Для этого ядро находит и помечает соответствующее вхождение в таблице страниц.

Карта внешней памяти. Если нужная страница не находится в оперативной памяти, необходимо выделяет страничный фрейм и загрузить страницу из выполняемого файла, объектного файла разделяемой библиотеки или копии, находящейся в области свопинга. Такие страницы составляют внешнюю память по отношению к страницам процесса. Ядро поддерживает карты для нахождения страниц, находящихся во внешней памяти.

Страничная подкачка реализуется частично ядром, частично страничным демоном. Страничный демон (процесс номер 2). Как все демоны, страничный демон периодически запускается и смотрит, есть ли для него работа. Если он обнаруживает, что количество страниц в списке свободных страниц слишком мало, он инициализирует действие по освобождению дополнительных страниц.

Периодически для каждого процесса страничным демоном производятся следующие действия:

  1. просматриваются таблицы отображения всех сегментов ВП этого процесса

  2. если элемент таблицы отображения содержит ссылку на описатель физической страницы, то анализируется признак обращения

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

  4. если признак не установлен, то к счетчику старения добавляется единица, а страница приобретает статус кандидата на выход из рабочего набора процесса

  5. если при этом значение счетчика достигает некоторого критического значения, страница считается вышедшей из набора процесса, и ее описатель заносится в список страниц, которые можно откачать во внешнюю память

По ходу просмотра элементов таблиц отображения в каждом из них признак обращения гасится.

Откачку страниц, не входящих в рабочие наборы процессов, производит специальный системный процесс-stealer. Он начинает работать, когда количество страниц в списке свободных страниц достигает установленного нижнего порога. Функцией этого процесса является анализ необходимости откачки страницы в соответствующую область внешней памяти (т.е. либо в системную область подкачки – swapping для анонимных страниц, либо в некоторый блок файловой системы для страницы, входящей в сегмент отображаемого файла).