Программа-пример VMStat
Эта программа, «14 VMStat.exe» (см. листинг на рис. 14-2), выводит на экран окно с результатами вызова GlobalMemoryStatus Информация в окне обновляется каждую
секунду, так что VMStat вполне пригодна для мониторинга памяти в системе. Файлы
исходного кода и ресурсов этой программы находятся в каталоге 14-VMStat на ком пакт-диске, прилагаемом к книге. Окно этой программы после запуска в Windows 2000 на машине с процессором Intel Pentium II и 128 Мб оперативной памяти показано ниже.
Элемент dwMemoryLoad (показываемый как Memory Load) позволяет оценить, на сколько занята подсистема управления памятью. Это число может быть любым в ди апазоне от 0 до 100 В Windows 98 и Windows 2000 алгоритмы, используемые для его подсчета, различны. Кроме того, в будущих версиях операционных систем этот алго ритм почти наверняка придется модифицировать. Но, честно говоря, на практике от значения этого элемента толку немного
Элемент dwTotalPhys (показываемый как TotalPhys) отражает общий объем физи ческой (оперативной) памяти в байтах. На данной машине с Pentium II и 128 Мб опе ративной памяти его значение составляет 133 677 056, что на 540 672 байта меньше 128 Мб. Причина, по которой GlobalMemoryStatus не сообщает о полных 128 Мб, кро ется в том, что система при загрузке резервирует небольшой участок оперативной памяти, недоступный даже ядру. Этот участок никогда не сбрасывается на диск А эле мент dwAvailPhys (показываемый как AvailPhys) дает число байтов свободной физи ческой памяти.
Элемент dwTotalPageFile (показываемый как TotalPagcFile) сообщает максимальное количество байтов, которое может содержаться в страничном файле (файлах) на жестком диске (дисках). Хотя VMStat показывает, что текущий размер страничного файла составляет 318 574 592 байта, система может варьировать его по своему усмот рению Элемент dwAvailPageFile (покапываемый как AvailPageFile) подсказывает, что в данный момент 233 046 0l6 байтов в страничном файле свободно и может быть пе редано любому процессу.
Элемент dwTotalVirtual (показываемый как TotalVirtual) отражает общее количе ство байтов, отведенных под закрытое адресное пространство процесса. Значение 2 147 352 576 ровно на 128 Кб меньше 2 Гб. Два раздела недоступного адресного про странства — от 0x00000000 до 0x0000FFFF и от 0x7FFF0000 до 0x7FFFFFFF — как раз и составляют эту разницу в 128 Кб. Запустив VMStat в Windows 98, Вы увидите, что значение этого элемента поменялось на 2 143 289 344 (2 Гб за вычетом 4 Мб). Разница в 4 Мб возникает из-за того, что Windows 98 блокирует нижний раздел от 0x00000000 до 0x003FFFFF (размером в 4 Мб).
И, наконец, dwAvailVirtual (показываемый как AvailVirtual) — единственный элемент структуры, специфичный для конкретного процесса, вызывающего GlobalMemoryStatus (остальные элементы относятся исключительно к самой системе и не зависят от того, какой именно процесс вызывает эту функцию). При подсчете значения dwAvaiWirtual функция суммирует размеры вссх свободных регионов в адресном пространстве вы зывающего процесса. В данном случае его значение говорит о том, что в распоряже нии программы VMStat имеется 2 136 846 336 байтов свободного адресного простран ства. Вычтя из значения dwTotalVirtual величину dwAvailVirtual, Вы получите 10 506 240 байтов — такой объем памяти VMStat зарезервировала в своем виртуальном адресном
пространстве Отдельного элемента, который сообщал бы количество физической памяти, используемой процессом в данный момент, не предусмотрено
VMStat