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 позволяет изменять атрибуты защиты в адресном пространстве текущего процесса.

 

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

18140. Методы стыковки световода с источником излучения (прямая стыковка, применение фоконов) 214.29 KB
  Лекция 6. Методы стыковки световода с источником излучения прямая стыковка применение фоконов Существенный вклад в потери излучения вносит несоответствие параметров излучателя и входных характеристик световода. Основными факторами определяющими потери явля
18141. Ввод излучения в световод с применением микролинз, градиентных и сферических линз 441.39 KB
  Лекция 7. Ввод излучения в световод с применением микролинз градиентных и сферических линз Согласующие устройства с применением микролинз В качестве микролинз в устройствах ввода излучения применяют полусферы и сферы. Схема устройства ввода излучения в световод с
18142. Ввод излучения в световод различными композициями линз. Потери излучения при соединении световодов 346.36 KB
  Лекция 8. Ввод излучения в световод различными композициями линз. Потери излучения при соединении световодов. Расчет длины регенерационного участка. Схема использования двух сферических линз для ввода излучения в световод показана на рисуснке 8.1. Рис. 8.1. Схема ис...
18143. Оценка взаимных влияний световода в оптических кабелях 214.79 KB
  Лекция 10. Оценка взаимных влияний световода в оптических кабелях. Определение помехозащищенности световода. Надежность ВОЛС. Даже при соблюдении явления ПВО часть энергии переходит из сердечника в оболочку световода. Эта энергия уменьшается по экспоненциальному з...
18144. Принципы построения ВОЛС 385.61 KB
  Лекция 11. Принципы построения ВОЛС Для любой ВОЛС большое значение имеют 3 фактора: информационная емкость системы которая определяется числом каналов связи и скоростью передачи информации; затухание сигнала определяющее максимальную длину ВОЛС без ретра...
18145. Методы расчета чувствительности приемного оптического модуля (ПРОМ) 196.27 KB
  Лекция 12. Методы расчета чувствительности приемного оптического модуля ПРОМ Приемный оптический модуль включает: фотодиод pin или лавинный фотодиод; предварительный усилитель; блок автоматической регулировки усиления. Малошумящий усилитель вып...
18146. Принципы действия волоконно-оптических датчиков (ВОД) физических величин 1.24 MB
  Лекция 13. Принципы действия волоконнооптических датчиков ВОД физических величин. ВОД делятся на два типа: датчики в которых волокно используется в качестве линий передачи сигнала; датчики в которых волокно является чувствительным элементом. Датчик
18147. Способы компенсации дрейфа ВОД 2.6 MB
  Лекция 14. Способы компенсации дрейфа ВОД. ВОД для измерения механических величин Недостатком ВОД является дрейф нуля. Известны следующие способы компенсации дрейфа нуля: преобразование переменного тока в постоянный рис.14.1 а. При этом переменная сост
18148. Датчики для измерения электрических величин 2.22 MB
  Лекция 15. Датчики для измерения электрических величин. ВОД с волокном в качестве чувствительного элемента Датчик магнитного поля на основе эффекта Фарадея Схема датчика магнитного поля на основе эффекта Фарадея показана на рис.15.1. Рис.15.1. Схема датчика магнитн...