- •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. Стратегия подкачки и рабочие наборы. Стратегия подкачки и рабочие наборы
45. Средства пользовательского режима: управление памятью, совместное использование. Средства пользовательского режима
Диспетчер виртуальной памяти позволяет подсистемам пользовательского режима эффективно совместно использовать память с помощью объектов, которые являются защищенными и именованными и управляются, как и другие объекты исполнительной системы. Подсистемы могут постранично задавать защиту персональной памяти и фиксировать в памяти выбранные страницы. Они могут также использовать проецируемые файлы и управлять виртуальными адресными пространствами своих клиентов.
Управление памятью
Как показано на схеме атрибутов и сервисов объекта-процесса (рис. 4-3), диспетчер виртуальной памяти предоставляет набор базовых сервисов, при помощи которых процесс может напрямую управлять своей виртуальной памятью. Эти сервисы позволяют процессу:
• выделять память в два этапа;
• выполнять чтение и запись в виртуальную память;
• фиксировать виртуальные страницы в физической памяти;
• получать информацию о виртуальных страницах;
• защищать виртуальные страницы;
• сбрасывать содержимое виртуальных страниц на диск.
Диспетчер виртуальной памяти устанавливает двухфазный способ выделения памяти — резервирование памяти, а затем ее передача. Зарезервированная память (reserved memory) — это набор виртуальных адресов, которые диспетчер виртуальной памяти зарезервировал для использования процессом. В Windows NT резервирование памяти (т. е. виртуальных адресов) — это быстрая и дешевая операция. Переданной памятью (committed memory) называется память, для которой диспетчер виртуальной памяти выделил место в файле подкачки (paging file) — дисковом файле, в который он записывает виртуальные страницы, когда их надо удалить из памяти. Поток может либо сразу зарезервировать и передать виртуальную память, либо в начале лишь зарезервировать ее, передавая по мере необходимости.
Резервирование памяти полезно при создании динамических структур данных. Поток резервирует последовательные виртуальные адреса, передавая их, когда возникает необходимость поместить по ним данные. Если нужно увеличить размер структуры данных, то поток может передать дополнительную память из зарезервированного региона. Такая стратегия гарантирует, что другой поток этого процесса (например, библиотечный пакет) или другой процесс (например, поток подсистемы Win32) не сможет занять последовательные виртуальные адреса, которые могут понадобиться для расширения структуры данных. Поток может либо задать начальный виртуальный адрес резервируемого региона, либо позволить диспетчеру виртуальной памяти самому найти для него место в виртуальном адресном пространстве соответствующего процесса.
Диспетчер виртуальной памяти списывает с процесса часть его квоты в файле подкачки при передаче, но не при резервировании памяти. Такая двухуровневая семантика позволяет потоку зарезервировать большой регион виртуальной памяти, но не расходовать квоту до тех пор, пока эта память действительно не понадобится. Она также позволяет сохранить место в файле подкачки для страниц, которые на самом деле используются. Если некоторый диапазон адресов более не используется, то поток может его "передать обратно", освобождая пространство в файле подкачки и восстанавливая квоту процесса .
Для приложений, работающих в реальном времени или предъявляющих иные требования к производительности, диспетчер виртуальной памяти позволяет подсистеме пользовательского режима или другому процессу с соответствующими привилегиями фиксировать в памяти выбранные виртуальные страницы. Это гарантирует, что критическая страница не будет удалена из памяти до тех пор, пока в процессе выполняется хотя бы один поток. Например, приложение базы данных, хранящее свою информацию в виде структуры—дерева, может зафиксировать в памяти корень дерева, чтобы доступ к базе данных не вызывал дополнительных страничных ошибок.
Как и другие сервисы NT, сервисы виртуальной памяти позволяют вызывающему их передать описатель процесса, чтобы указать, с виртуальной памятью какого процесса следует работать. Вызывающий процесс может манипулировать как своей виртуальной памятью, так и памятью другого процесса. Это мощное средство, так как оно позволяет процессу пользовательского режима управлять адресным пространством другого процесса. Например, процесс может создать новый процесс, предоставив себе право работать с его адресным пространством. После этого первый процесс может выделять и освобождать память, а также выполнять чтение и запись в нее для второго процесса, вызывая сервисы виртуальной памяти и передавая им описатель последнего. Подсистемы используют данное средство для управления памятью их клиентских процессов.
Приложения Win32 имеют доступ ко многим возможностям диспетчера виртуальной памяти посредством API Win32. Они могут выделять и освобождать виртуальную память, производить ее чтение и запись в нее, сбрасывать содержимое виртуальных страниц на диск, получать информацию о диапазоне виртуальных страниц, фиксировать виртуальные страницы в памяти и защищать заданные страницы. Однако ни одна из этих функций API не позволяет приложению Win32 "залезать" в виртуальную память другого процесса, за исключением функций ReadProcessMemory() и WriteProcessMemory(). Они используются отладчиками пользовательского режима для установки точек останова и получения информации об отлаживаемом процессе.
