Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
8.10.11.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.95 Mб
Скачать

45. Средства пользовательского режима: управление памятью, совместное использование. Средства пользовательского режима

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

Управление памятью

Как показано на схеме атрибутов и сервисов объекта-процесса (рис. 4-3), диспетчер виртуальной памяти предоставляет набор базовых сервисов, при помощи которых процесс может напрямую управлять своей виртуальной памятью. Эти сервисы позволяют процессу:

• выделять память в два этапа;

• выполнять чтение и запись в виртуальную память;

• фиксировать виртуальные страницы в физической памяти;

• получать информацию о виртуальных страницах;

• защищать виртуальные страницы;

• сбрасывать содержимое виртуальных страниц на диск.

Диспетчер виртуальной памяти устанавливает двухфазный способ выделе­ния памяти — резервирование памяти, а затем ее передача. Зарезервированная память (reserved memory) — это набор виртуальных адресов, которые диспет­чер виртуальной памяти зарезервировал для использования процессом. В Windows NT резервирование памяти (т. е. виртуальных адресов) — это быстрая и дешевая операция. Переданной памятью (committed memory) называется па­мять, для которой диспетчер виртуальной памяти выделил место в файле под­качки (paging file) — дисковом файле, в который он записывает виртуальные страницы, когда их надо удалить из памяти. Поток может либо сразу зарезерви­ровать и передать виртуальную память, либо в начале лишь зарезервировать ее, передавая по мере необходимости.

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

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

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

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

Приложения Win32 имеют доступ ко многим возможностям диспетчера виртуальной памяти посредством API Win32. Они могут выделять и освобождать виртуальную память, производить ее чтение и запись в нее, сбрасывать содержи­мое виртуальных страниц на диск, получать информацию о диапазоне вирту­альных страниц, фиксировать виртуальные страницы в памяти и защищать за­данные страницы. Однако ни одна из этих функций API не позволяет приложе­нию Win32 "залезать" в виртуальную память другого процесса, за исключением функций ReadProcessMemory() и WriteProcessMemory(). Они используются от­ладчиками пользовательского режима для установки точек останова и получе­ния информации об отлаживаемом процессе.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]