Know-how, prelegere, introducere

Heap regiune

Heap este o regiune rezervată cu o dimensiune a uneia sau mai multor pagini, care este recomandată pentru stocarea multor bucăți de date mici. Spre deosebire de funcția VirtualAlloc, regulile de granularitate pentru alocarea memoriei nu sunt necesare.







Transferul de memorie în grămezi, precum și luarea în considerare a memoriei libere și ocupate în morman este tratată de un administrator de heap special. Această activitate nu este documentată.

O grămadă de proces standard de 1 MB (această valoare poate fi modificată) este rezervată atunci când procesul este creat. De obicei, heapul modifică în mod dinamic mărimea sa (steagul se poate dezvolta). Gropul de proces standard nu este doar aplicații, ci unele funcții Win32. Pentru a utiliza halda standard, trebuie să obțineți mânerul folosind funcția GetProcessHeap.

Dacă se dorește, procesul poate genera grămezi suplimentari utilizând funcția HeapCreate (operația inversă HeapDestroy). Aplicația alocă memoria pe heap folosind funcția HeapAlloc. dar îl eliberează cu HeapFree.

Deoarece grămezile pot fi utilizate de toate firele de proces, sincronizarea (flagul SERIALIZE) este organizată în mod implicit, care, deși nu este recomandată, poate fi anulată pentru a îmbunătăți performanța. Sarcina de a sincroniza accesul thread-ului la heap poate fi de asemenea rezolvată prin crearea fiecărui fir propriu-zis.

Rularea programului de alocare a memoriei în heapul standard

În programul de mai sus, matricea de memorie este alocată în heapul standard al procesului. Apoi, acolo este scris un șir de text, care este afișat pe ecran. Dacă există o situație de depășire a memoriei alocate, care este ușor de simulat, creșterea valorii parametrului Shift. - apare o eroare de execuție.

Ca exercițiu independent, puteți recomanda monitorizarea acumulării volumului transferat în heapul de memorie cu ajutorul contoarelor de performanță. Cantitatea de memorie virtuală a procesului ar trebui să înceapă să crească în cazul depășirii dimensiunii inițiale a heapului (1 MB) și atunci când se formează grămezi suplimentari.

Regiunea de stive de flux. Vizionați paginile

Când creați un flux pentru dimensiunea sa stivă rezervate regiunii 1MB (implicit), și a fost transferat la 2 pagini de memorie (acești parametri pot fi modificate). Pagina de jos este garda. De îndată ce pagina de sus a fost umplut, și a existat un apel la pagina de jos este văzută o regiune de sistem și transferat o altă pagină, acum devine un câine de pază. Din cauza acestei tactici este regiunea inferioară stiva pagini transmise este întotdeauna un gardian și sarcina sa - pentru a semnala sistemului că stiva de memorie volum de date trebuie să fie crescută.







Rularea unui program care simulează accesul la supraveghetori

În programul de mai sus, memoria este transferată în regiune și pavilionul PAGE_GUARD este setat pentru paginile sale. În plus, este utilizată manipularea structurată a excepțiilor. Dacă se face o încercare de a scrie un șir de text pentru watchdog (în blocul try), se produce o excepție în situația excepției 0x80000001. Când încercați să scrieți pe această pagină (cu excepția), această situație nu mai survine.

Scrierea, compilarea și rularea unui program care simulează creșterea stivei folosind mecanismul de supraveghere

Ca exercițiu independent se recomandă să scrieți un program în care pagina de gardă să fie întotdeauna pe marginea fragmentului memoriei transferate. În cazul accesării paginii de gardă, cantitatea de memorie transferată în proces trebuie mărită și pagina de gardă mutată.

Regiunea fișierului afișată în memorie

Tehnica fișierelor proiectate în memorie (a se vedea Figura 9.4) este utilizată activ de ultimul sistem de operare. Acesta permite utilizatorului să rezolve sarcini, cum ar fi lucrul cu datele fișierelor, utilizând operațiile de copiere și octeții în mișcare în memorie sau prin partajarea accesului în zonele de memorie. Acest mecanism este de asemenea utilizat în mod activ de sistemul de operare însuși, de exemplu, pentru a încărca executabile în memorie, biblioteci dinamice și pentru a afișa fișierul în memoria cache pentru operațiile I / O standard.

Pentru a afișa fișierul în memorie, utilizați funcția CreateFileMapping. și pentru a obține un pointer în zona afișată - funcția MapViewOfFile. Execuția cu succes a ambelor operațiuni permite programului de aplicații să lucreze cu acest domeniu ca și cu orice alt fragment al memoriei alocate, în special pentru a-și schimba conținutul. În acest context, apare problema corespondenței (coerenței) conținutului regiunii și a fișierului de pe disc. Sistemul de operare încearcă să asigure coerența, dar utilizatorul are capacitatea de a reseta oricând conținutul memoriei pe disc folosind funcția FlushViewOfFile.

Rularea unui program care afișează un fișier în memorie

Programul de mai sus demonstrează etapele de creare a unui fișier, proiectarea acestuia în memorie, modificarea conținutului său și afișarea acestuia pe un disc.

Scrierea, compilarea și rularea unui program care demonstrează diferite aspecte ale proiectării unui fișier în memorie

Pe baza programului anterior, se recomandă să se scrie un program pentru afișarea unui fișier în memorie, cu descărcarea fișierului intermediar pe disc folosind funcția FlushViewOfFile. Luați în considerare diferitele opțiuni pentru existența fișierului și dimensiunile sale înainte și după afișare.

Soluția pentru sarcina de acces la memoria partajată va fi prezentată mai jos.

concluzie







Articole similare

Trimiteți-le prietenilor: