Лабораторная работа

Управление памятью в Windows

Категория:

Лабораторная работа

Дисциплина:

Системное программирование

Город:

Беларусь, Минск

Учебное заведение:

БНТУ, ФИТР

Стоимость работы:

2 руб.

Оценка: 10
Объем страниц: 6
Год сдачи: 2021
Дата публикации: 10.02.2021

* Кроме файла с работой, также есть архив с дополнительными файлами.

Описание дополнительных файлов:

Папка 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);
          }
} }
232