Delphi memória menedzser

Delphi memória menedzser

Miért is? Végtére is, úgy tűnik, működik jelenleg, és fut, miért érintse meg? Szükséges, hogy több okból is. Először is, soha nem fáj, elemzés mások kódját, különösen akkor, ha az illetékes kódot. Ez egy lehetőség, hogy valami újat tanulni, és kap az esztétikai élvezet. Másodszor, nem felesleges mélyebb megérteni valamit, ellenőrizze, hogy ezek a dolgok, amelyek még nem biztosította, vagy fordítva, hogy megtalálják hiányosságokat, amelyek korábban nem tudta, hogy a jövőben, hogy írjon hatékonyabb kódot .

Ahhoz, hogy megértsük a Delphi memória menedzser feladata lesz szüksége tudás elveinek virtuális memóriát a Windows, valamint annak megértését, hogy az elvek a négy funkció: VirtualAlloc, VirtualFree, LocalAlloc és LocalFree. Ez az információ túlmutat ezt a cikket, és lehet beszerezni akár a könyv Jeffrey Richter, a „Windows-szakemberek számára, 4. kiadás” vagy MSDN.

Először is, egyetértünk a jelentését a kifejezések. A fő zavar abból a tényből fakad, hogy a Delphi memória menedzser maga szolgáltatásait használja kezelője a Windows a virtuális memóriát. A memória egység, mentes a szempontból a program, lehet tekinteni, mint elkülönített Windows szempontból. Így a darab memória lesz az úgynevezett szabad, ha egészében szabad memória oldalak abban az értelemben, a Windows. A töredék a memória lesz az úgynevezett fenntartott, ha egészében a memória oldalak által fenntartott alkalmazás. A töredék a memória lesz az úgynevezett izolált, ha egészében oldalak memória számára lefoglalt fizikai memória. Ennek megfelelően a darab memória nem nevezhető izolált ha oldalakból áll fenn az alkalmazás, de amelyek a fizikai memóriát. A töredék a használt memória fogják hívni, ha azt az említett Delphi-programot. És végül, a darab memória lesz az úgynevezett használhatatlan, ha ez alatt a fizikai memória, de ez jelenleg nem használható Delphi alkalmazást. A teljes memória hierarchiát ábrán látható. 1.

Delphi memória irányítási struktúra

Delphi memória menedzser áll, a négy adminisztrátorok, valamint a hibakeresés és diagnosztikai funkciókat. Scheme függően a rendszergazdák a 2. ábra mutatja Azt fogja mondani röviden mindegyiket.

Az első közülük - az adminisztrátor kezeli blokkokat. Küldetése -, hogy más adminisztrátorok funkcióval rendelkezik kétirányú gyűrű listákat. Mint később látni fogjuk, minden információt a kiválasztott és fenntartott memória tárolja ezeket a listákat. Ugyanakkor van egy probléma, hogy ezek a lista elemeit kell létrehozni dinamikusan. Az adminisztrátor kezeli blokkok megoldja ezt a problémát hivatkozva a folyamat fő kupac.

A rendszergazda feladata a lefoglalt memória a memória mennyiségét Delphi memória menedzser. Mivel a végrehajtás a Windows Virtual Memory Manager, az adminisztrátor kezeli áthelyezési kérelmek és a visszatérés a fizikai memória a megadott régióban.

A fő funkciója a rendszergazda dedikált memória kezelése kéri a memória kiosztás és felszabadítása. Ez is tárol információt a fenntartott, de még nem lefoglalt memóriát.

A rendszergazda a használt memória az alacsony szintű rendszergazda. Úgy beszél közvetlenül a Delphi alkalmazások megfelelnek a kérelmek elosztása és felszabadítása a memória. Tartja információt memóriát.

Az egyik jellemzője az összes adminisztrátorok (kivéve rendszergazda kezeli blokkok) az a tény, hogy dolgoznak egy „sok, nem lehet kevesebb.” Amikor a rendszer kéri, az adminisztrátor többet fordítson a kért mennyiségű memóriát, és egy alacsonyabb szintű adminisztrátor el kell döntenie, hogyan kell használni a többi. Így például, amikor megpróbálta fenntartani egy memória területet 100 byte (fellebbezés Administrator memória juttatott a rendszergazda a fenntartott memória), továbbra is fenntartva régió 1 MB dedikált memóriával és adminisztrátornak kell dönteni, hogy hogyan kell kezelni a maradékot. Ennek megfelelően, a rendszergazda kiadja a kisebb fragmentum, miközben megpróbálja szabad memória.

Azt, hogy egy számos észrevételt hibakezelés rendszerek Delphi memória menedzser. Ha a függvény egy memóriát blokk, a hiba vissza a blokk addr értéke egyenlő nulla. Ha hiba történik közben a felszabadulás telepített memória globális változó heapErrorCode. Ezen kívül számos funkciót, hogy visszatérjen az érték logikai típusú, jelezze a hibát visszatérve False.

Administrator leíró blokkok

Szinte az összes információt a fenntartott, elkülönített és fel nem osztott memória tárolja a kör alakú kétszeresen láncolt listák. A fő előnye, hogy annak érdekében, hogy távolítsa el egy elemet a listából elegendő tudni, csak egy mutatót, amely elem (pl funkció deleteBlock cm.). Administrator blokkok más adminisztrátorok leírásokat funkciókat biztosít, hogy manipulálják az ilyen listákat és dinamikus elosztása memória elemek ezeket a listákat.

Csak vegye figyelembe, hogy a kör alakú kétszeresen láncolt listák által használt Delphi memória menedzser, kétfélék. A fő különbség típusok - a folyamat végrehajtása a blokk betétek a listát, és vegye ki a készüléket a listából. Ha hozzá az első blokk típusa listában a többi blokk a listában változatlan marad. Ennek következtében eltávolított egy ilyen lista, akkor csak a blokk, amit ki benne korábban. Ha hozzá a blokkot a listán a második típusú ellenőrizzük, hogy hozzáadott nem határos blokk más blokkok a listában. Ha igen, akkor van egy „fúziós” blokkok t. E. minden blokkot egymás mellett helyébe egy. Ennek megfelelően, hogy megszüntessék az ilyen lista memória blokk lehet bármilyen, amíg benne volt az egyik blokkok jelen a listában. Ebben az esetben előfordulhat, „felosztása” a blokk két. A második típusú listákat elkerüli memória töredezettség.

Mi most úgy a dinamikus elosztása memória a leírásnak. Minden vonatkozó adatokat az adminisztrátor kezeli a blokkokat formájában tárolt két egyirányú listákat. Ezek közül az első (blockDescBlockList) tartják magukat deszkriptorok száz csoportok. A második lista (blockDescFreeList) tárolja a jelenleg rendelkezésre álló leírások, valamint a köztük használjuk következő mezőt leíró. Mind a fogantyúk is az egyik típusú szerkezetek TBlockDescBlock listához blockDescBlockList, és ha a leíró szabad, szintén blockDescFreeList listán. Tipikus állapot rendszergazda egység leírók a 3. ábrán látható.

Mi röviden leírni a funkciókat a rendszergazda leíró blokk.

Ez a funkció hozzáadja a megadott memória blokk egy kétirányú gyűrű lista második típusú (lásd. Fent). A visszaadott érték egy memória egység egyesülésével létrejött blokk adunk a meglévőket. A hiba esetén az értéke addr van beállítva, hogy blokkolja a visszatérő nulla.

Ez a funkció törli a memória blokk a körkörös kétszeresen összekapcsolt listáját a második típusú. Ha sikeres, akkor a függvény True.

Administrator lefoglalt memóriát

Így a rendszergazda a lefoglalt memóriát tartalmaz egyetlen kétirányú gyűrű lista spaceRoot, amely tárolja a leírást minden fér VirtualAlloc funkciót annak érdekében, hogy kímélje memóriát. Eredetileg ez a lista nem tartalmaz elemeket. Állandókat használjuk a rendszergazda:

  • cSpaceAlign, bemutatva, bizonyos határokon kiegyenlítődik redundáns memória fragmensek;
  • cSpaceMin, bemutatva a minimális memória mérete blokk fenntartandó;
  • cPageAlign, azoldalméret.

Röviden ismertesse a célját és jellemzőit az egyes funkciók tartoznak az adminisztrátornak.

Ez fenntartja a memória terület méretének legalább minSize bájt. Ez adja vissza a memóriát blokkot, amit ténylegesen fenntartva. Ha hiba vissza memória blokk cím lehetőséget mező értéke nulla. Fenntartott memória PAGE_NOACCESS hozzáférés attribútumot.

Ez a funkció egy érdekes funkció, vagyis akkor szabad memóriát fragmentum amelynek mérete kisebb, mint a kért. Több, ez a funkció lesz szó a leírásban GetCommittedAt funkciót.

Az adminisztrátor dedikált memóriával

Az adminisztrátor dedikált memóriával információkat tárol a lefoglalt, de ki nem osztott memóriát. Megjegyzés: a szójáték: az adminisztrátor foglalkozik dedikált memóriával, de információt tárol nincs kiválasztva. Ez a rendszergazda kezeli memória kiosztás kérelmet a rendszergazda a használt memória. Ezért információt tárol szelektált, de a fenntartott memória ezeket a tartalékokat, hogy megfeleljen az igényeinek a rendszergazda a használt memória. Ha a tartalék nem lefoglalt memória nem elég, a rendszergazda utal, hogy a rendszergazda a lefoglalt memóriát.

Az adminisztrátor dedikált memóriával rendelkezik egy kétirányú lista decommittedRoot, amely minden információt tartalmaz a fenntartott, de nem memóriát. Kezdetben a lista nem tartalmaz elemeket. Memória adunk hozzá, és eltávolítjuk a listát decommittedRoot MergeBlockAfter hívások és RemoveBlock, így ez a lista nem tartalmazhat két szomszédos memória fragmentumok (azaz. E. Ez a lista a második típusú). Ezen túlmenően, a rendszergazda egy állandó - cCommitAlign, ami azt mutatja, állítja egy határ lesz igazítva memóriafoglalási kérelmet.

Mesélj egy kicsit a kölcsönhatás a rendszergazdák és a lefoglalt memória memóriát. Minden memória töredékek, amelyek szerepelnek a listán decommittedRoot, rendszergazda dedikált memóriával továbbítja fizikai memóriát, a Commit funkció adminisztrátor lefoglalt memóriát. Ha a kérés, hogy megfeleljen a menedzser a fenntartott memória nem elég fenntartva de ki nem osztott memóriát, ez okozza GetSpace. Ennek dedikált memória menedzser visszatér a fizikai memória hívja visszavonja adminisztrátor fenntartva memória funkció. Ezt követően, a fragmenst tartalmazó oldatot adunk a listához decommittedRoot, és vezérlő ellenőrzést hajtunk végre az redundancia eltávolításával az új memória molekularész képződött oldható egyesíteni memória blokk a már decommittedRoot listán.

Kell figyelni, hogy az egyik jellemzője a viselkedés GetCommittedAt rendszergazda dedikált memóriával. Ezzel a funkcióval a ciklus GetSpaceAt működni, amíg a méret a fenntartott hely nem haladja meg a kért méret (cm. GetSpaceAt adott funkció). De míg ez a darab memória illeszkedik a néhány leíró spaceRoot listán. Miért csináltad ezt? Emlékezzünk arra, hogy a hívást a VirtualAlloc funkció, hogy kiadja az oldal (MEM_RELEASE zászló) pontosan meg kell egyeznie a hívás VirtualAlloc, amely a memóriát. Ily módon, amikor csökkentve a következő (vagy annak felszabadulását) blokk mérete, akkor a memória vezetője képes lesz visszatérni legalább egy részét a rendszer fenntartva fragmensek, amelyet került ebben a memória blokk.

Röviden írja egyes funkcióit a rendszergazda dedikált memóriával.

Memóriát területe nem kevesebb, mint minSize bájt. Ez adja vissza a memóriát blokkot, amit ténylegesen kiosztott. Ha hiba vissza memória blokk cím lehetőséget mező értéke nulla.

Kapcsolódó cikkek