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

Системные требования

Client: включен в Windows XP, Windows 2000 Professional, Windows NT Workstation 4.0.

Server: включен в Windows .NET Server 2003, Windows 2000 Server, Windows NT Server 4.0.

Header: Psapi.h.

Library: Psapi.lib.

  1. Функции определения состояния виртуальной памяти в win32 api

Сведения о конкретной реализации Win32 и о виртуальной памяти сообщает функция GetSystemInfo:

void GetSystemInfo(LPSYSTEM_INFO lpSystemInfo);

Функция заполняет структуру SYSTEM_INFO, адрес которой ей необходимо передать.

#include <windows.h>

#include <stdio.h>

void main()

{

SYSTEM_INFO siSysInfo;

// Copy the hardware information to the SYSTEM_INFO structure.

GetSystemInfo(&siSysInfo);

// Display the contents of the SYSTEM_INFO structure.

printf("Hardware information: \n");

printf(" OEM ID: %u\n", siSysInfo.dwOemId);

printf(" Number of processors: %u\n", siSysInfo.dwNumberOfProcessors);

printf(" Page size: %u\n", siSysInfo.dwPageSize);

printf(" Processor type: %u\n", siSysInfo.dwProcessorType);

printf(" Minimum application address: %lx\n", siSysInfo.lpMinimumApplicationAddress);

printf(" Maximum application address: %lx\n", siSysInfo.lpMaximumApplicationAddress);

printf(" Active processor mask: %u\n", siSysInfo.dwActiveProcessorMask);

}

Структура SYSTEM_INFO содержит информацию о текущей системе, включающую тип процессора, размер страницы, идентификатор фирмы (изготовителя) комплектного оборудования (original equipment manufacturer – OEM) и .т.п.

typedef struct _SYSTEM_INFO {

DWORD dwOemId;

struct {

WORD wProcessorArchitecture;

WORD wReserved;

}

DWORD dwPageSize;

LPVOID lpMinimumApplicationAddress;

LPVOID lpMaximumApplicationAddress;

DWORD dwActiveProcessorMask;

DWORD dwNumberOfProcessors;

DWORD dwProcessorType;

DWORD dwAllocationGranularity;

WORD wProcessorLevel;

WORD wProcessorRevision;

} SYSTEM_INFO, *LPSYSTEM_INFO;

Элементы структуры:

dwOemId

«Устаревший» элемент структуры, который оставлен для совместимости с Windows NT 3.5 и более ранними версиями. Новые приложения должны использованить элемент объединения wProcessorArchitecture.

Windows 95/98/Me: Данный элемент всегда равен нулю (значению, определенному для PROCESSOR_ARCHITECTURE_INTEL).

wProcessorArchitecture

Определяет архитектуру процессора. Может принимать следующие значения:

PROCESSOR_ARCHITECTURE_UNKNOWN PROCESSOR_ARCHITECTURE_INTEL Windows NT 3.51: PROCESSOR_ARCHITECTURE_MIPS Windows NT 4.0 и ранее: PROCESSOR_ARCHITECTURE_ALPHA Windows NT 4.0 и ранее: PROCESSOR_ARCHITECTURE_PPC Whistler 64-bit: PROCESSOR_ARCHITECTURE_IA64 Whistler 64-bit: PROCESSOR_ARCHITECTURE_AMD64

wReserved

Зарезервировано.

dwPageSize

Определяет размер страницы памяти и гранулярность защиты и блокировки страниц. Используется функцией VirtualAlloc. На процессорах х86, MIPS и PowerPC это значение равно 4 Кб, на процессоре Alpha — 8 Кб.

lpMinimumApplicationAddress

Минимальный адрес памяти доступного (для приложений и DLL) адресного пространства каждого процесса. В Windows 95 это значение равно 4 194 304, или 0х00400000, посколь­ку нижние 4 Мб адресного пространства каждого процесса недоступны. В Windows NT это значение равно 65 536, или 0х00010000, поскольку в этой сис­теме резервируются лишь первые 64 Кб адресного пространства каждого процесса.

lpMaximumApplicationAddress

Максимальный адрес памяти адресного пространст­ва, отведенного в "личное пользование" каждого про­цесса (для приложений и DLL). В Windows 95 этот адрес равен 2 147 483 647, или Ox7PFFFFFF, так как верхний раздел размером 2 Гб доступен всем процессам. В Windows NT значение этого адреса немного меньше (2 147 418 111, или 0x7FFEFFFF), поскольку подобный раздел в ней зани­мает на 64 Кб больше, чем в Windows 95.

dwActiveProcessorMask

Маска, отображающая набор процессоров системы. Бит 0 соответствует процессору 0; бит 31 – процессору 31.

dwNumberOfProcessors

Число процессоров в системе.

dwProcessorType

«Устаревший» элемент структуры, который оставлен для совместимости с Windows NT 3.5 и более ранними версиями. Для определения типа процессора следует использовать элементы wProcessorArchitecture, wProcessorLevel и wProcessorRevision.

Windows 95/98/Me: Тип процессора. Элементможет принимать следующие значения:

PROCESSOR_INTEL_386 PROCESSOR_INTEL_486 PROCESSOR_INTEL_PENTIUM

dwAllocationGranularity

Гранулярность выделения регионов адресного про­странства.

wProcessorLevel

Windows NT/2000 и последующие версии: Уровень процессора, определяемый архитектурой системы.

Если поле wProcessorArchitecture содержит значение PROCESSOR_ARCHITECTURE_INTEL, wProcessorLevel может принимать следующие значения.

Значение

Смысл

3

Intel 80386

4

Intel 80486

5

Intel Pentium

6

Intel Pentium Pro or Pentium II

Если поле wProcessorArchitecture равняется PROCESSOR_ARCHITECTURE_IA64, поле wProcessorLevel устанавливается в 1.

Если поле wProcessorArchitecture равняется PROCESSOR_ARCHITECTURE_MIPS, поле wProcessorLevel принимает значение в формате 00xx, где xx – 8-битный номер реализации. Поле может принимать следующие значения.

Значение

Смысл

0004

MIPS R4000

Если поле wProcessorArchitecture равняется PROCESSOR_ARCHITECTURE_ALPHA, поле wProcessorLevel принимает значение в формате xxxx, где xxxx – 16- битный номер версии процессора (младшие 16 разрядов номера версии фирмы-производителя). Поле может принимать следующие значения.

Значение

Смысл

21064

Alpha 21064

21066

Alpha 21066

21164

Alpha 21164

Если поле wProcessorArchitecture равняется PROCESSOR_ARCHITECTURE_PPC, поле wProcessorLevel принимает значение в формате xxxx, где xxxx – 16- битный номер версии процессора (старшие 16 разрядов Processor Version Register). Поле может принимать следующие значения.

Значение

Смысл

1

PPC 601

3

PPC 603

4

PPC 604

6

PPC 603+

9

PPC 604+

20

PPC 620

wProcessorRevision

Windows NT/2000 или более поздние версии: редакция(revision) процессора, определяемый архитектурой системы.

Процессор

Значение

Intel 80386 или 80486

В формате xxyz.

Если xx равняется 0xFF, y - 0xA – номер модели, z– последовательный идентификатор (stepping identifier). Например, для Intel 80486-D0 система вернет значение 0xFFD0.

Если xx не равняется 0xFF, xx + 'A' содержит последовательную литеру (stepping letter) и yz – minor stepping.

Intel Pentium, Cyrix, или NextGen 586

В формате xxyy, где xx – номер модели и yy – stepping.

MIPS

В формате 00xx, где xx – 8-разрядный номер редакции процессора (младшие 8 разрядов регистра PRId).

ALPHA

В формате xxyy, где xxyy – младшие 16 разрядов номера редакции процессора фирмы-изготовителя. Отображается в виде:

Model A+xx, Pass yy

PPC

В формате xxyy, где xxyy – младшие 16 разрядов номера редакции процессора. Отображается в виде:

xx.yy

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

Функция GlobalMemoryStatus позволяет динамически отслеживать текущее состоя­ние памяти:

void GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer);

При вызове функции GlobalMemoryStatus ей необходимо передать адрес структуры MEMORYSTATUS

Структура 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;

Элементы структуры

dwLength

Размер структуры MEMORYSTATUS в байтах. Функция GlobalMemoryStatus устанавливает значение данного поля.

dwMemoryLoad

Windows NT 4.0 и ранее: Примерная оценка занятости системы – процент примерно 1000 последних используемых страниц физической памяти.

Windows 2000 и более поздние версии: Приблизительный процент от общей используемой физической памяти.

dwTotalPhys

Общий размер физической памяти в байтах.

dwAvailPhys

Размер доступной физической памяти в байтах.

dwTotalPageFile

Размер предела переданной памяти (виртуальной памяти, для которой зарезервировано место в файле подкачки) в байтах.

dwAvailPageFile

Размер доступной (для резервирования) памяти в байтах.

dwTotalVirtual

Общий размер раздела пользовательского режима виртуального адресного пространства вызывающего процесса в байтах.

dwAvailVirtual

Размер незарезервированной памяти в разделе пользовательского режима виртуального адресного пространства вызывающего процесса в байтах.

Примечания

MEMORYSTATUS отображает состояние памяти и размер файла подкачки на момент вызова. Операционная система может увеличить файл подкачки до максимального размера, установленного администратором.

В системах с более чем 4 GB памяти структура MEMORYSTATUS может возвращать некорректную информацию. Windows 2000 возвращает значение -1 в случае переполнения. Более ранние версии Windows NT возвращают значения реальных размеров памяти (по модулю 4 GB). Если разрабатываемое приложение должно учитывать данные особенности, используйте функцию GlobalMemoryStatusEx вместо GlobalMemoryStatus.

Пример использования функции GlobalMemoryStatus

// Пример вывода:

// c:\>global

// The MemoryStatus structure is 32 bytes long.

// It should be 32.

// 78 percent of memory is in use.

// There are 65076 total Kbytes of physical memory.

// There are 13756 free Kbytes of physical memory.

// There are 150960 total Kbytes of paging file.

// There are 87816 free Kbytes of paging file.

// There are 1fff80 total Kbytes of virtual memory.

// There are 1fe770 free Kbytes of virtual memory.

#include <windows.h>

// Для изменения единиц измерения (Kb / Mb).

#define DIV 1024

// #define DIV 1

char *divisor = "K";

// char *divisor = "";

#define WIDTH 7

void main(int argc, char *argv[])

{

MEMORYSTATUS stat;

GlobalMemoryStatus (&stat);

printf ("The MemoryStatus structure is %ld bytes long.\n", stat.dwLength);

printf ("It should be %d.\n", sizeof (stat));

printf ("%ld percent of memory is in use.\n", stat.dwMemoryLoad);

printf ("There are %*ld total %sbytes of physical memory.\n", WIDTH, stat.dwTotalPhys/DIV, divisor);

printf ("There are %*ld free %sbytes of physical memory.\n", WIDTH, stat.dwAvailPhys/DIV, divisor);

printf ("There are %*ld total %sbytes of paging file.\n", WIDTH, stat.dwTotalPageFile/DIV, divisor);

printf ("There are %*ld free %sbytes of paging file.\n", WIDTH, stat.dwAvailPageFile/DIV, divisor);

printf ("There are %*lx total %sbytes of virtual memory.\n", WIDTH, stat.dwTotalVirtual/DIV, divisor);

printf ("There are %*lx free %sbytes of virtual memory.\n", WIDTH, stat.dwAvailVirtual/DIV, divisor);

}

Определение состояния адресного пространства

Функция VirtualQuery предоставляет информацию о диапазоне страниц в виртуальном адресном пространстве вызывающего процесса.

Для получения информации о диапазоне страниц в адресном пространстве другого процесса используется функция VirtualQueryEx.

DWORD VirtualQuery(

LPCVOID lpAddress, // адрес региона

PMEMORY_BASIC_INFORMATION lpBuffer, // информационный буфер

SIZE_T dwLength // размер буфера

);

Параметры

lpAddress

[in] Указатель на базовый адрес запррашиваемого региона страниц. Данное значение округляется (в сторону уменьшения) до границы ближайшей страницы. Для определения размера страницы используется функция GetSystemInfo.

lpBuffer

[out] Указатель на структуру MEMORY_BASIC_INFORMATION, заполняемую информацией о заданном диапазоне страниц.

dwLength

[in] Размер буфера lpBuffer (в байтах).

Возвращаемое значение

Число байт, записаных в информационный буфер.

Примечения

VirtualQuery возвращает информацию о регионе смежных страниц, начинающемся с заданного адреса и имеющих одинаковые следующие атрибуты.

Состояние всех страниц может быть MEM_COMMIT, MEM_RESERVE, MEM_FREE, MEM_PRIVATE, MEM_MAPPED или MEM_IMAGE.

Если начальная страница не свободна, все страницы региона являются частью единой зарезервированного региона (резервирование выполняется функцией VirtualAlloc).

Атрибут доступа для всех страниц может принимать значение PAGE_READONLY, PAGE_READWRITE, PAGE_NOACCESS, PAGE_WRITECOPY, PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_EXECUTE_WRITECOPY, PAGE_GUARD либо PAGE_NOCACHE.

Функция определяет атрибуты первой страницы региона и затем просматривает последующие страницы до конца региона либо до первой страницы с отличающимся набором атрибутов. Функция возвращает атрибуты и размер в байтах региона страниц с одинаковыми атрибутами. Например, если существует регион свободной памяти размером 40 MB и VirtualQuery вызвана для страницы, начальный адрес которой смещен на 10 MB от начала данного региона, функция вернет состояние MEM_FREE и размер 30 MB.

Структура MEMORY_BASIC_INFORMATION содержит информацию о диапазоне страниц виртуального адресного пространства процесса.

typedef struct _MEMORY_BASIC_INFORMATION {

PVOID BaseAddress;

PVOID AllocationBase;

DWORD AllocationProtect;

SIZE_T RegionSize;

DWORD State;

DWORD Protect;

DWORD Type;

} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

Элементы структуры

BaseAddress

Указатель на базовый адрес региона страниц.

AllocationBase

Указатель на базовый адрес региона страниц, выделенный функцией VirtualAlloc. Страница, адрес которой содержится в элементе BaseAddress, находится в выделенном диапазоне.

AllocationProtect

Атрибут защиты, присвоенный региону при резервировании. Может принимать следующие значения вместе с PAGE_GUARD и PAGE_NOCACHE.

Величина

Значение

PAGE_READONLY

Попытки записи или исполнения содержимого памяти в данном регионе вызывают нарушение доступа

PAGE_READWRITE

Попытки исполнения содержимого памяти в данном регионе вызывают нарушение доступа

PAGE_WRITECOPY

Windows NT/2000 и более поздние версии: процессу предоставляется «личная» копия данной страницы физической памяти

PAGE_EXECUTE

Попытки записи или чтения содержимого памяти в данном регионе вызывают нарушение доступа

PAGE_EXECUTE_READ

Попытки записи в память данного региона вызывают нарушение доступа

PAGE_EXECUTE_READWRITE

Данный регион допускает любые операции

PAGE_EXECUTE_WRITECOPY

Данный регион допускает любые операции. Запись в память этого региона приводит к тому, что процессу предоставляется «личная» копия данной страницы физической памяти

PAGE_GUARD

Windows NT/2000 и более поздние версии: Базовая защита страниц. Доступ к региону вызывает нарушение доступа ("guard page entered"). Данное значение является модификатором, действительным только в случае, если используется с атрибутом, отличным от PAGE_NOACCESS.

Windows 95/98/Me: аналогично PAGE_NOACCESS.

PAGE_NOACCESS

Попытки чтения, записи или чтения содержимого памяти в данном регионе вызывают нарушение доступа

PAGE_NOCACHE

Позволяет не выполнять кеширование присоединенных страниц. Аппаратный атрибут физической памяти должен быть установлен в значение «no cache». В общем случае не рекомендуется использовать. Полезен для драйверов устройств. Данное значение является модификатором, действительным только в случае, если используется с атрибутом, отличным от PAGE_NOACCESS.

RegionSize

Размер в байтах региона, начинающегося с базового адреса, в котором все страницы имеют идентичные атрибуты.

State

Состояние страниц региона. Поле может принимать следующие значения.

Состояние

Значение

MEM_COMMIT

Присоединенные страницы, для которых распределена физическая память

MEM_FREE

Свободные страницы, недоступные для вызывающего процесса, но которые могут быть зарезервированы. В данном случае значения полей AllocationBase, AllocationProtect, Protect и Type неопределены

MEM_RESERVE

Зарезервированные не присоединенные страницы. В данном случае значение поля Protect неопределено.

Protect

Атрибут защиты страниц региона. Поле может принимать одно из значений, перечисленных для поля AllocationProtect.

Type

Тип страниц (физической памяти) региона. Поле может принимать одно из следующих значений.

Тип

Значение

MEM_IMAGE

Страница памяти в регионе отображается в виде раздела образа

MEM_MAPPED

Страница памяти в регионе отображается в виде раздела

MEM_PRIVATE

Страница памяти в регионе закрыта (не используется другими процессами)

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