
- •Лабораторная работа № 2 Мониторинг состояния системы
- •Краткие теоретические сведения
- •Получение информации о текущих процессах в ос семейства unix
- •Получение информации о текущих процессах в ос семейства windows
- •Системные требования
- •Функции определения состояния виртуальной памяти в win32 api
- •Функции определения параметров подсистемы управления памятью в unix
- •Задание
Системные требования
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.
Функции определения состояния виртуальной памяти в 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
Страница памяти в регионе закрыта (не используется другими процессами)