Управление на паметта в 32 разрядна среда
| Информационни технологии | 2009-12-04 | 37 сваляния |
30. Управление на паметта в 32 разрядна среда. Сравнение на Windows95 и WindowsNT: използване на адресните пространства; глобалните данни; Heap и функции за работа с него (GlobalAlloc(), HeapAlloc()); използване на указатели или handle. Големи и малки динамични блокове и средства за менажирането им.
31. Memory-mapped файлове като средство за пестене на ОП и създаване на общи блокове. Избягване на фрагментацията при често алокиране на памет, пестене на пространство от swap файла при работа с инициализирани данни.
Memory mapped file средство за оптимално управление на паметта. Състой се от с асоцииране на файла или част от файл с ОП. Файла или част от файл се асоциира с виртуалното адресно пространство и тогава над него могат да се правят определени операции без да се качва.
HANDLE hFile=::CreateFile(...)//създаваме Handle
HANDLE hMap=::CreateFileMapping(hFile,...);
LPVOID IpvFile=::MapViewoffile(hMap,...);//мапва целия файл
DWORD dwFilesize=::GetFileSize(hFile,...)//използваме файл
::UnmapViewofFile(IpvFile);
::CloseHandle(hMap);
::CloseHandle(hFile);
Два процеса могат да ползват общ hMap т.е. те имат обща памет:
GlobalAlloc(...,GMEM_SHARED...);
В Win32 не прави shared блок, както в Win16. Обща памет, но не общ файл както по горе без CreateFile(...) и с подаване на параметри 0хFFFFFFFF вместо hFile.
GlobalAlloc е наследена в Win16. Тук в 32 битовата среда всъщност не действа , но може да се запише.
Съвет при работа с динамична памет:
- хипът се фрагментира при продължителна работа. Решението е по често да се унищожава и да се създава нов или да се прекомпонира.
- викайте heapmin в NT за освобождаване на големи блокове
- не викайте HeapFree за малки блокове заделени с new.
- стекът вече не е ограничен до 64К и става толкова голям, колкото е необходимо.
Как да пестим пространство от swap файла?
- EXE и DLL файлове не са в swap file те се включват във виртуалното адресно пространство на всеки процес. Добре е и константните данни по някакъв начин да се прикачат към тях, за да не попадат в swap file.
Низове
Ако те са непроменяеми за цялото изпълнение , декларирайте const charmystr[]=my string;
Низът се съхранява заедно с кода в секцията за инициализирани константни данни . тя се съхранява заедно с EXE файла.
В тази секция не можем да слагаме само С++ обекти, създадени чрез конструктор. Например:
const Crect my_rect(0,0,100,100); се поставя в .bss, който се вкарва в swap file и всеки процес има копие на този обект. По лошо е:
const CString my_str(new instance); което води до :
-
поставяне на CString обект в .bss секцията
-
масивът от символите в .data (иниц. неконст. данни )
-
заемане памет за копие на символите за всеки стартиран процес.
Нищо не попада в EXE и всичко харчи памет.
Тагове от реферата: heapalloc, windowsnt, windows95, рядна, полане, остранств, упраение, GlobalAlloc, паметта, среда











