Лабораторная работа
Управление памятью в Windows. C++
Категория: | Лабораторная работа |
Дисциплина: | Системное программирование |
Город: | Беларусь, Минск |
Учебное заведение: | БНТУ, ФИТР |
Тег: | #Системное_программирование |
Стоимость работы: | 9 руб. |
Оценка: | 10 |
Объем страниц: | 6 |
Год сдачи: | 2022 |
Дата публикации: | 14.06.2022 |
* Кроме файла с работой, также есть архив с дополнительными файлами.
Описание дополнительных файлов:
Папка LW-2 — содержит исходный код программы на языке C++
Фрагменты для ознакомления
Лабораторная работа № 2
УПРАВЛЕНИЕ ПАМЯТЬЮ В WINDOWS
Вариант 06
Цель работы:
Изучить основы распределения и управления памятью в Windows.
Изучаемые вопросы:
1. Виртуальное адресное пространство:
a. Виртуальное адресное пространство и физическая память.
b. Состояние страниц.
c. Атрибуты защиты.
d. Границы выделения памяти.
e. Регионы в адресном пространстве.
2. Работа с виртуальной памятью:
a. Выделение памяти.
b. Освобождение памяти.
c. Изменение атрибутов защиты.
d. Блокировка физической памяти RAM.
e. Стек потока.
3. Кучи.
4. Стандартные библиотечные функции языка С.
Постановка задачи:
Разработать приложение, которое предоставляет пользователю возможность управлять памятью в Windows, получать системную информацию о состоянии физической и виртуальной памяти, а также управлять выделением и освобождением виртуальной памяти.
В программе предусмотреть использование различных видов памяти:
1. Статически распределяемой.
2. Стековой памяти.
3. Динамически распределяемой памяти.
4. Регионов виртуальной памяти.
Ход выполнения работы:
4.1. Виртуальное адресное пространство.
A) Виртуальное адресное пространство и физическая память.
MEMORYSTATUSEX msEx = { sizeof(msEx) };
GlobalMemoryStatusEx(&msEx);
_i64tow_s(msEx.ullTotalPhys, szData, SZBUF, 10);
SetWindowText(GetDlgItem(hDlg, IDC_EDIT6), szData);
_i64tow_s(msEx.ullAvailPhys, szData, SZBUF, 10);
SetWindowText(GetDlgItem(hDlg, IDC_EDIT7), szData);
_i64tow_s(msEx.ullTotalVirtual, szData, SZBUF, 10);
SetWindowText(GetDlgItem(hDlg, IDC_EDIT10), szData);
_i64tow_s(msEx.ullAvailVirtual, szData, SZBUF, 10);
SetWindowText(GetDlgItem(hDlg, IDC_EDIT11), szData);
B) Состояние страниц.
VirtualQuery(pMemory,&mbi,sizeof(MEMORY_BASIC_INFORMATION));
switch(mbi.State)
{
case MEM_COMMIT:
str=str+"COMMIT";
str=str+"\r\n";
break;
case MEM_FREE:
str=str+"FREE";
str=str+"\r\n";
break;
case MEM_RESERVE:
str=str+"RESERVE";
str=str+"\r\n";
break;
default:
str=str+"OTHER";
str=str+"\r\n";
break;
}
C) Атрибуты защиты.
VirtualProtect(pMemory, si.dwPageSize, PAGE_NOACCESS, NULL);
pMemory1=(char*)VirtualAlloc(NULL,si.dwPageSize*size,MEM_RESERVE,OF_READWRITE);
pMemory=(char*)VirtualAlloc(pMemory1+si.dwPageSize,si.dwPageSize*size1,MEM_COMMIT,PAGE_READWRITE);
D) Границы выделения памяти.
SYSTEM_INFO systemInfo = { 0 };
TCHAR szBuf[SZBUF] = { 0 };
GetSystemInfo(&systemInfo);
_i64tow_s(systemInfo.dwPageSize, szBuf, SZBUF, 10);
SetWindowText(GetDlgItem(hDlg, IDC_EDIT1), szBuf);
_stprintf_s(szBuf, TEXT("%p"), systemInfo.lpMinimumApplicationAddress);
SetWindowText(GetDlgItem(hDlg, IDC_EDIT2), szBuf);
_stprintf_s(szBuf, TEXT("%p"), systemInfo.lpMaximumApplicationAddress);
SetWindowText(GetDlgItem(hDlg, IDC_EDIT3), szBuf);
E) Регионы в адресном пространстве.

4.2. Работа с виртуальной памятью.
A) Выделение памяти.
Для резервирования региона с одновременной передачей физической памяти или запроса к системе подобрать свободное место в верхней части адресного пространства процесса использовал VirtualAlloc:
UINT64 pvAddress;
TCHAR *pv = (TCHAR *)VirtualAlloc((void *)pvAddress, dwSize, MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE);
B) Освобождение памяти.
Для возврата всей физической памяти использовал вызов функции:
flag = VirtualFree((LPVOID)pvAddress, 0, MEM_RELEASE);
Для возврата части физической памяти использовал вызов функции:
flag = VirtualFree((LPVOID)pvAddress, dwSize, MEM_DECOMMIT);
C) Изменение атрибутов защиты.
if (!VirtualProtect(pvAddress, dwSize, dwProtect, &dwoldProtect))
{
MessageBox(hDlg, TEXT("Не удалось изменить атрибуты защиты"), TEXT("Ошибка"), MB_OK);
}
else
{
MEMORY_BASIC_INFORMATION mbi;
dwLen = sizeof(MEMORY_BASIC_INFORMATION);
TCHAR szData[SZBUF];
VirtualQueryEx(GetCurrentProcess(), pvAddress, &mbi, dwLen);
_stprintf_s(szData, TEXT("%s"), TEXT("Текущия защита памяти: "));
getProtect(mbi.Protect, szData);
SendDlgItemMessage(hDlg, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)szData);
}
D) Блокировка физической памяти:
VirtualLock(mbi.BaseAddress, dwSize);
5. Кучи.
Создание Кучи
hHeap=HeapCreate(0,size,size);
if (hHeap != NULL)
{
MessageBox(NULL,"Куча создана","Успешно",NULL);
}
else
{
MessageBox(NULL,"Куча не создана","Ошибка",NULL);
}
Выделение памяти в куче:
GetDlgItemText(hDlg2,IDC_EDIT2,buf,5);
size1=atoi(buf);
lpHeap1=(char*)HeapAlloc(hHeap,0,size1);
if(lpHeap1!=NULL)
{
MessageBox(NULL,"Память выделена","Успешно",NULL);
}
else
{
MessageBox(NULL,"Память не выделена","Ошибка",NULL);
}
Освобождение памяти в куче
if(HeapFree(hHeap,0,lpHeap1)==NULL)
{
MessageBox(NULL,"Ошибка освобождения кучи","Ошибка",NULL);
}
else
{
MessageBox(NULL,"Куча освобождена","Ок",NULL);
}
Уничтожение кучи
if(hHeap!=NULL)
{
if(HeapDestroy(hHeap)!=NULL)
{
MessageBox(NULL,"Куча успешно уничтожена","ОК",NULL);
hHeap=NULL;
}
else
{
MessageBox(NULL,"Куча не уничтожена","Ошибка",NULL);
}
} }