- •36. Подсистема Win32. 32-х разрядный api. Подсистема Win32
- •37. Структура.
- •38. Конструктивные изменения.
- •39. Api: ms-dos и 16-ти разрядной Windows. Виртуальные dos-машины. Api: ms-dos и 16-ти разрядной Windows.
- •Виртуальные dos-машины
- •44. Диспетчер. Виртуальная память. Диспетчер.
- •Виртуальная память
- •45. Средства пользовательского режима: управление памятью, совместное использование. Средства пользовательского режима
- •Управление памятью
- •Совместное использование памяти
- •46. Совместное использование: секции, проекции и проецируемые файлы. Секции, проекции и проецируемые файлы
- •47. Объект-секция. Способы защиты памяти. Объект-секция
- •Защита памяти
- •48. Собственная память процесса. Совместное использование памяти. Собственная память процесса
- •Совместное использование памяти
- •49. Адресное пространство. Подкачка страниц. Адресное пространство
- •Подкачка страниц
- •50. Механизмы подкачки страниц. Механизмы подкачки страниц
- •51. Стратегия подкачки и рабочие наборы. Стратегия подкачки и рабочие наборы
Виртуальная память
Память можно описать в терминах: физической структуры, логической структуры, а также способа, которым ОС транслирует (или не транслирует) одну структуру в другую.
Физическая память организована как последовательность однобайтовых ячеек Байты пронумерованы от нуля и до общего размера памяти, доступного в данной конфигурации, минус 1, как показано на рис. 6-1. Этот набор чисел (показанных здесь в шестнадцатиричной системе счисления) составляет физическое адресное пространство машины.
Логическая память, чаще называемая виртуальной (virtual memory) — это способ представления памяти для программы, и в современных ОС она редко совпадает с физической структурой памяти. Обычно системы виртуальной памяти используют либо сегментное, либо линейное представление памяти. Во всех первых персональных компьютерах на основе процессоров Intel, начиная с Intel 8086 и заканчивая Intel 80286, была использована сегментная модель. В системе сегментной адресации физическая память разделена на блоки адресов, обычно последовательных, называемые сегментами. В типичном случае адрес состоит из номера сегмента и смещения в сегменте.
С другой стороны, большинство процессоров RISC и даже последние CISC-процессоры Intel поддерживают линейную структуру адресов. Линейная адресация соответствует физической структуре памяти точнее, чем сегментная. В линейной схеме адреса начинаются с 0 и возрастают, байт за байтом, до верхней границы адресного пространства.
Рис. 6-1. Физическое адресное пространство.
Виртуальное адресное пространство (virtual address space) — это набор адресов памяти, которые могут использовать потоки процесса. Каждый процесс имеет отдельное адресное пространство, которое обычно гораздо больше размера физической памяти. Хотя диапазон физических адресов для конкретного компьютера ограничен объемом имеющейся у него памяти (каждый байт которой обладает уникальным адресом), диапазон виртуальных адресов ограничен только количеством битов в адресе.( Существуют также машины, где единицей памяти является слово, а не байт, но рассматриваем только байт—ориентированные компьютеры.) Каждый бит может быть либо установлен, либо сброшен; таким образом, например, процессор MIPS R4000, имеющий 32-разрядные адреса, обладает виртуального адресного пространства в 232, или 4 миллиарда байт (4 Гбайт), как показано на рис. 6-2.
Рис. 6-2. Линейное виртуальное адресное пространство.
Первая версия Windows NT использует 32-разрядные адреса для совместимости с Intel 386.
Это несоответствие между физическим и виртуальным адресными пространствами приводит к тому, что система виртуальной памяти обязательно должна выполнять следующие две задачи:
• Транслировать, или отображать , некоторое подмножество виртуальных адресов каждого процесса в участки физической памяти. Когда поток производит чтение или запись в своем виртуальном адресном пространстве, система виртуальной памяти (часть которой может быть реализована аппаратно) перед пересылкой данных определяет по виртуальному адресу соответствующий физический адрес.
• Выгружать на диск часть содержимого памяти, когда она переполняется, т. е. когда потоки, выполняющиеся в системе, пытаются использовать больше памяти, чем доступно физически.
Выполнение первой задачи — отображение виртуальных адресов в физические — позволяет легко перемещать программу в памяти в ходе ее исполнения. Система виртуальной памяти перемещает фрагменты программы на диск и затем обратно в память, причем, возможно, по другим адресам. Затем она модифицирует отображение логических адресов в физические, так чтобы оно указывало на новое местоположение.
Вторая задача, выгрузка содержимого памяти на диск, является следствием первой. Ясно, что процесс не может адресовать 4 Гбайт памяти, если в компьютере физически установлено только 4 Мбайт. Такой эффект достигается системой виртуальной памяти за счет использования диска в качестве резервной "памяти", называемой резервным хранилищем (backing store). При переполнении физической памяти система виртуальной памяти определяет, какие данные можно из нее удалить, и временно перемещает их в файл на диске. Когда эти данные вновь потребуются выполняющемуся потоку, система виртуальной памяти считывает их обратно с диска.
Перемещение данных между памятью и диском было бы недопустимо медленным, если бы диспетчер виртуальной памяти перемещал лишь по одному байту за раз. Поэтому виртуальное адресное пространство разделено на блоки равного размера, которые называются страницами (pages). Соответственно, физическое адресное пространство разделяется на блоки, называемые страничными фреймами (page frames), которые используются для хранения страниц. В любой момент времени в памяти находится некоторое множество страниц из виртуального адресного пространства каждого процесса. Страницы, находящиеся в физической памяти и доступные немедленно, называются действительными страницами (valid pages). Страницы, находящиеся на диске (или находящиеся в памяти, но не доступные немедленно), называются недействительными (invalid pages), как ясно из рис. 6-3.
При обращении потока по виртуальному адресу, который находится на странице, помеченной как недействительная, процессор генерирует системную ловушку, называемую страничной ошибкой (page fault). Система виртуальной памяти находит нужную страницу на диске и загружает ее в свободный страничный фрейм физической памяти. Когда число доступных страничных фреймов становится мало, система виртуальной памяти выбирает фреймы, подлежащие освобождению, и копирует их содержимое на диск. Этот процесс, называемый подкачкой страниц (paging), невидим прикладному программисту.
Рис. 6-3. Отображение виртуальных страниц в физические страничные фреймы.
Обработка страничной ошибки может быть дорогой операцией, требующей много тактов процессора. Однако большие размеры страницы снижают затраты, так как в память загружается большее количество данных и страничные ошибки происходят реже. (слишком большой размер страницы может привести к загрузке большего объема данных, чем необходимо, так что здесь требуется определенный баланс.) В общем случае число байт на странице выражается степенью двойки и зачастую определяется аппаратурой. Windows NT использует размер страницы, установленный в Intel 386 и равный 212, или 4 Кбайт. (MIPS R4000 позволяет задавать размер страницы программно.)
Хотя основные задачи системы виртуальной памяти — это отображение виртуальных адресов в физические и пересылка данных между памятью и фоновым хранилищем, у нее есть и некоторые другие обязанности:
• Обеспечивать легкий и эффективный способ совместного использования памяти двумя процессами.
• Защищать как совместно используемую, так и "частную" память от несанкционированного доступа.
• Если система предназначена для работы на многопроцессорном компьютере, как Windows NT, то она должна обрабатывать страничные ошибки от нескольких потоков одновременно.
