Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Основные системные функции, используемые для работы с памятьюСодержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте В набор системных функций 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 этот параметр может принимать любое из перечисленных ниже значений:
Поле 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
Задание для выполнения к части 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; просмотров: 866; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.156 (0.007 с.) |