89209

УПРАВЛЕНИЕ ПАМЯТЬЮ В WINDOWS

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

Информатика, кибернетика и программирование

Разработать приложение, которое предоставляет пользователю возможность управлять памятью в Windows, получать системную информацию о состоянии физической и виртуальной памяти, а также управлять выделением и освобождением виртуальной памяти.

Русский

2015-05-10

56.92 KB

4 чел.

9

БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Факультет информационных технологий и робототехники

Кафедра «Программное обеспечение вычислительной техники и автоматизированных систем»

О Т Ч Е Т

по лабораторной работе №3

Дисциплина

«Операционные системы и системное программирование»

Тема

«УПРАВЛЕНИЕ ПАМЯТЬЮ В WINDOWS»

Выполнил: студент гр. 107312 Старовойтов П.С.

Проверил: Разорёнов Н.А.

МИНСК 2015

1. Цель работы

Изучить основы распределения и управления памятью в Windows.

2. Изучаемые вопросы

1. Виртуальное адресное пространство:

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

b. Состояние страниц.

c. Атрибуты защиты.

d. Границы выделения памяти.

e. Регионы в адресном пространстве.

2. Работа с виртуальной памятью:

a. Выделение памяти.

b. Освобождение памяти.

c. Изменение атрибутов защиты.

d. Блокировка физической памяти RAM.

e. Стек потока.

3. Кучи.

4. Стандартные библиотечные функции языка С.

3. Постановка задачи

Разработать приложение, которое предоставляет пользователю возможность управлять памятью в Windows, получать системную информацию о состоянии физической и виртуальной памяти, а также управлять выделением и освобождением виртуальной памяти. В программе предусмотреть использование различных видов памяти:

1. Статически распределяемой.

2. Стековой памяти.

3. Динамически распределяемой памяти.

4. Регионов виртуальной памяти.

4. Ход выполнения работы

Виртуальное адресное пространство:

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

Всем процессам в операционной системе Windows предоставляется важнейший ресурс – виртуальная память (virtual memory). Все данные, с которыми процессы непосредственно работают, хранятся именно в виртуальной памяти. Виртуальное адресное пространство каждого процесса значительно больше всей физической памяти, доступной для всех процессов. Общий объем памяти, доступной для всех исполняемых процессов, является суммой физической памяти и свободного места на диске, доступного для файла подкачки (paging file) – файла на диске, используемого для увеличения объема физической памяти. Реальная физическая память и виртуальное адресное пространство для каждого процесса организованны в страницы (pages) – модули памяти, чей размер зависит от процессора.

 4.2. Состояние страниц.

Страницы виртуального адресного пространства процессов могут находиться в одном из трех состояний:

  1.  свободное (free) – свободная страница в данный момент не доступна, но ей можно передать физическую память или зарезервировать;
  2.  зарезервированное (reserved) – зарезервированная страница – это блок виртуального адресного пространства процесса, который был зарезервирован для более позднего использования.
  3.  фиксированное (committed) – фиксированная страница – это такая страница, для которой выделена физическая память (в ОЗУ или на диске). Она может быть защищена от доступа других процессов, может быть доступна только для чтения или для чтения и записи.

 switch(mbs.State)

  {

   case MEM_COMMIT:

    y+=sprintf(buff+y,"  COMMIT ");break;

   case MEM_FREE:

    y+=sprintf(buff+y," FREE   ");break;

   case MEM_RESERVE:

    y+=sprintf(buff+y,"  RESERVE");break;

   default:

    y+=sprintf(buff+y,"  UNKNOWN");break;

  }

4.3. Атрибуты защиты.

Все процессоры, поддерживаемые Windows, предоставляют ту или иную форму аппаратной защиты памяти (например доступ для чтения и записи, только для чтения и т. д.); конкретные механизмы такой защиты зависят от архитектуры процессора. Скажем, страницы кода в адресном пространстве процесса помечаются атрибутом «только для чтения», что защищает их от изменения пользовательскими потоками. Отдельным страницам физической памяти, выделяемым функцией VirtualAlloc, можно определить атрибуты защиты.

MEMORY_BASIC_INFORMATION mbs;

VirtualQuery(p,&mbs,sizeof(mbs));

switch(mbs.Protect)

{

case PAGE_EXECUTE:

SendDlgItemMessage(hDlg, IDC_RADIO1, BM_SETCHECK,BST_CHECKED, NULL);

break;

}

 

 4.4. Границы выделения памяти.

Граница выделения памяти обуславливаются гранулярностью обращения к памяти через страницы. Так как страница имеет кратность 4Кб, то граница выделения любого региона кратна этому значению. Возможные значения определяются граничными значениями доступных участков.

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

UNREFERENCED_PARAMETER(lParam);

SYSTEM_INFO sys_inf;

MEMORYSTATUS mem_stat;

if (LOWORD(wParam) == IDC_BUTTON1) //globalmemory

{

GlobalMemoryStatus(&mem_stat);

TCHAR szData[512]={0};

_stprintf(szData, TEXT("%d\n%d\n%I64d\n%I64d\n%I64d\n%I64d\n%I64d"),

 mem_stat.dwMemoryLoad,

 mem_stat.dwTotalPhys,

 (__int64) mem_stat.dwAvailPhys,

 (__int64) mem_stat.dwTotalPageFile,

 (__int64) mem_stat.dwAvailPageFile,

 (__int64) mem_stat.dwTotalVirtual,

 (__int64) mem_stat.dwAvailVirtual);

TCHAR szText[512]=TEXT("Memory load: \n TotalPhys: \n AvailPhys: \n TotalPageFile: \n AvailPageFile: \n TotalVirtual: \n AvailVirtual");

 SetDlgItemText(hDlg, IDC_STATIC2, szData);

 SetDlgItemText(hDlg, IDC_STATIC1, szText);

}

}

 4.5. Регионы в адресном пространстве.

Для резервирования региона памяти в адресном пространстве процесса или выделения ее используется функция VirtualAlloc, а для освобождения – функция VirtualFree. Операция выделения региона называется резервированием. При резервировании система обязательно выравнивает начало региона с учетом так называемой гранулярности выделения памяти.

LPVOID VirtualAlloc (

     LPVOID lpAddress, // адрес, по которому надо зарезервировать или выделить память

     DWORD dwSize, // размер выделяемого региона

     DWORD flAllocationType, // тип распределения памяти

     DWORD flProtect // тип защиты доступа

);

p =VirtualAlloc(NULL,4096*number,MEM_COMMIT,PAGE_READWRITE);

BOOL VirtualFree (

                  LPVOID lpAddress, // адрес региона, который надо освободить

                  DWORD dwSize, // размер освобождаемого региона

                  DWORD dwFreeType // тип освобождения

);

if(VirtualFree(p,0,MEM_DECOMMIT))

MessageBoxA(hDlg,"Virtual Free was successful","Success",MB_OK);

Работа с виртуальной памятью:

4.6. Выделение памяти.

Функции для работы с виртуальной памятью манипулируют страницами памяти.

Функция VirtualAlloc выполняет одну из операций:

  1.  резервирует определенное количество страниц;
  2.  передает физическую память зарезервированным страницам;
  3.  резервирует и передает физическую память страницам.

if (LOWORD(wParam) == IDC_BUTTON11)

{   p0=(char*)VirtualAlloc(NULL,16*sys_inf.dwPageSize,MEM_RESERVE,PAGE_READWRITE);

       .   .    .    .      .

VirtualQuery(p,&mbs,sizeof(mbs));  }

 4.7. Освобождение памяти

Функция VirtualFree выполняет одну из операций:

  1.  возврат физической памяти;
  2.  освобождение региона.

BOOL VirtualFree (

LPVOID lpAddress, // адрес региона, который надо освободить

DWORD dwSize, // размер освобождаемого региона

DWORD dwFreeType // тип освобождения

);

 if (LOWORD(wParam) == IDC_BUTTON3)  //virtualfree

   {

 if(VirtualFree(p,0,MEM_DECOMMIT))

    MessageBoxA(hDlg,"Virtual Free was successful","Success",MB_OK);

 else

    MessageBoxA(hDlg,"Can't free memory","Error",MB_OK);

  }

4.8. Изменение атрибутов защиты.

VirtualProtect позволяет изменять атрибуты защиты в адресном пространстве текущего процесса.

BOOL VirtualProtect (

LPVOID lpAddress, // адрес региона для установки флага

DWORD dwSize, // размер региона

DWORD flNewProtect, //новый атрибут защиты

PDWORD lpflOldProtect // адрес для сохранения старых флагов

);

if( !VirtualProtect(p1,5*4096,PAGE_NOACCESS,NULL);

4.9. Блокировка физической памяти RAM.

Функция VirtualLock заблокирует в оперативной памяти блок.

BOOL VirtualLock (

LPVOID lpAddress, // адрес начала памяти

SIZE_T dwSize // количество байтов

);

  if (LOWORD(wParam) == IDC_BUTTON5)//virtuallock

 {

     if(VirtualLock(p,4000))

    MessageBoxA(NULL,"Successfull VirtualLock!","Success",MB_OK);

 }

Если фиксация больше не нужна, то ее можно убрать функцией VirtualUnlock().

BOOL VirtualUnlock (

LPVOID lpAddress, // адрес начала памяти

SIZE_T dwSize // количество байтов

);

if (LOWORD(wParam) == IDC_BUTTON6)//virtualunlock

 {

     if(VirtualUnlock(p,4000))

     MessageBoxA(NULL,"Successfull VirtualUnLock!","Success",MB_OK);

            }

4.10. Стек потока.

Каждый новый поток получает свое собственное пространство стека, состоящее, и из виртуальной памяти в файле подкачки, и зарезервированной памяти. Система помещает одностраничные блоки из зарезервированной памяти стека, как требуется, до тех пор, пока стек не сможет больше расти. По умолчанию система резервирует 1Мбайт адресного пространства и передает ему 2 страницы физической памяти. Регион стека и вся физическая память, переданная ему, имеют атрибут защиты PAGE_READWRITE.

4.11. Кучи.

Куча (heap) представляет собой часть памяти, зарезервированную для программы для использования в качестве временного запоминающего устройства для структур данных, чей размер не может быть определен, пока программа не запущена. Функции работы с кучей позволяют процессу создавать свою собственную кучу. Далее процесс может использовать ряд функций для управления памятью кучи.

Функция HeapCreate создает объект собственной кучи.

HANDLE HeapCreate(  

 DWORD flOptions,  // атрибуты

 SIZE_T dwInitialSize, // начальный размер

 SIZE_T dwMaximumSize // конечный размер

);

Атрибутов всего два:

  1.  HEAP_GENERATE_EXCEPTIONS - Говорит о том, что в случае ошибки нужно генерировать структурную исключительную ситуацию вместо возврата NULL.
  2.  HEAP_NO_SERIALIZE - указатель на то, что куча не должна синхронизировать доступ.

hHeap_fam=HeapCreate(HEAP_NO_SERIALIZE,sys_inf.dwPageSize,5*sys_inf.dwPageSize);

Функция удаления кучи HeapDestroy:

BOOL HeapDestroy

(  

 HANDLE hHeap // указатель на кучу

);

   if(HeapDestroy(hHeap))

    MessageBoxA(NULL,"Heap is destroyed!","Success",MB_OK);

Создав кучу, есть возможность выделить в ней память.

LPVOID HeapAlloc

(  

 HANDLE hHeap, // указатель на кучу где можно выделить память

 DWORD dwFlags, // флаги

 SIZE_T dwBytes // обьем выделяемой памяти

);

Флаги могут быть следующие:

  1.  HEAP_GENERATE_ EXCEPTIONS - при ошибке будет исключение вместо NULL
  2.  HEAP_NO_SERIALIZE - доступ доложен быть не синхронизированный
  3.  HEAP_ZERO_MEMORY - установить содержимое выделяемой памяти в 0

p_heap=(char*)HeapAlloc(hHeap_fam,HEAP_NO_SERIALIZE,sys_inf.dwPageSize);

Для освобождения памяти используется функция HeapFree:

BOOL HeapFree

(  

 HANDLE hHeap, // указатель на кучу

 DWORD dwFlags, // флаги  

 LPVOID lpMem // указатель на память

);

if(HeapFree(hHeap,0,p))

MessageBoxA(NULL,"Heap is free!","Success",MB_OK);

 4.12. Стандартные библиотечные функции языка С.

Win32 приложения могут благополучно использовать возможности управления памятью библиотеки программ этапа исполнения языка Си (malloc, free и т.д.) и Си++ (new, delete и т.д.). Cистема вольна управлять памятью, перемещая страницы физической памяти без задействования виртуальных адресов. В связи с этим различие между ближними (near) и дальними (far) указателями больше не важно. Можно использовать стандартные библиотечные средства работы с памятью. При этом Win32 функции управления памятью предоставляют больше функциональных возможностей.

  1.  Результаты работы программного обеспечения

Рис 1.Результат работы программы

Выводы:

  1.  Функция HeapCreate создает объект собственной кучи.
  2.  Всем процессам в операционной системе Windows предоставляется важнейший ресурс – виртуальная память.
  3.  Для резервирования региона памяти в адресном пространстве процесса используется функция VirtualAlloc.
  4.  Функция VirtualProtect позволяет изменять атрибуты защиты в адресном пространстве текущего процесса.

 

А также другие работы, которые могут Вас заинтересовать

64738. Воруем изображение с помощью плат видеозахвата 394.5 KB
  Рано или поздно счастливый обладатель видеокамеры в своем стремлении к самовыражению посредством видео сталкивается с проблемой превращения отснятого им видеоматериала в законченный фильм.
64741. Методика профессионального обучения (МПО) как учебный предмет 755 KB
  Частные методики это методики с предметной направленностью например методика обучения физики или математике. В учебном процессе есть элементы которые относятся к группе профессий или не имеют предметной направленности такие элементы характерны для общих методик обучения.
64742. ИСТОРИЯ ВОЕННОЙ МЕДИЦИНЫ И ФАРМАЦИИ В РУССКОЙ АРМИИИ 332.5 KB
  Различия в понимании специфики военно-медицинской деятельности в дореволюционный и советский периоды развития российской военной системы. Основные источники по истории военной медицины и фармации в русской армии.
64744. КУРС ЛЕКЦІЙ З ДИСЦИПЛІНИ «ІСТОРІЯ УКРАЇНИ» 881.5 KB
  Якщо мати на увазі історію нашої країни то предметом курсу історії України є вивчення розвитку людського суспільства на українських землях з найдавніших часів, тобто з часу появи людини і до наших днів.
64745. ФИЗИЧЕСКАЯ КУЛЬТУРА. КУРС ЛЕКЦИЙ 992 KB
  Физкультурное физкультурно-спортивное движение форма социального движения целью которого является содействие повышению уровня физической культуры населения целенаправленной деятельности государственных и общественных организаций граждан...