Мета роботи

Вивчити функції для роботи з віртуальною та фізичною пам'яттю.

 

6.2 Підготовка до роботи

При підготовці до роботи вивчити класи функцій для роботи з пам'яттю WINAPI:

- інформаційні;

- функції керування віртуальною та фізичною пам'яттю;

- відображення файлів на пам'ять;

- функції керування кучою

6.2.1 Інформаційні функції

6.2.1.1 Функція GetSystemInfo

Використовується для визначення системної інформації, а саме інформації по процесору та пам'яті

void WINAPI GetSystemInfo(LPSYSTEM_INFO lpSystemInfo);

де:

typedef struct _SYSTEM_INFO {

union {

DWORD dwOemId;

struct {

WORD wProcessorArchitecture;

WORD wReserved;

};

};

DWORD dwPageSize;

LPVOID lpMinimumApplicationAddress;

LPVOID lpMaximumApplicationAddress;

DWORD_PTR dwActiveProcessorMask;

DWORD dwNumberOfProcessors;

DWORD dwProcessorType;

DWORD dwAllocationGranularity;

WORD wProcessorLevel; WORD wProcessorRevision;

} SYSTEM_INFO;

 

Поля, які повязані з памяттю, виділені.

 

6.2.1.2 Функція GlobalMemoryStatusEx

Визначає стан усіх типів пам’яті, а саме. скільки є всього, скільки доступно, і який процент зайнято

BOOL WINAPI GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer);

Структура MEMORYSTATUSEX:

typedef struct _MEMORYSTATUSEX {

DWORD dwLength;

DWORD dwMemoryLoad;

DWORDLONG ullTotalPhys;

DWORDLONG ullAvailPhys;

DWORDLONG ullTotalPageFile;

DWORDLONG ullAvailPageFile;

DWORDLONG ullTotalVirtual;

DWORDLONG ullAvailVirtual;

DWORDLONG ullAvailExtendedVirtual;

} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;

В цій структурі поле dwLength означає розмір структури з даними, його треба задати перед викликом функції GlobalMemoryStatusEx

 

6.2.1.3 Функція VirtualQueryEx

Визначає стан адресного простору для заданого процесу

SIZE_T WINAPI VirtualQueryEx(

HANDLE hProcess,

LPCVOID lpAddress,

PMEMORY_BASIC_INFORMATION lpBuffer,

SIZE_T dwLength

);

Де:

HANDLE hProcess – дескриптор процесу, для поточноог процесу можна використовувати функції GetCurrentProcess

LPCVOID lpAddress – адреса памяті, стан якої аналізується;

MEMORY_BASIC_INFORMATION lpBuffer – структура, куди записується результати аналізу;

SIZE_T dwLength – розмір структури з результатами.

Структура 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 – адреса початку регіону;

AllocationProtect – права доступу, які призначені при виділенні пам’яті, задаються константами:

PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_EXECUTE_WRITECOPY, PAGE_NOACCESS, PAGE_READONLY, PAGE_READWRITE, PAGE_WRITECOPY

RegionSize – розмір регіону;

State, стан регіону, задається константами:

MEM_COMMIT – фізична пам’ять;

MEM_RESERVE – віртуальна пам’ять;

MEM_FREE – вільна пам’ять;

Protect – реальні права доступу, задаються як для поля AllocationProtect.;

Type – задається константами:

MEM_IMAGE MEM_MAPPED MEM_PRIVATE

 

6.2.2 Функції для керування віртуальною та фізичною пам’яттю

6.2.2.1 Функція VirtualAllocEx

Використовується для виділення памяті заданого типу або перепризначення типу пам’яті

LPVOID WINAPI VirtualAllocEx(

__in HANDLE hProcess,

__in LPVOID lpAddress,

__in SIZE_T dwSize,

__in DWORD flAllocationType,

__in DWORD flProtect

);

Де:

hProcess – дескриптор процесу;

lpAddress – адреса пам'яті, якщо змінюється її тип, 0 якщо пам'ять виділяється:

dwSize – потрібний розмір (байт);

flAllocationType – тип пам'яті; задається константами:

MEM_COMMIT; MEM_RESERVE; MEM_RESET

flProtect – способ доступу, задається константами:

PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_EXECUTE_WRITECOPY, PAGE_NOACCESS, PAGE_READONLY, PAGE_READWRITE, PAGE_WRITECOPY

6.2.2.2 Функція VirtualFree

BOOL WINAPI VirtualFreeEx(

__in HANDLE hProcess,

__in LPVOID lpAddress,

__in SIZE_T dwSize,

__in DWORD dwFreeType

);

Де:

hProcess – дескриптор процесу;

lpAddress – адреса пам'яті, що визволяється;

dwSize – розмір пам'яті, 0. якщо уся пам'ять.

dwFreeType – тип визволення, задається константами:

MEM_DECOMMIT MEM_RELEASE

 

6.2.2.3 Функція VirtualProtectEx

Використовується, якщо треба змінити рівень доступу до памяті, який було призначено при виділенні. Можно змінити рівень доступу не для всього, а для частини виділеного регіону.

BOOL WINAPI VirtualProtectEx(

__in HANDLE hProcess,

__in LPVOID lpAddress,

__in SIZE_T dwSize,

__in DWORD flNewProtect,

__out PDWORD lpflOldProtect

);

Де:

hProcess – дескриптор процесу;

lpAddress – адреса

dwSize – розмір;

flNewProtect – новий рівень доступу;

lpflOldProtect – старий рівень доступу.

 

6.2.2.4 Функція VirtualLock і VirtualUnlock

Призначеня для запобіганння запису критичних даних на диск .

BOOL WINAPI VirtualLock(

__in LPVOID lpAddress,

__in SIZE_T dwSize

);

 

BOOL WINAPI VirtualUnlock(

__in LPVOID lpAddress,

__in SIZE_T dwSize

);

6.2.3 Функції для відображення файлів на пам'ять

Використовуються, якщо необхідно:

1 записи файлу обробляти в довільному порядку;

2 Один і той же файл використовується різними програмами

3 Декілька програм використовують загальну пам'ять

6.2.3.1 Функція CreateFile

Використовується для отримання інформації про файл, а саме, де розташован, які права доступу, розмір

6.2.3.2 Функція CreateFileMapping

Використовується для виділення віртуальної пам'яті (побудови відповідних записів в катадлзі та таблицях сторінок)

HANDLE WINAPI CreateFileMapping(

__in HANDLE hFile,

__in LPSECURITY_ATTRIBUTES lpAttributes,

__in DWORD flProtect,

__in DWORD dwMaximumSizeHigh,

__in DWORD dwMaximumSizeLow,

__in LPCTSTR lpName

);

Де:

hFile – дескриптор відповідного файлу, якщо виділяється загальна пам'ять, то задається INVALID_HANDLE_VALUE;

lpAttributes – параметри безпеки (0);

flProtect – режим доступу, задається константами

PAGE_READONLY, PAGE_READWRITE, PAGE_WRITECOPY

PAGE_EXECUTE_READ PAGE_EXECUTE_READWRITE

 

dwMaximumSizeHigh, dwMaximumSizeLow – максимальний розмір, для якого треба виділяти віртуальну пам'ять.

lpName – ім'я віжповідного об'єкту ядра.

 

6.2.3.3 Функція MapViewOfFile

Выполняется выделение физической памяти и чтение файла в эту память.

LPVOID WINAPI MapViewOfFileEx(

__in HANDLE hFileMappingObject,

__in DWORD dwDesiredAccess,

__in DWORD dwFileOffsetHigh,

__in DWORD dwFileOffsetLow,

__in SIZE_T dwNumberOfBytesToMap,

__in LPVOID lpBaseAddress

);

Де:

hFileMappingObject – дескриптор відображеного обєкту;

dwDesiredAccess – режим доступу до памяті, задається константами:

FILE_MAP_ALL_ACCESS FILE_MAP_COPY

FILE_MAP_EXECUTE FILE_MAP_READ FILE_MAP_WRITE

dwFileOffsetHigh, dwFileOffsetLow – зміщення по відношенню до початку файлу;

dwNumberOfBytesToMap – кількість байтів, які треба відобразити;

lpBaseAddress – адреса памяті, яку використовувати для відображення (краще 0!!!)

Після цієї функції можна використовувади дані з памяті

 

6.2.3.4 Функція UnmapViewOfFile

Визволяє фізичну пам'ять

BOOL WINAPI UnmapViewOfFile(LPCVOID lpBaseAddress);

lpBaseAddress – адреса, яку повернула функція MapViewOfFileEx

 

6.2.3.5 Функція CloseHandle

BOOL WINAPI CloseHandle( HANDLE hObject);

hObject – дескриптор

Функцію треба викликати для дескриптора – відображення та дескриптору файлу, якщо функція CreateFile використовувалась

 

6.3 Завдання до лабораторної роботи

У даній лабораторній роботі необхідно виконати наступне:

1. скласти програму для формування системної інформації про віртуальну пам'ять і пояснити отримані результати;

2. виділити пам'ять деякого розміру й визначити новий стан системної інформації, пояснити результати;

3. переробити програму для поштової скриньки з використанням відображення файлу на пам'ять ;

 

6.4 Зміст звіту

- повний опис функцій для роботи з пам'яттю, що були використані у лабораторній роботі;

- тексти програми

- пояснення отриманих результатів;

- висновки.

 

6.5 Контрольні питання й завдання

1. Дайте визначення різних типів пам'яті.

2. Поясните дії, необхідні для виділення пам'яті з погляду програміста і операційної системи.

3. Яка інформація про пам'ять може бути отримана і де використовується ця інформація?

5. Які атрибути можуть бути задані для сторінок?

6. Чим визначається максимальний розмір фізичної пам'яті, що може бути виділений однією операцією виділення?

7. Яким образом пам'ять звільняється?

8. Що буде, якщо:

- програміст забув звільнити пам'ять?

- у зв'язку з аварійним завершенням програми вона не дійшла до коду звільнення?

9. Що буде, якщо не передбачена перевірка благополучності виділення пам'яті і використовується фактично невиділена пам'ять?

10. Що буде, якщо використовується більший обсяг пам'яті, чим виділено?

7 ПЛАНУВАННЯ ПРОЦЕСІВ