Programarea pentru Windows NT

Caracteristici concepute pentru a lucra cu memoria virtuală, pe care le-am considerat mai sus, sunt utilizate în mod obișnuit pentru a fi utilizate în blocuri de memorie de dimensiuni relativ mari (mai mult de o pagină). Cu toate acestea, aplicația necesită doar câteva zeci de bytes în mod frecvent, de exemplu, pentru a crea un structuri dinamice sau pentru a descărca resursele aplicației în memorie. În mod evident, care funcționează cu pagini separate, ai fi cu greu capabil să lucreze ușor și eficient cu blocuri de memorie de volum mic.

Prin urmare, alte caracteristici au fost furnizate în interfața de programare Microsoft Windows NT, la studiul pe care ne întoarcem acum. Toate aceste caracteristici determina pe care le-am discutat doar funcții care operează în memoria virtuală.

Bazine de memorie în Microsoft Windows NT

Așa cum am spus, Microsoft Windows versiunea 3.1 aplicație poate comanda memoria celor două zone sau două bazine - de la un bazin la nivel mondial, care este disponibil pentru toate aplicațiile, și a generat la nivel local pentru fiecare aplicație.

În acest caz, 2 MB de memorie este rezervată pentru piscina standard și imediat după încărcarea aplicației 10 Kbytes de memorie vor fi obținute în timpul utilizării.

În al doilea rând, parametrii unui bazin standard poate fi specificat în fișierul definiția modulului (care este opțională). De exemplu, ca aceasta:

Opțiuni pentru piscinele de memorie

Astfel, disponibilă aplicația Microsoft Windows NT are o piscină standard, și un număr arbitrar de bazine dinamice de memorie.

Ca o primă parmetra toate funcțiile destinate să obțină din memoria standard sau un bazin dinamic, un identificator de piscină care urmează să fie transmis.

Pregătirea identificatorul standard de pool

piscina standard de Identifier obține foarte simplu. Acest identificator este returnat de GetProcessHeap XE „GetProcessHeap“. nu are parametri:

Crearea unui bazin dinamic

Dacă aveți nevoie de o piscină dinamică, o puteți crea folosind HeapCreate XE caracteristici „HeapCreate“:

Parametrii dwMaximumSize dwInitialSize și determină, respectiv, valoarea piscina rezervată a memoriei și a memoriei dimensiunii obținute pentru utilizare.

Prin parametrul flOptions puteți trece o valoare nulă, iar valoarea HEAP_NO_SERIALIZE XE „HEAP_NO_SERIALIZE“ și HEAP_GENERATE_EXCEPTIONS XE „HEAP_GENERATE_EXCEPTIONS“.

Parametrul HEAP_NO_SERIALIZE XE „HEAP_NO_SERIALIZE“ are de a face sarcini multiple, care vor fi discutate într-un capitol separat al acestei cărți. Dacă acest parametru nu este specificat, care rulează în paralel cu sarcinile procesului nu pot avea acces simultan la un astfel de bazin. Puteți utiliza HEAP_NO_SERIALIZE de pavilion pentru a îmbunătăți performanța atunci când ați creat piscina va folosi doar o singură sarcină proces.

Atunci când poate apărea o alocare de memorie din fondul de situații de eroare. Dacă indicatorul nu este specificat HEAP_GENERATE_EXCEPTIONS XE „HEAP_GENERATE_EXCEPTIONS“. sootvtetvuyuschy asupra funcției de eroare se va întoarce NULL. În caz contrar, aplicația va arunca o excepție. HEAP_GENERATE_EXCEPTIONS pavilion este util în cazurile în care cererea dumneavoastră oferă de manipulare excepție, care permite de a corecta eventualele erori.

În caz de succes funcția HeapCreate XE „HeapCreate“ returnează ID-ul de memorie dinamică creată. Pe de eroare, NULL este returnat (sau există o excepție în cazul în care steagul HEAP_GENERATE_EXCEPTIONS specificat).

Eliminarea piscinei dinamice

Pentru a șterge o funcție de memorie dinamică a creat HeapCreate XE „HeapCreate“. ar trebui să utilizați HeapDestroy XE „HeapDestroy“:

Prin această caracteristică, identificatorul parametru numai transmis dinamic piscina de evacuare. Rețineți că nu trebuie să ștergeți piscina implicită, care trece valoarea funcția obținută din funcția GetProcessHeap XE „GetProcessHeap“.

Funcția HeapDestroy XE „HeapDestroy“ realizează o îndepărtare necondiționată a piscinei de stocare, chiar dacă ar fi obținut din blocurile de memorie la momentul scoaterii piscinei, ei nu au fost returnate în sistem.

Prepararea blocului de memorie din piscina

Pentru memoria unui bazin standard sau dinamic aplicație trebuie să utilizeze funcția HeapAlloc XE „HeapAlloc“. un prototip al care le-am dat mai jos:

În ceea ce privește parametrul hHeap, atunci pentru el, puteți utiliza fie identificator piscina de memorie strandartnogo primit de la funcția GetProcessHeap XE „GetProcessHeap“. sau un identificator de piscină dinamic, creat de aplicația folosind funcția HeapCreate XE „HeapCreate“.

Parametrul DwBytes specifică cantitatea de memorie în octeți aplicația dorită.

DwFlags parametru poate fi o combinație dintre următoarele valori:

Memoria alocată este umplut cu zerouri

Modificarea dimensiunii unității de stocare

Cu ajutorul funcției HeapReAlloc XE „HeapReAlloc“ aplicație poate schimba dimensiunea blocului de memorie alocată funcției anterioare HeapAlloc XE „HeapAlloc“. reduce sau măriți-l. Funcția HeapReAlloc prototip este după cum urmează:

Determinarea dimensiunii unității de stocare

În cazul unei erori, această funcție returnează o valoare de 0xFFFFFFFF.

În cazul în care unitatea de memorie utilizează doar o singură sarcină proces, puteți trece prin valoarea parametrului dwFlags HEAP_NO_SERIALIZE XE „HEAP_NO_SERIALIZE“.

eliberându

Memorie alocată folosind HeapAlloc XE caracteristici „HeapAlloc“. Ar trebui să fie eliberat imediat ce nu mai este necesar. Acest lucru trebuie realizat cu ajutorul funcției HeapFree XE „HeapFree“:

În cazul în care unitatea de memorie utilizează doar o singură sarcină proces, puteți trece prin valoarea parametrului dwFlags HEAP_NO_SERIALIZE XE „HEAP_NO_SERIALIZE“.

Dacă dimensiunea blocului de memorie alocată pentru a funcționa HeapAlloc XE „HeapAlloc“. A fost modificată în funcția HeapReAlloc XE „HeapReAlloc“. pentru eliberarea unui astfel de bloc de memorie ar trebui să utilizați în continuare HeapFree XE „HeapFree“.

Utilizarea funcțiilor malloc XE „malloc“ și XE gratuit „liber“

În biblioteca de Microsoft Visual C ++ oferă caracteristici standard, concepute pentru a obține în mod automat și să elibereze de memorie, cum ar fi malloc XE „malloc“ și XE gratuit „liber“.

Avem o veste bună pentru tine - în mediul de Microsoft Windows NT, puteți utiliza aceste funcții cu aceeași eficiență ca și funcții pentru lucrul cu piscine - HeapAlloc XE „HeapAlloc“. HeapFree XE "HeapFree" și așa mai departe. Cu toate acestea, aceste caracteristici sunt doar amintirea unui bazin standard de.

Un avantaj al XE funcțiilor malloc „malloc“ și XE gratuit „liber“ este posibilitatea de utilizare a acestora pe alte platforme, altele decât Microsoft Windows NT.

Vechea Funcția de management al memoriei

În aplicațiile pe 32 de biți, Microsoft Windows NT, vă puteți bucura de multe dintre funcțiile de gestionare a memoriei de operare sistem de versiune Microsoft Windows 3.1, care sunt lăsate în noul sistem de operare pentru compatibilitate. Am examinat în detaliu funcțiile în „Managementul memoriei“, volumul 13 „Biblioteca sistem programator“.

Reamintim că, în interfața de programare 16-biți versiune Microsoft Windows 3.1, există două seturi de funcții (globale și locale), concepute pentru a lucra cu piscina de memorie la nivel mondial și local. Acesta funcționează ca GlobalAlloc XE "GlobalAlloc". LocalAlloc XE "LocalAlloc". GlobalFree XE "GlobalFree". LocalFree XE "LocalFree" și așa mai departe. În aplicațiile Microsoft Windows NT pe 32 de biți, puteți utiliza ambele funcții globale și locale, iar rezultatul va fi exact la fel. Motivul pentru aceasta constă în faptul că toate aceste funcții sunt funcții ale software-ului interfață Microsoft Windows NT, proiectat pentru a lucra cu piscina memorie standard: HeapAlloc XE „HeapAlloc“. HeapReAlloc XE "HeapReAlloc". HeapFree XE "HeapFree" și așa mai departe.

Aici este o listă a vechilor funcții de interfață de programare, aplicațiile Microsoft Windows NT sunt disponibile:

Determinarea de identificare global bloc de memorie (locală)

Vă atragem atenția asupra faptului că, în mediul de versiunea Microsoft Windows 3.1, este posibil să primiți un fix (fix), o memorie plutitoare (mobil) și ieșirea (renunță la ele).

În ceea ce privește o memorie detașabil, acesta poate fi utilizat pentru a stoca date care pot fi ușor de recuperat, de exemplu, prin citirea acestora din resursele de aplicare.