Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Создание эффективных приложений для Windows Джеффри Рихтер 2004 (Книга).pdf
Скачиваний:
375
Добавлен:
15.06.2014
Размер:
8.44 Mб
Скачать

Элемент

Описание

 

 

dwOemld

Устарел, больше не используется

wReserved

Зарезервирован на будущее; пока не используется

 

 

dwNumberOfProcessors

Число процессоров в компьютере

 

 

dwActiveProcessorMask

Битовая маска, которая сообщает, какие процессоры активны (выполняют потоки)

 

 

dwProcessorType

Используется только в Windows 98; сообщает тип процессора, например Intel 386, 486 или

 

Pentium

wProcessorArchitecture

Используется только в Windows 2000; сообщает тип архитектуры процессора, например Intel,

 

Alpha, 64-разрядный Intel или 64-разрядный Alpha

 

 

wProcessorLevel

Используется только в Windows 2000; сообщает дополнительные подробности об архитектуре

 

процессора, например Intel Pentium Pro или Pentium II

 

 

wProcessorRevision

Используется только в Windows 2000; сообщает дополнительные подробности об уровне данной

 

архитектуры процессора

 

 

Программа-пример Syslnfo

Эта программа, «14 SysInfo.exe» (см. листинг на рис. 14-1), весьма проста; она вызыва ет функцию GetSystemInfo и выводит на экран информацию, возвращенную в струк туре SYSTEM_INFO. Файлы исходного кода и ресурсов этой программы находятся в каталоге 14-SysInfo на компакт-диске, прилагаемом к книге Диалоговые окна с ре зультатами выполнения программы SysInfo на разных процессорных платформах показаны ниже.

Windows 98 на процессоре x86 32-разрядная Windows 2000 на процессоре x86

32-разрядная Windows2000 64 разрядная Windows 2000 на процессореА1рhа на процессоре Alpha

Статус виртуальной памяти

Windows-функция GlobalMemoryStatus позволяет отслеживать текущее состояние па мяти

VOID GlobalMemoryStatus(LPMEMORYSTATUS pmst);

На мой взгляд, она названа крайне неудачно, имя GlobalMemorySlatus подразуме вает, что функция каким-то образом связана с глобальными кучами в 16-разрядной Windows Мне кажется, что лучше было бы назвать функцию GlobalMemoryStatus по другому — скажем,

VirtualMemoryStatus.

При вызове функции GlobaUdemoryStatus Вы должны передать адрес структуры MEMORYSTATUS. Вот эта структура:

typedef struct _MEMORYSTATUS

{

DWORD dwLength;

DWORD dwMemoryLoad;

SIZE_T dwTotalPhys;

SIZE_T dwAvailPhys;

SIZE_T dwTotalPageFile;

SIZE_T dwAvailPageFile;

SIZE_T dwTotalVirtual;

SIZE_T dwAvailVirtual;

} MEMORYSTATUS, *LPMEMORYSTATUS;

Перед вызовом GlobalMemoryStatus надо записать в элемент dwLength размер струк туры в байтах. Такой принцип вызова функции дает возможность Microsoft расширять эту структуру в будущих версиях Windows, не нарушая работу существующих прило жений После вызова GlobalMemoryStatus инициализирует остальные элементы струк туры и возвращает управление. Назначение элементов этой структуры Вы узнаете из следующего раздела, в котором рассматривается программа-пример VMStat.

Если Вы полагаете, что Ваше приложение будет работать на машинах с объемом оперативной памяти более 4 Гб или файлом подкачки более 4 Гб, используйте новую функцию GlobalMemoryStatusEx:

BOOL GlobalHemoryStatusEx(LPMEHORYSTATUSEX pmst);

Вы должны передать ей адрес новой структуры MEMORYSTATUSEX:

typedef struct _MEMORYSTATUSEX

{

DWORD dwLength;

DWORD dwMemoryLoad;

DWORDLONG ullTotalPhys;

DWORDLONG ullAvailPhys;

DWORDLONG ullTotalPageFile;

DWORDLONG ullAvaiIPageFile;

DWORDLONG ullTotalVirtual;

DWORDLONfi uUAvailVirtual;

DWOHDLONG ullAvailExtendedVirtual;

} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;

Эта структура идентична первоначальной структуре MEMORYSTATUS с одним ис ключением все ее элементы имеют размер по 64 бита, что позволяет оперировать со значениями, превышающими 4 Гб. Последний элемент, ullAvailExtendedVirtual, указы вает

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

Программа-пример 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, Вы увидите, что значение этого