Основные системные функции, используемые для работы с памятью 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Основные системные функции, используемые для работы с памятью



В набор системных функций Win32API входит несколько функций, позволяющих получить информацию о том, как ОС работает с памятью.

Функция GetSystemInfo(…) позволяет получить различную информацию о работе операционной системы, в том числе и по работе с памятью. Эта функция принимает по ссылке один параметр типа TSystemInfo и заполняет его соответствующими значениями. Запись TsystemInfo определяется следующим описанием:

typedef struct_SYSTEM_INFO { // sinf

union {

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;

Поле dwOemld используется для Windows 95. Это поле всегда устанавливается равным нулю или значению PROCESSOR_ARCHITECTURE_INTEL.

Под управлением Windows NT используется поле wProcessorArchitecture, которое описывает тип архитектуры используемого процессора. В этом поле может храниться одно из следующих значений:

PROCESSOR_ARCHITECTURE_INTEL;

PROCESSOR_ARCHITECTURE_MIPS;

PROCESSOR_ARCHITECTURE_ALPHA;

PROCESSOR_ARCHITECTURE_PPC.

Поле wReserved не используется.

Поле dwPageSize содержит размер страницы в килобайтах и определяет степень разбиения при защите и фиксации страниц. Например, на компьютерах Intel x86 это значение равно 4 Кб.

В поле lpMinimumApplicationAddress хранится самый младший адрес памяти, доступный для приложений и DLL. Попытка получить доступ к адресу памяти ниже этого значения приведет, вероятнее всего, к нарушению прав доступа.

Поле lpMaximumApplicationAddress содержит самый старший адрес памяти, доступный для приложений и DLL.

Поле dwActiveProcessorMask возвращает маску, представляющую набор процессоров, сконфигурированных в системе. Бит 0 представляет первый процессор, а бит 31 – 32-й. Поскольку Windows 95/98 поддерживает только один процессор, то в данном случае устанавливается лишь бит 0.

Поле dwNumberOfProcessor также возвращает количество процессоров в системе.

Поле dwProcessorType в настоящее время неактуально. Оно составлено для обратной совместимости. Это поле может иметь одно из следующих значений:

PROCESSOR_INTEL_386;

PROCESSOR_INTEL_486;

PROCESSOR_INTEL_PENTIUM;

PROCESSOR_MIPS_R4000;

PROCESSOR_ALPHA_21064.

Под управлением Windows 95/98 возможно только значение PROCESSOR_INTEL_x, в то время как под управлением Windows NT, 2000, XP допустимы все значения.

Поле dwAllocationGranularity возвращает степень разбиения, которая учитывается при распределении памяти. В Windows 95/98 этот параметр имеет фиксированное значение 64 Кб.

Поле wProcessorLevel определяет уровень процессора, зависящий от архитектуры системы. Для процессоров ряда Intel этот параметр может принимать любое из перечисленных ниже значений:

Значение Описание
  Процессор 80386
  Процессор 80486
  Процессор Pentium

Поле wProcessorRevision определяет модификацию процессора, зависящую от архитектуры системы. Подобно полю wProcessorLevel, оно может содержать различные значения для разных процессоров. Для архитектур Intel в этом поле будет записано число в формате xxyy. Для процессоров 386, 486 ряда Intel запись xx + $OA означает уровень модификации, а yy – саму модификацию (например, D300 означает микросхему D0).

Функция GlobalMemoryStatus(…) позволяет динамически отслеживать текущее состояние памяти с помощью параметра TmemoryStatus. Запись TmemoryStatus определяется следующим образом:

typedef struct _MEMORYSTATUS { // mst

DWORD dwLength; // sizeof(MEMORYSTATUS)

DWORD dwMemoryLoad; // percent of memory in use

DWORD dwTotalPhys; // bytes of physical memory

DWORD dwAvailPhys; // free physical memory bytes

DWORD dwTotalPageFile; // bytes of paging file

DWORD dwAvailPageFile; // free bytes of paging file

DWORD dwTotalVirtual; // user bytes of address space

DWORD dwAvailVirtual; // free user bytes

}

Первое поле в этой записи, dwLength, описывает длину записи TMemoryStatus. Необходимо инициализировать это поле значением SizeOf (TMemoryStatus) до вызова функции GlobalMemoryStatus(). Это позволит Windows изменять размер записи в будущих версиях, поскольку она сможет различать версии на основе значения первого поля.

В поле dwMemoryLoad содержится число от 0 до 100, на основании значения которого можно получить общее представление об использовании памяти: 0 означает, что память вообще не используется, а 100 говорит о занятости всей памяти.

Поле dwTotalPhys показывает общее число байтов физической памяти (объем памяти ОЗУ, установленного в компьютере), а поле dwAvailPhys – объем свободной в данный момент физической памяти.

Поле dwTotalPageFile показывает общее число байтов, которые могут быть сохранены на жестком диске в файле подкачки. Это число не совпадает с размером файла подкачки на диске. Поле dwAvailPageFile определяет объем еще доступной памяти из этого общего значения.

Поле dwTotalVirtual показывает общее число байтов виртуальной памяти, используемой в вызывающем процессе, а поле dwAvailVirtual – объем этой памяти, доступной для вызывающего процесса.

Функция VirtualQuery(…) позволяет запрашивать определенную информацию (например, размер, тип памяти, атрибуты защиты) об участке памяти по заданному адресу. Эта функция имеет следующее описание:

DWORD VirtualQuery(

LPCVOID lpAddress, // address of region

PMEMORY_BASIC_INFORMATION lpBuffer, // address of information buffer

DWORD dwLength // size of buffer

);

При вызове VirtualQuery() первый параметр lpAddress должен содержать адрес виртуальной памяти, о котором необходимо получить информацию.

Параметр lpBuffer – адрес структуры MEMORY_BASIC_INFORMATION, которую надо создать перед вызовом функции. Данная структура определена в файле WINNT.H: и имеет следующее описание:

typedef struct _MEMORY_BASIC_INFORMATION { // mbi

PVOID BaseAddress; // base address of region

PVOID AllocationBase; // allocation base address

DWORD AllocationProtect; // initial access protection

DWORD RegionSize; // size, in bytes, of region

DWORD State; // committed, reserved, free

DWORD Protect; // current access protection

DWORD Type; // type of pages

} MEMORY_BASIC_INFORMATION;

Параметр dwLength задает размер структуры MEMORY_BASIC_ INFORMATION. VirtualQuery() возвращает число байт, скопированных в буфер.

Пользуясь адресом, указанным в параметре lpAddress, функция заполняет эту структуру информацией о диапазоне смежных страниц, имеющих одинаковое состояние, атрибуты защиты и тип. Описание элементов структуры приведено в табл.1.

Таблица 1

Элемент Описание
BaseAddress Содержит значение из параметра lpAddress, округленное до адреса, кратного размеру страницы.
AllocationBase Идентифицирует базовый адрес региона, включающий в себя тот адрес, который был указан в параметре lpAddress.
AllocationProtect Идентифицирует атрибут защиты, присвоенный региону при первом его резервировании.
RegionSize Сообщает суммарный размер (в байтах) группы страниц, начинающихся с базового адреса BaseAddress и имеющих те же атрибуты защиты, состояние и тип, что и страница, расположенная по адресу lpAddress.
State Указывает состояние (MEM_FREE, MEM_RESERVE или MEM_COMMIT) всех смежных страниц, имеющих те же атрибуты защиты, состояние и тип, что и страница, расположенная по адресу lpAddress. Если в этом элементе содержится идентификатор MEM_FREE, то элементы AllocationBase, AllocationProtect, Protect и Type не определяются.
Protect Содержит атрибут защиты (PAGE_*), общий для всех смежных страниц, имеющих те же атрибуты защиты, состояние и тип, что и страница, расположенная по адресу lpAddress.
Type Определяет тип физической памяти (MEM_IMAGE, MEM_MAPPED или MEM_PRIVATE), связанной с группой смежных страниц, имеющих те же атрибуты защиты, состояние и тип, что и страница, расположенная по адресу lpAddress. В Windows 95/98 этот элемент всегда соответствует идентификатору MEM_PRIVATE.

Задание для выполнения к части 2 лабораторной работы

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

Const

{Строки информации о системе}

Sproc = 'Processor Arhitecture %s';

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

SPIntel = 'Intel';

SpageSize = 'Page Size $%.8x bytes';

//Размер страницы

SminAddr = 'Minimum Application Address $%p';

//Минимальный адрес приложения

SmaxAddr = 'Maximum Application Address $%p';

//Максимальный адрес приложения

SnumProcs= 'Number of Processor %d';

//Число процессоров

SallocGra = 'Allocation Granuality $%.8x bytes';

//Степень разбиения при выделении ресурсов

SProcLev1 = 'Processor Level %s';

//Уровень процессора

SIntel3 = '80386';

SIntel4 = '80486';

SIntel5 = 'Pentium';

SIntel6 = 'Pentium Pro';

SprocRev = 'Processor Revision %.4x';

//Модификация процессора

{Строки состояния памяти}

SmemUse = 'Memory in use %d%%';

//Используемая память в байтах

StotMem = 'Total physical memory $%.8x bytes';

//Общая физическая память в байтах

SfreeMem = 'Free physical memory $%.8x bytes';

//Свободная физическая память в байтах

StotPage = 'Total page file memory $%.8x bytes';

//Общая память файлов подкачки в байтах

SfreePage = 'Free page file memory $%.8x bytes';

//Свободная память файлов подкачки в байтах

StotVirt = 'Total virtual memory $%.8x bytes';

//Общая виртуальная память в байтах

SfreeVirt = 'Free virtual memory $%.8x bytes';

//Свободная виртуальная память в байтах

 

 

2. Разработать и выполнить приложение Delphi, в котором:

1) с помощью функции GetSystemInfo() получить основную системную информацию об используемой ОС.

В приложение включить следующую процедуру:

{ Процедура получения системной информации }

procedure TForm1.F1Click(Sender: TObject);

Var

si: SYSTEM_INFO; //Информация о системе

Begin

GetSystemInfo(si);

{ Заполнение полей с системной информацией }

Memo1.Lines.Add(Format(SProc, [SPIntel]));

Memo1.Lines.Add(Format(SPageSize, [si.dwPageSize]));

Memo1.Lines.Add(Format(SMinAddr, [si.lpMinimumApplicationAddress]));

Memo1.Lines.Add(Format(SMaxAddr, [si.lpMaximumApplicationAddress]));

Memo1.Lines.Add(Format(SNumProcs, [si.dwNumberOfProcessors]));

Memo1.Lines.Add(Format(SAllocGra, [si.dwAllocationGranularity]));

case si.wProcessorLevel of

3: Memo1.Lines.Add(Format(SProcLev1, [SIntel3]));

4: Memo1.Lines.Add(Format(SProcLev1, [SIntel4]));

5: Memo1.Lines.Add(Format(SProcLev1, [SIntel5]));

6: Memo1.Lines.Add(Format(SProcLev1, [SIntel6]));

else Memo1.Lines.Add(Format(SProcLev1, [IntToStr (si.wProcessorLevel)]));

end;

end;

2) с помощью функции GlobalMemoryStatus() проанализировать текущее состояние адресного пространства.

В приложение включить следующую процедуру:

{ Процедура определения текущего состояния памяти }

procedure TForm1.F2Click(Sender: TObject);

Begin

ms.dwLength:= SizeOf(ms);

GlobalMemoryStatus(ms);

{ Заполнение полей информацией о состоянии памяти }

Memo1.Lines.Add(Format(SMemUse, [ms.dwMemoryLoad]));

Memo1.Lines.Add(Format(STotMem, [ms.dwTotalPhys]));

Memo1.Lines.Add(Format(SFreeMem, [ms.dwAvailPhys]));

Memo1.Lines.Add(Format(STotPage, [ms.dwTotalPageFile]));

Memo1.Lines.Add(Format(SFreePage, [ms.dwAvailPageFile]));

Memo1.Lines.Add(Format(STotVirt, [ms.dwTotalVirtual]));

Memo1.Lines.Add(Format(SFreeVirt, [ms.dwAvailVirtual]))

end;

 

3) с помощью функции VirtualQuery() получить детальную информацию о состоянии виртуального адресного пространства.

Примечание. Параметр lpAddres задать, используя результаты выполнения п.п. 1 и 2.

 

Дополнительные условия.

1) Приложение должно иметь заставку, меню с командами и справочную систему.

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

Часть 3



Поделиться:


Последнее изменение этой страницы: 2017-02-06; просмотров: 691; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.190.217.134 (0.045 с.)