Память в Windows NT
Посетителей: 2621 | Просмотров: 3303 (сегодня 0)
Обзор памяти
Windows NT имеет 32-битное линейное пространство памяти (здесь «линейное» означает линейность адресов памяти, примером нелинейного адресного пространства является сегментная организация памяти Intel x86). Каждому приложению доступно собственное адресное пространство размером 4 гигабайта. Обычно, верхние два гигабайта зарезервированы для системных нужд и доступны только процессам работающим в привилегированном режиме (privileged mode). В Windows NT Server 4.0 Enterprise Edition существует возможность увеличить адресное пространство доступное пользовательским приложениям путем уменьшения максимального размера памяти, отводимого ядру с 2Gb до 1. Для более полной информации об этом рекомендую почитать статью Q171793 в Knowledge Base.
Обзор менеджера памяти
Как нетрудно догадаться, менеджер памяти (memory manager) управляет памятью в Windows NT. Физическая память разделена на блоки — страницы (pages) размером 4K для Intel, PPC и MIPS платформ и 8K для DEC Alpha. Страница является в некотором смысле атомарным объектом для менеджера памяти: все его операции над памятью сводятся к операциям над страницами.
В Windows NT страницы памяти могут быть сброшены на диск (paged), при этом они помещаются в файл подкачки (page file). Однако, не каждая страница может быть сброшена на диск: в NT все системные объекты хранятся в так называемых пулах (pools):
- сбрасываемый пул (paged pool) хранит объекты, которые могут быть при необходимости сброшены на диск
- несбрасываемай пул (non-paged pool) хранит объекты, которые не могут быть сброшены на диск ни при каких обстоятельствах
В несбрасываемом пуле хранятся, например ядро системы и драйвера, если в реестре в ключе
HKLM\SYSTEM\CurrentControlSet\Control
SessionManagerMemoryManagement параметр DisablePagingExecutive имеет значение 1. Пользовательские приложения используют обычно сбрасываемый пул.
С каждым процессом ассоциирован рабочий набор (working set) — множество страниц, находящихся в физической памяти, доступных процессу. С ростом объемы физической памяти в системе рабочие наборы также растут, а при уменьшении, соответственно, уменьшаются. Если процесс в ходе выделения памяти превысил максимальный размер рабочего набора, то его рабочий набор урезается (trim), в ходе чего наиболее «старые» страницы сбрасываются на диск.
Выделение памяти в NT аналогично UNIX. Когда процесс запрашивает память, то фактически, выделения памяти не происходит, а менеджер памяти просто резервирует какое-то количество адресов за процессом. Это множество адресов называют зарезервированной памятью (reserved memory). При попытке процесса впервые воспользоваться полученным адресным пространством, память выделяется процессу и для нее резервируется место в файле подкачки. Такая память называется выделенной (committed).
Память, которая не является выделенной или зарезервированной называется доступной памятью (available memory).
Если процесс обращается к некоторой странице и она не может быть найдена в рабочем наборе процесса, то возникает исключение сбой страницы (page fault). При этом, если нужная страница была найдена в физической памяти, то эта ситуация называется легким сбоем страницы (soft page fault). Если же нужная страница должна быть подгружена с диска, то ситуация называется тяжелым сбоем страницы (hard page fault).
Организация памяти windows те
В основе всей системы управления памятью Microsoft Windows NT лежит система виртуальной памяти, встроенная в ядро операционной системы. Эта система позволяет приложениям использовать области памяти, размер которых значительно превышает объем установленной в компьютере физической оперативной памяти.
Каждое приложение, запущенное в среде Microsoft Windows NT, может адресовать до 2 Гбайт виртуальной памяти. Причем для каждого приложения выделяется отдельное пространство виртуальной памяти, так что если, например, вы запустили 10 приложений, то в сумме они могут использовать до 20 Гбайт виртуальной памяти. При всем при этом в компьютере может быть установлено всего лишь 16 Мбайт физической оперативной памяти.
Казалось бы, зачем приложениям столько памяти?
Заметим, однако, что требования программ к объему оперативной памяти растут очень быстро. Еще совсем недавно были в ходу компьютеры с объемом оперативной памяти всего 1 — 4 Мбайт. Однако современные приложения, особенно связанные с обработкой графической или мультимедийной информации предъявляют повышенные требования к этому ресурсу. Например, размер файла с графическим изображением True Color может достигать десятков Мбайт, а размер файла с видеоизображением — сотен Мбайт. Без использования виртуальной памяти возможность работы с такими файлами была бы проблематичной.
Так же как и в операционной системе Microsoft Windows версии 3.1, в Microsoft Windows NT для создания виртуальной памяти используются дисковые устройства (рис. 1.8). Система виртуальной памяти Microsoft Windows NT позволяет создать до 16 отдельных файлов страниц, расположенных на разных дисковых устройствах, установленных в компьютере. Так как максимальный объем доступной виртуальной памяти определяется объемом использованных для нее дисковых устройств, то при необходимости вы можете, например, подключить к компьютеру несколько дисков большой емкости и разместить на них файлы страниц. Сегодня стали уже вполне доступными дисковые устройства с объемом 4 — 10 Гбайт, что позволяет в Microsoft Windows NT создавать виртуальную память действительно большого размера.
Рис. 1.8. Виртуальная память в Microsoft Windows NT создается с использованием оперативной памяти и дисковых устройств
Еще один случай, когда вашему приложению может пригодится виртуальная память объемом 2 Гбайта, это использование файлов, отображаемых на память. Выполнив такое отображение в свое адресное пространство, приложение может обращаться к файлу, как к обычному массиву, расположенному в оперативной памяти. При этом все необходимые операции ввода/вывода выполняются автоматически системой управления виртуальной памятью, так что приложение не должно об этом заботиться. Отобразив на память файл реляционной базы данных, вы можете обращаться к записям этого файла по индексу как к элементам массива, что значительно упрощает программирование.
Несегментированная модель памяти FLAT XE «FLAT»
Операционная система Microsoft Windows NT использует все возможности защищенного режима процессора, в частности, переключение задач и страничную адресацию. Схема преобразования адреса похожа на ту, что была применена в Microsoft Windows версии 3.1, однако есть много отличий.
Наиболее значительное — полный отказ от использования сегментированной модели памяти в 32-разрядных приложениях, к которой вы привыкли, создавая программы для MS-DOS и Microsoft Windows версии 3.1. В самом деле, используя 32-разрядное смещение, приложение может работать с памятью объемом 4 Гбайт без использования сегментных регистров процессора.
Поэтому, хотя логический адрес по-прежнему состоит из компонент селектора и смещения, приложения Microsoft Windows NT при обращении к памяти указывают только компоненту смещения. Сегментные регистры процессора, хранящие селекторы, заполняются операционной системой и приложение не должно их изменять.
Несегментированная модель памяти называется сплошной моделью памяти FLAT XE «FLAT» . При программировании в этой модели памяти вам не потребуются ключевые слова near и far, так как все объекты, расположенные в памяти, адресуются с использованием только одного смещения. В этом модель памяти FLAT напоминает модель памяти TINY XE «TINY» , с тем исключением, однако, что в последней размер адресуемой памяти не может превышать 64 Кбайт (из-за того что в модели TINY используется один сегмент и 16-разрядное смещение).
Таким образом, в распоряжении каждого приложения (или точнее говоря, каждого процесса) Microsoft Windows NT предоставляется линейное адресное пространство размером 4 Гбайта. Область размером 2 Гбайта с диапазоном адресов от 00000000h до 7FFFFFFFh предоставлена в распоряжение приложению, другие же 2 Гбайта адресуемого пространства зарезервированы для использования операционной системой (рис. 1.9).
Рис. 1.9. Адресное пространство приложения Microsoft Windows NT
Как это показано на рис. 1.9, небольшая часть адресного пространства в пределах первых 2 Гбайт также зарезервирована для операционной системы. Это области размером 64 Кбайта, расположенные в самом начале адресного пространства, а также в конце первых 2 Гбайт, и предназначенные для обнаружения попыток использования неправильных указателей. Таким образом, приложения не могут адресовать память в диапазонах адресов 00000000h — 0000FFFFh и 7FFF0000h — 7FFFFFFFh.
Изолированные адресные пространства
Для обеспечения необходимой надежности работы в Microsoft Windows NT адресные пространства всех запущенных приложений разделены. Такое разделение выполняется с помощью назначения приложениям индивидуальных наборов таблиц страниц вируальной памяти. В результате для каждого приложения выполняется отображение линейных адресов в собственный набор страниц виртуальной памяти, не пересекающийся с набором страниц других приложений.
Заметим, что приложение не имеет физической возможности выполнить адресацию памяти в пространстве, принадлежащем другому приложению. Какой бы линейный адрес ни задавало приложение, этот адрес всегда будет соответствовать одной из страниц, принадлежащих самому приложению. Такое положение дел обеспечивается системой управления виртуальной памятью Microsoft Windows NT и значительно повышает устойчивость операционной системы.
Однако полное изолирование адресных пространств создает трудности при необходимости организации обмена данными между различными приложениями. Вы не можете просто так передать указатель на область памяти из одного приложения в другое, так как в контексте другого приложения содержимое этого указателя не будет иметь смысла. Так как адресные пространства приложений изолированы, одному и тому же значению линейного адреса будут соотвтетсвовать ячейки памяти, расположенные в разных страницах.
В операционной системе Microsoft Windows версии 3.1 все приложения работали в одном адресном пространстве. Поэтому для передачи данных между приложениями можно было заказать область памяти в глобальном пуле с помощью функции GlobalAlloc XE «GlobalAlloc» и затем передать адрес этой области другому приложению. В Microsoft Windows NT этот метод работать не будет.
Выход, тем не менее, есть. Ничто не мешает операционной системе создать в каталоге страниц нескольких приложений специальный дескриптор, указывающий на страницы виртуальной памяти общего пользования. Такие дескрипторы называются дескрипторами прототипа PTE XE «дескриптор прототипа PTE» (Prototype Page Table Entry XE «Prototype Page Table Entry» ) и используются для совместного использования страниц памяти в операционной системе Microsoft Windows NT.
Дескрипторы PTE создаются для совместного использования страниц, содержащих исполнимый программный код, а также для работы с файлами, отображаемыми на память. Есть также способ организации общей памяти при помощи библиотек динамической компоновки DLL.
Поэтому если вам потребуется организовать передачу данных между приложениями, вы сможете всегда это сделать, например, через файл, отображаемый на память.
Дескрипторы страниц памяти
Как мы уже говорили, таблица страниц содержит дескрипторы, описывающие отдельные страницы памяти. Эти дескрипторы содержат физические адреса страниц, а так же другую информацию.
На рис. 1.10 показан формат дескриптора страницы XE «дескриптор страницы памяти» .
Рис. 1.10. Формат дескриптора страницы
Физический адрес страницы имеет 20 разрядов. Для получения 32-разрядного физического адреса байта внутри страницы к нему добавляются 12 байт смещения, взятые из линейного адреса, как это было показано на рис. 1.7.
Устанавливая соответствующим образом биты защиты, операционная система может отметить страницу как доступную для чтения и записи, только для чтения, или как недоступную. При попытке выполнить обращение для выполнения неразрешенной операции возникает аппаратное прерывание.
Биты с 3 по 6 содержат номер файла страниц, в котором находится страница, соответствующая данному дескриптору. Напомним, что в отличие от Microsoft Windows версии 3.1, операционная система Microsoft Windows NT позволяет создать до 16 файлов страниц.
Биты с 0 по 2 описывают состояние страницы памяти. Станица может быть отмечена флагами T (находится в переходном состоянии), D (обновленная, но не сохраненная в файле страниц), и P (присутствующая в памяти). Если приложение выполняет попытку обращения к странице памяти, которой нет в памяти, возникает аппаратное прерывание и нужная страница автоматически читается из соответствующего файла страниц в физическую оперативную память. После этого работа приложения продолжается.
Состояние страниц памяти
В дополнение к трем битам состояния страниц, хранящихся в дескрипторах страниц, система управления виртуальной памятью хранит состояние страниц XE «состояние страниц памяти» в специальной базе данных страниц. В этой базе данных страница может быть отмечена как имеющая одно из следующих состояний:
Страница доступна для использования после ее заполнения нулями
Свободная страница, заполненная нулями и доступная для использования приложениями
Страница используется активным процессом
Содержимое страницы было изменено, однако она не быле еще сохранена на диске в файле страниц
Страница удалена из рабочего набора страниц процесса
При обращении к этой странице возникла аппаратная ошибка
Обратите внимание, что если часть оперативной памяти неисправна, есть вероятность, что операционная система Microsoft Windows NT сможет продолжить работу. Неисправные страницы будут отмечены в базе данных страниц как плохие и к ним не будет выполняться обращение.
Управление памятью Windows nt.
Windows NT поддерживает сегментностраничную модель виртуальной памяти и использует для этих целей аппаратную поддержку таких процессоров как Intel 80386 и выше, MIPS R4000, DEC Alpha и Power PC. Для этого в NT executive имеется специальный компонент — менеджер виртуальной памяти.
Менеджер ВП обеспечивает для процессов следующие наборы функций:
управление виртуальным адресным пространством процесса;
разделение памяти между процессами;
защита виртуальной памяти одного процесса от других процессов.
Средства защиты памяти в Windows NT существуют в четырех формах.
Отдельное адресное пространство для каждого процесса. Аппаратура запрещает нити доступ к физическим адресам другого процесса.
Два режима работы: режим ядра, в котором нитям разрешен доступ к системным данным, и пользовательский режим, в котором это запрещено.
Страничный механизм защиты. Каждая виртуальная страница имеет набор признаков, который определяет разрешенные типы доступа в пользовательском режиме и в режиме ядра.
Объектно-ориентированная защита памяти. Каждый раз, когда процесс открывает указатель на секцию, монитор ссылок безопасности проверяет, разрешен ли доступ процесса к данному объекту.
Каждый раз, когда нить использует адрес, менеджер ВП вместе с аппаратными средствами транслирует виртуальный адрес в физический. Подсистема виртуальной памяти, управляя процессом трансляции виртуальных адресов, гарантирует, что нить одного процесса не сможет получить доступ к физической странице памяти, относящейся к другому процессу.
В дополнение к прямой защите, обеспечиваемой механизмом трансляции, каждый процессор, который поддерживает виртуальную память, реализует некоторую форму аппаратно-управляемой защиты памяти. Часто аппаратная защита бывает минимальной. Из-за этого менеджер виртуальной памяти Windows NT в гораздо большей степени зависит от аппаратуры, чем другие части операционной системы.
Каждый процесс NT executive имеет большое виртуальное адресное пространство размером в 4Гб, из которых 2 Гб резервируются для системных нужд. (Процессор MIPS R4000 требует, чтобы 2 Гб адресного пространства были зарезервированы для системы. Хотя другие процессоры требуют меньше, для переносимости системы Windows NT всегда резервирует 2 Гб.) Младшие адреса виртуального адресного пространства доступны для нитей, работающих и в пользовательском, и в привилегированном режимах, они указывают на области памяти, уникальные для каждого процесса. Старшая часть адресов доступна для нитей только тогда, когда они выполняются в привилегированном режиме. Виртуальное адресное пространство процесса :
В нижней (младшей) части системной области памяти располагаются код и данные ядра, они никогда не вытесняются из памяти. Поскольку адреса из этого диапазона транслируются аппаратурой и всегда бывают действительными, доступ к этой области памяти осуществляется очень быстро. Она используется для тех частей ядра, от которых требуется максимальная производительность, например, для кода, который распределяет нити.
Верхняя часть системной памяти управляется менеджером виртуальной памяти и используется для хранения остальных системных данных и кода. Часть этой области резервируется для кода и данных, которые могут быть вытеснены на диск с помощью страничного механизма, а другая часть никогда не вытесняется из памяти (в ней, например, размещается код, который осуществляет страничный обмен).
В составе менеджера виртуальной памяти имеется такой компонент, как пейджер (pager). Этот код перемещает страницы между диском и памятью, представляя собой промежуточное звено между аппаратными механизмами и программно-реализуемыми стратегиями. В его функции входит:
загрузка страницы в память при возникновении страничного прерывания,
проверка прав доступа к отсутствующим страницам и дополнение аппаратных средств защиты страниц, загруженных в память,
обновление структур данных подсистемы управления памятью.
Процесс принятия решения о замене страниц системой виртуальной памяти обычно включает три фазы: извлечение, размещение, замена.
Этап извлечениясвязан с выбором условия, при выполнении которого страница перемещается с диска в память. Существует два типа стратегий извлечения: с упреждением, когда страницы загружаются в память до того, как они оказываются необходимыми процессу, и стратегии загрузки по требованию, в соответствии с которыми страница перемещается в память только при наступлении страничного прерывания. При использовании стратегий «по требованию» при старте каждой нити происходит интенсивная загрузка страниц. Эти страницы называются начальным набором страниц. После загрузки начального набора интенсивность загрузки страниц заметно уменьшается.
Менеджер виртуальной памяти Windows NT использует стратегию «по требованию» с кластеризацией. При возникновении страничного прерывания менеджер виртуальной памяти загружает в память вызвавшую прерывание страницу, а также небольшое количество окружающих ее страниц. Эта стратегия пытается минимизировать количество страничных прерываний.
Этап размещения. Набор правил, используемых для определения места размещения новой страницы в памяти, называется стратегией размещения. В Windows NT менеджер виртуальной памяти просто выбирает первую страницу из списка свободных физических страниц. База данных физических страниц — это массив записей, пронумерованных от 0 до максимального номера страницы, зависящего от объема памяти. Каждая запись содержит информацию о соответствующей физической странице. Менеджер виртуальной памяти использует прямые связи в случае, когда процесс запрашивает доступ к виртуальному адресу в действительной виртуальной странице.
Этап замещения. Если при возникновении страничного прерывания в физической памяти нет свободных страниц, то используется стратегия замещения, которая определяет, какую виртуальную страницу нужно удалить из памяти для освобождения места для размещения новой страницы.
Менеджер виртуальной памяти Windows NT использует локальный алгоритм FIFO (First Input First Output). В соответствии с алгоритмом FIFO из памяти удаляется та страница, которая дольше всего там находится. Локальность в данном случае означает, что поиск страницы-кандидата на выгрузку осуществляется только среди страниц того процесса, который требует загрузки новой страницы. Существуют и глобальные стратегии, в соответствии с которыми поиск замещаемой страницы выполняется на множестве страниц всех процессов. Локальный вариант стратегии не дает одному процессу возможность захватить всю имеющуюся память.
Когда процесс стартует, ему назначается минимальный рабочий набор страниц. Процесс может его увеличивать до некоторого максимального размера. Если процесс требует еще больше страниц, то менеджер виртуальной памяти удаляет из рабочего набора по одной странице при загрузке каждой новой страницы. Когда размер свободной физической памяти уменьшается до некоторой критической границы, то менеджер виртуальной памяти использует прием, называемый автоматическим триммингом рабочего набора. Он просматривает страницы каждого процесса, находящиеся в памяти, сравнивает их количество с минимальным размером рабочего набора и удаляет избыточные страницы из памяти.
В Windows NT реализована сегментно-страничная модель распределения памяти. Для хранения информации о состоянии виртуальных сегментов используется набор структур, называемых дескрипторами виртуальных адресов. Когда процессу назначается новая область памяти, менеджер виртуальной памяти создает дескриптор, в котором хранится вся информация, связанная с этой областью, такая как диапазон адресов, признаки того, является ли память разделяемой или частной, будет ли процесс-потомок наследовать содержимое этой области, признаки защиты. Затем дескриптор встраивается в двоичное дерево дескрипторов данного процесса, используемое для ускорения поиска.
Для снижения объема вычислений, затрачиваемых на работу менеджера виртуальной памяти, в Windows NT минимизируется количество страничных прерываний. Для этого предпринимаются следующие меры:
Каждому процессу предоставляется рабочий набор страниц достаточно большого размера, чтобы избежать частых страничных отказов.
Менеджер виртуальной памяти производит автоматический тримминг рабочего набора каждого процесса, чтобы сделать доступными для других процессов области памяти, занимаемые редко используемыми страницами.