Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 754; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.142.201.93 (0.01 с.) |