374 Глава 11. Операционные системы Windows
мяти, который может быть отдан в распоряжение отдельных приложений, — если
не следить за этим, становится возможным возникновение тупиковых ситуаций.
После того как вся физическая память заполнена, первый же новый запрос на вы-
деление памяти инициирует замещение страниц. Интересным побочным эффек-
том такого подхода является то, что у приложений нет надежного способа опреде-
ления объема памяти, доступного в системе. Функция API GlobalMemorySatusQ
возвращает целый ряд параметров, характеризующих состояние системной памя-
ти, однако это не более чем «мгновенный снимок» текущей обстановки — еще один
вызов этой функции вполне может дать другие значения.
Страницы поступают в память и уходят из нее по-разному: в большинстве случаев
они либо непосредственно размещаются в выделенной для этого памяти (как ре-
зультат соответствующих запросов), либо загружаются при старте программы из
ЕХЕ-файла приложения. Впоследствии эти страницы начинают перемещаться
между физической памятью и файлом подкачки. Страницы, в которых содержит-
ся только код 32-разрядных приложений и динамически связываемых библиотек
(DLL), система всегда загружает только из исходных исполняемых файлов.
Для того чтобы облегчить управление всем разнообразием типов страниц памяти,
каждая активная страница, то есть каждая страница, которая является частью вы-
полняющегося в данный момент системного модуля или приложения, снабжена хра-
нящимся совместно с ней страничным дескриптором (Page Descriptor, PD). В этом
дескрипторе содержатся адреса процедур, которые занимаются перемещением стра-
ницы из памяти на диск и обратно. Независимо от того, что именно находится в
данной странице, диспетчер физической памяти, чтобы переместить страницу в опе-
ративную память или из нее, просто вызывает соответствующую функцию, адрес
которой определен в поле дескриптора страницы. В случае, если некоторая страни-
ца еще никогда не заполнялась, она называется абсолютно чистой (virgin"). Напри-
мер, именно так обозначаются страницы, содержащие код, использующий вызовы
Win32. После того как с момента размещения страницы в памяти в нее будет в первый
раз произведена запись данных, она считается испорченной (tainted) и может быть
либо грязной (dirty), либо чистой (clean), в зависимости от того, осуществлялась ли в
нее запись с момента последней ее подкачки в физическую память. Если запись в эту
страницу производилась, и в этой физической странице требуется разместить иную
виртуальную страницу, ее содержимое должно быть сохранено в файле подкачки.
Для наблюдения за распределением памяти и использованием иных ресурсов ком-
пьютера можно воспользоваться, например, программой SYSMON.EXE (системный
монитор). Эта программа входит в состав утилит операционных систем Windows
9х, поэтому после ее установки команда для ее запуска располагается в подменю
Служебные меню Стандартные. Она позволяет выбрать интересующие нас парамет-
ры и наблюдать за их текущими значениями.
Использование так называемой плоской модели памяти, когда программист может
использовать только один сегмент кода и один сегмент данных, которые имеют
максимально возможные размеры, определяемые системными соглашениями опе-
рационной системы, приводит к тому, что с точки зрения программиста память
получается неструктурированной. Программы используют классическую малую