СПО (Корнилов) / Лекции / вар2 / Операционные системы (Корнилов)
.pdf
СПО Лекция 1 [23.12.04] |
|
|
|
|
|
|
81 |
|
Время |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
Страницы |
4 |
3 |
2 |
1 |
2 |
3 |
4 |
5 |
t |
W(t,w) |
Размер РМ |
1 |
{4} |
1 |
2 |
{3,4} |
2 |
3 |
{2,3,4} |
3 |
4 |
{1,2,3,4} |
4 |
5 |
{1,2,3} |
3 |
6 |
{1,2,3} |
3 |
7 |
{1,2,3,4} |
4 |
8 |
{2,3,4,5} |
4 |
Управление памятью на основе рабочих множеств реализуется в соответствии с локальной (VAX) или глобальной стратегией (UNIX)
Глобальный алгоритм замещения представлен ниже.
Yes |
W(t,w)i<Mi |
No |
|
|
|
|
|
для i != j |
Заместить стр. не |
|
|
входящую в W(t,w)i |
W(t,w)j<Mj |
|
|
|
|
|
Yes |
No |
|
|
|
|
Заместить стр. не |
? Заместить |
|
входящую в W(t,w)j |
стр. |
|
Загрузить стр |
|
СПО Лекция 1 [23.12.04] |
82 |
Управление виртуальной памятью в Win32.
В Windows NT реализована странично-страничная виртуальная память В NT размер виртуального адресного пространства равен 232 или 4GB (220 страниц по 4К). Таким образом теоретически процессу доступно 4GB памяти для программы и данных. Администратор виртуальной памяти NT (VMM) отличается от предыдущих версий Windows и использует линейные 32-х разрядные адреса для доступа к памяти. VMM использует жесткий диск для размещения страниц в страничном файле (pagefile). В оперативную память страницы загружаются по необходимости из страничного файла. Размер страничного файла может динамически изменяться. NT поддерживает до 16 страничных файлов.
Трансляция адреса в процессорах Intel и Alpha
Процессоры типа x86 работают со страницами размером 4К, а процессоры Alpha - 8К.
Каталог таблиц страниц и таблицы страниц содержат до 1024 элементов (по 32 разряда) и размещаются в одной странице памяти.
Адрес каталога страниц активного процесса хранится в регистре (CR3), каждый процесс имеет свой каталог страниц и на этом строится защита адресных пространств. Адрес каталога страниц хранится в блоке управления процессом. При переключении процессов значение CR3 загружается из блока управления процессом.
Первая часть виртуального адреса используется для выбора из каталога номера страницы, содержащей таблицу страниц. Вторая часть адреса используется для определения страницы памяти по таблице страниц. Младшая часть адреса является смещением до адреса в найденной странице.
Каталог страниц должен быть полностью определен, таблицы страниц определяются по необходимости.
Формат PDE/PTE
Биты Назначение
31-27 Защита (PAGE_NOACCESS, PAGE_READONLY, PAGE_READWRITE, PAGE_WRITECOPY, PAGE_EXECUTE)
26-7 Номер физической страницы (20 бит)
СПО Лекция 1 [23.12.04] |
83 |
6-3 Номер страничного файла (0-15)
2-0 Биты состояния (T-D-P): T- флаг переходной страницы, D – флаг грязной страницы, P –флаг присутствия страницы в памяти
Комбинации битов состояния
T |
D |
P |
Состояние |
0 |
- |
0 |
Invalid page |
- |
0 |
1 |
Valid page |
- |
1 |
1 |
Valid dirty page |
1 |
0 |
0 |
Invalid page in transition |
1 |
1 |
0 |
Invalid dirty page in transition |
Если страница не загружена, то 20 бит используются как смещение в соответствующем страничном файле. Если страница относится к файлу, отображаемому в память, то 28 бит(4-защиты, 20 – номер страницы и 4 – номер файла) адресуют системную структуру, описывающую отображение.
Буфер транслированных адресов
Если полная трансляция адреса будет выполняться при каждом обращении к памяти, то производительность системы будет невысокой. Поэтому в процессорах x86 и Alpha применяется кэширование транслированных адресов - Translation Look-aside Buffers (TLBs). В кэш помещаются пары, состоящие из старшей части виртуального адреса и соответствующего номера физической страницы.
Размер кэша - 32 элемента. Реализован ассоциативный поиск, т.е. сравнение виртуального адреса выполняется одновременно со всеми элементами кэша. Если в кэше находится совпадающий элемент, то пропускается преобразование адреса по каталогу страниц и по таблице страниц. Замещение выполняется по принципу LRU.
Время переключения контекста между процессами в основном определяется временем заполнения кэша новыми элементами, т.к. кэш при переключении контекста необходимо очистить.
Механизм загрузки страниц
Загрузка страниц в память производится по запросу (прерывание по отсутствию страницы). Прерывание, сигнализирующее отсутствие страницы в памяти возбуждается MMU при попытке обратиться к
СПО Лекция 1 [23.12.04] |
84 |
странице, состояние которой равно invalid. Это может случиться как на первом, так и на втором шаге трансляции адреса.
Прерывания по отсутствию страницы обрабатываются компонентой Memory Manager, который определяет по своим внутренним структурам является ли это обращение допустимым для процесса, т.е. предусмотрено ли отображение такого адреса. Если адрес не определен для процесса, то задача аварийно завершается, а если она выполнялась в режиме ядра, то выводится «синий экран».
Состояние устанавливается не только для неопределенных страниц, но и для страниц выгруженных из физической памяти и находящихся в страничном файле. В этом случае Memory Manager должен найти свободное место в памяти и загрузить туда требуемую страницу. Обычно это связано с выгрузкой какойлибо страницы в страничный файл. Затем NT вносит изменение в таблицу страниц и повторно выполняет команду, вызвавшую прерывание.
Рабочие множества
Внаибольшей степени Memory Manager влияет на производительность вычислительной системы тем, как он распределяет физическую память между процессами. Число страниц, которое Memory Manager выделяет процессу в физической памяти называют рабочим множеством. Имеется системное рабочее множество, которое принадлежит ядру и драйверам устройств.
Если размер рабочего множества слишком мал, то часто возникают прерывания по отсутствию страницы. Если размер рабочего множества слишком большой, то вероятно память занята страницами, к которым процесс не обращается в последнее время, и тем самым он мешает работе других процессов. Необходим баланс.
ВNT реализована модифицированная загрузка страниц по запросу (clustered demand paging). Вместе с загрузкой требуемой страницы Memory Manager пытается загрузить и соседние страницы - кластер, размер кластера варьируется от 0 до 7 страниц в зависимости от количества физической памяти в системе и от того к каким данным производится обращение (код или данные). В NT реализована смесь локальной и глобальной стратегии замещения страниц.
На однопроцессорных системах NT использует простейшую форму LRU, основанную на бите доступа к странице, который содержится в PTE. Рабочее множество каждого процесса характеризуется текущим, минимальным и максимальным размерами (в системе с 64MB памяти минимальный размер рабочего множества - 200KB, максимальный - 1.4MB). Когда процесс начинает выполняться, генерируется большое число прерываний по отсутствию страницы и Memory Manager позволяет рабочему множеству процесса расти до максимального значения. Memory Manager может позволить рабочему множеству превысить максимальный предел, если в данное время имеется в наличии достаточно свободных страниц в физической памяти. Если свободных страниц нет, то производится замещение: просматриваются страницы рабочего множества и если бит доступа к странице установлен, то он очищается, если находится страница с очищенным битом доступа, то она замещается.
На многопроцессорных системах Memory Manager не очищает бит доступа поскольку любая модификация PTE в многопроцессорной системе приводит к сбросу элемента из кэшей всех процессоров. Поэтому применяется случайный алгоритм замещения. Microsoft разработала более эффективный алгоритм замещения на многопроцессорных машинах для NT 5.0.
Memory Manager регулирует размер рабочих множеств раз в секунду или сразу, как только число свободных страниц достигает минимального порога. Если свободной памяти достаточно, то Memory Manager пытается удалять страницы из рабочих множеств процессов, у которых текущий размер больше минимального и число прерываний по отсутствию страницы невелико. Если свободной памяти мало, то
СПО Лекция 1 [23.12.04] |
85 |
Memory Manager пытается выдергивать страницы из рабочих множеств процессов даже если их размер становятся меньше минимального предела.
Адресное пространство процесса
Виртуальное адресное пространство процесса (4GB) делится на две части: в младших адресах размещаются программа и данные процесса, а в верхних – системные программы и данные общие для всех процессов.
Отображение для старших адресов осуществляется через глобальные таблицы страниц, на которые имеются ссылки из каталогов страниц каждого процесса. В битах защиты имеется специальный бит доступа, который определяет в каком режиме (пользовательском или ядра) возможно обращение к странице. Попытка обратиться ко второй половине адресов в пользовательском режиме приведет к прерыванию по защите памяти.
Начиная с SP3 NT 4.0 позволяет изменять границу между пользовательской и системной частями адресного пространства процесса (для всех процессов!). В файле boot.ini можно установить ключ /3GB, по которому пользовательская часть составит 3GB, а системная -1GB.
Резервирование памяти выполняется в NT в два этапа: резервирование диапазона адресов в виртуальном адресном пространстве и предоставление диапазона адресов. При резервировании память не выделяется ни в физической памяти ни в страничном файле. Если процесс хочет использовать память, он должен затребовать ее предоставление из ранее зарезервированного диапазона.
// Резервирование 10МВ
lpBase = VirtualAlloc(NULL, 10485760, MEM_RESERVE, PAGE_NOACCESS);
Значение NULL первого параметра говорит, что положение в памяти безразлично (можно указать желаемый виртуальный адрес начала региона). Возвращаемое значение – адрес зарезервированного региона. Второй параметр определяет размер региона (минимальный размер – 64К, максимальный 2GB). Третий параметр определяет тип запроса: MEM_RESERVE или MEM_COMMIT (их можно объединять). Четвертый параметр
задает атрибуты защиты: PAGE_NOACCESS, PAGE_READONLY, PAGE_READWRITE.
При предоставлении памяти Memory Manager проверяет наличие затребованного объема в физической памяти и в страничных файлах.
СПО Лекция 1 [23.12.04] |
86 |
Раздельное резервирование и предоставление памяти имеет смысл. Например, Memory Manager резервирует 1MB для стека процесса, но предоставляет только одну страницу памяти (4К). Если стек заполняет страницу, то предоставляется дополнительная страница из зарезервированного диапазона.
NT отслеживает зарезервированные и предоставленные диапазоны адресов в древовидной структуре, состоящей из Virtual Address Descriptors (VADs). Указатель корня дерева хранится в блоке управления процессом. Каждый узел дерева описывает диапазон страниц с идентичными характеристиками по защите и предоставлению.
Освобождение и отказ от предоставленной памяти осуществляется вызовом функции VirtualFree. При отказе от предоставленной памяти требуется указывать размер памяти такой же, как при ее предоставлении. Нельзя освободить два ранее предоставленных блока в одном вызове, даже если они расположены рядом.
// Освобождение 3-й страницы
VirtualFree(lpBase + 2*4096, 4096, MEM_DECOMMIT, PAGE_NOACCESS);
// Освобождение всей предоставленной и зарезервированной памяти
VirtualFree(lpBase, 10485760, MEM_RELEASE, PAGE_NOACCESS);
Лекция 16. Управление виртуальной памятью в Win32.
9База данных физических страниц
9Разделяемая память и прототип PTE
9Отображение файлов и разделяемая память
База данных физических страниц
Memory Manager поддерживает базу данных физических страниц (PFN Database). Каждый элемент PFN Database соответствует странице физической памяти и содержит информацию о ее состоянии. Физическая страница может находиться в одном из 8 состояний. Страницы, с одинаковым состоянием объединяются в отдельный список, кроме страниц в переходном состоянии. В процессе своей жизни страница, в зависимости от состояния, перемещается из одного списка в другой (рис.1).
Состояние |
Описание |
Valid (or Active) |
Входит в рабочее множество хоть одного процесса. |
Transition |
Читается из (или пишется в) страничный файл |
Standby |
Удалена недавно из рабочего множества (в страничном файле такая же). |
Modified |
Удалена недавно из рабочего множества и модифицирована(в страничном |
|
файле отличается) |
Modified No-write |
Удалена недавно из рабочего множества, модифицирована, но не требует |
|
записи на диск (в страничном файле отличается) |
Free |
Не входит в рабочее множество ни одного процесса и еще не очищена. |
Zeroed |
Страница свободна и очищена. |
Bad |
Ошибки чтения – записи |
Рассмотри как происходит изменение состояния страницы (рис.2). Страница имеет состояние valid если она входит в рабочее множество процесса, при этом страница может быть «чистой» или «грязной» (биты PTE). «Грязная страница» - страница котороя была модифицирована в памяти и ее содержимое отличается от содержимого в страничном файле.
СПО Лекция 1 [23.12.04] |
87 |
Когда Balance Set Manager удаляет страницу из рабочего множества, страница перемещается в один из трех списков: чистая страница в список standby, грязная страница в список modified, в специальных случаях (файловая система меняет FAT или MFT-Master File Table в NTFS) грязная страница помещается в список modified no-write. Последнее гарантирует, что мета данные будут записаны на диск позже, когда все операции с файлом завершены.
Страница из списка modified перемещается в список standby после того, как Memory Manager обновит ее в страничном файле. Но во время записи страницы в страничный файл ее состояние - transition (не входит ни в один из списков). Страница modified no-write перемещается в список standby, когда этого потребует файловая система. Когда число модифицированных страниц превышает некоторый порог или число свободных страниц становится меньше минимально допустимого значения (порог зависит от размера физической памяти), система активизирует процесс, который пишет модифицированные страницы в страничный файл.
Рис.1
СПО Лекция 1 [23.12.04] |
88 |
|
|
|
|
Рис.2
Страница перемещается из списка standby в список free когда процесс освобождает виртуальную память или завершается. Если страница удалена из рабочего множества (standby, modified, modified no-write) и еще не выделена другому процессу, то при обращении процесса к этой странице она будет возвращена в рабочее множество. Эта операция называется soft-faulting.
Страница перемещается из списка standby в список zeroed после того, как специальная нить занулит ее. Эта нить выполняется с приоритетом 0 и выполняется когда нет других готовых к выполнению нитей.
При необходимости расширить рабочее множество процесса, сначала просматривается список zeroed, если список пуст, то проверяется список free, затем список standby. Если и этот список пуст, то начинается процесс выдергивания страниц из рабочих множеств процессов и выделяется освободившаяся страница.
Зануление страниц – это часть механизма защиты (страница, выделенная в распоряжение процесса не должна содержать информацию, оставшуюся от другого процесса).
Разделяемая память и прототип PTE
База данных номеров физических страниц (PFN) содержит информацию о состоянии страниц физической памяти. В простейшем случае элемент базы данных PFN содержит ссылку на соответствующий PTE. Если два или более процессов разделяют доступ к одной странице, то на нее указывают несколько PTE из таблиц страниц разных процессов. В этом случае элемент PFN указывает на структуру данных Prototype РТЕ (РРТЕ).
СПО Лекция 1 [23.12.04] |
89 |
|
|
|
|
|
|
Процесс, который хочет предоставить часть памяти для доступа другим процессам, должен создать объект Section Object. Объект содержит информацию об имени файла его размере и отображаемой части. Другой процесс, желающий получить доступ к общей памяти должен отобразить память, описываемую объектом Section Object в свое адресное пространство.
Одновременно с созданием объекта Section Object создается другая структура - Segment. Сегмент содержит PPTE, описывающие все страницы секции. Когда страница переводится в состояние standby, modified или modified no-write, Memory Manager отмечает PTE как invalid и заносит в него ссылку на РРТЕ.
Рассмотрим следующий пример: два процесса разделяют доступ к странице. Когда страница находится в памяти, каждый из двух процессов содержит в PTE номер страницы. Если страница удалена из рабочих множеств обоих процессов, то VMM передает ее в страничный файл и изменяет PTE так что они имеют состояние invalid и указывают на РРТЕ. При возврате страницы в память Memory Manager изменяет РРТЕ (указывает на нвый номер физической страницы). Если один из процессов обращается к странице, возникает прерывание по отстутствию страницы, Memory Manager смотрит в PTE, находит номер страницы в РРТЕ и помечает PTE как valid и заменяет указатель PPTE на номер страницы. Если этого механизма нет, то при возврате страницы в память необходимо обновлять PTE во всех процессах, ссылающихся на данную страницу.
В базе данных PFN поддерживается счетчик ссылок процессов на разделяемую страницу, когда счетчик станет равным 0, то это значит, что она не входит ни в одно из рабочих множеств и перемещается в список standby или modified.
Отображение файлов и разделяемая память
Важной особенностью NT Memory Manager является возможность отображения файлов на адресное пространство процесса. Файлы, отображаемые в память, могут использоваться для организации разделяемых областей памяти.
СПО Лекция 1 [23.12.04] |
90 |
|
file1.exe |
|
|
|
file2.exe |
Процесс 1 |
PageFile |
Процесс 2 |
|
|
|
Программа |
|
Программа |
(file1.exe) |
|
(file2.exe) |
Данные |
|
Данные |
Разделяемые данные |
Разделяемые данные |
В процессе отображения файла создаются несколько структур данных. Объект ядра файл представляет файл на жестком диске. Объект ядра Section Object (функция CreateFileMapping) содержит информацию об имени файла, его размере, отображаемой части. Сегмент содержит PPTEs секции и указывает на структуру control area, на нее же имеется ссылка из объекта файл. Структура control area создается в одном экземпляре не зависимо от количества секций.
После того как отображение выполнено, процесс может читать и писать данные файла как данные в памяти
(*pMem = 23).
Когда процесс обращается к адресу, отображенному в файл, Memory Manager отыскивает VAD, который описывает диапазон адресов,затем находит control area, загружает страницу в паямять и модифицирует РТЕ. Поскольку Memory Manager знает File Object, то он может инициировать загрузку страницы из файла через файловую систему в отличие от обычной загрузки страницы из страничного файла.
Отображаемый файл может содержать программу или данные. Файл, загружаемый для выполнения, отображается как image (такая же методика используется для отображения кода DLL.). Файл с программой может отображаться и как файл данных, NT создает отдельные управляющие блоки для этих двух типов отображения.
