Alapjai fordítási technikák, sok

Heap használják értékeket tárolnak, ami szükségessé teheti az idő a részükre a memóriát és a program befejeződik. Nincs nyelvi mechanizmus hasonló a kimenet a blokk vagy funkció, amely biztosítja, hogy a memória terület nem áll rendelkezésre. Első pillantásra, a rendszer elosztási ilyen memória kell memóriát egyik végét a lineáris tér egy másik, amíg a szabad memória van elosztva teljesen. Úgy tűnhet, hogy ez nem jelent problémát a terjesztéshez vagy túlzott memóriahasználat merülnek fel problémák. Ugyanakkor ez a megközelítés van egy nagy hátránya, nevezetesen az első felosztás után a memória teljes mértékben kihasználja a következő nyilatkozatot, például

aki megpróbálja kiemelni a négy bit memória és visszatér egy pointert a területen hibát okoznak a programban. Mielőtt azonban fel vele, meg kell emlékezni, hogy a memória terület válhat megközelíthetetlen miatt egy ilyen program a műveleteket, mivel a átminősítése mutatók, stb Például a korábban kapott helyet elérhetetlenné válhat egy változó sztring kiosztása a következő:

Ugyanakkor ez a művelet lehetővé teszi a hozzáférést a teret figyelembe vétele mellett más változó. Tekintsük az eredmény a megbízás

a fenti két üzemeltetői. Tekintettel arra, hogy más piaci társított adatok nem állnak rendelkezésre, ezek az intézkedések vezetnek arra, hogy a változó elérhető lesz stringl helyet juttatott malloc nyilatkozatot.

Mivel általában nem ismert fordítási időben, mivel a program végrehajtása, lehetetlen tudni, hogy fordítási időben, amikor elérhetővé válik memória kiosztott malloc nyilatkozatot. Ez azt jelenti, hogy a kód helyreállítása egy halom területén nem lehet generálni fordítási időben, de elérhetetlenné válnak a nagy területeket juttatott a kupac. Az egyik módja annak, hogy megoldja ezt a nehézséget az jelenti, hogy a programozók (a tudásukat, hogy a program kerül sor), hogy előre a pillanatot, amikor a halom memória elérhetetlenné válik, és fecskendeznek a forráskódot kifejezett utasítást újraelosztását. Például, C kiadás a memória terület allokált változó: string, akkor írj a következő:

Ugyanakkor ez a megoldás a programozó nagy szakértelemmel és felelősséggel. Szóval, minden automatizált módszerekkel szabad memória használata kívánatos. A Java, azt feltételezzük, hogy a felelősséget a megjelenése álló memória kell viselnie a Java végrehajtása helyett a programozó; így minden Java megvalósítás kell a megfelelő mechanizmusokat. Érdemes megjegyezni, hogy ellentétben a korábban leírt memória modellek, Java megtartja a kupac tömbök. Minden obektytakzhe tárolt kupac.

Két lehetséges szabályozási módszer csomó kapcsolatban a helyreállítás megközelíthetetlen területeken memória:

• szemétgyűjtés (garbage collection);

• A referencia szám használatát (referencia működése). Az első módszer talán még népszerűbb, hanem inkább szükséges. Az E megközelítés előnye abban rejlik, hogy mielőtt a teljes elosztása a rendelkezésre álló memória nincs szükség a helyreállítása annak bármely részét. Ennek eredményeként sok esetben az idő szemétgyűjtő általában nem szükséges. Ha (és amikor) szemétgyűjtő még mindig szükség van, ez a folyamat két szakaszból áll:

• jelölés fázis, ahol (bevezetésével az értékeket a bit térkép) jelöli kupacmemóriája program megvalósítására rendelkezésre álló változók.

• kompressziós fázis, amelyben a rendelkezésre álló tér van tolva, hogy egyik vége a halom, és a memória az újrahasználható, képez összefüggő blokk a másik végén a halom. Ugyanakkor természetesen gondosan ellenőrizni kell, hogy megfelelően változtatni mutatók.

A két szakaszban a jelölési szakasz, és lehetővé teszi a legérdekesebb alternatív módját, hogy végre kevesebb. Szükség van valamilyen módon a „címkézés” memória sejtek, amelyek hozzáférhetnek a változókat a program, ha szükséges. Ezt fel lehet használni egy kicsit térképet egy elegendő számú bitovdlya összehasonlítása minden cella a halom. A bitmap nem része a halom, és külön belőle. Minden kicsit a bitmap eltarthat két érték egyikét:

0 - megfelel a memória cella nem áll rendelkezésre a program változókat.

1 - a megfelelő memória cella áll rendelkezésre a változók a program. B elején a szemétgyűjtő folyamat minden eleme a bittérkép 0, és a teljesítménye az algoritmus különböző elemeit kártya beállítása 1. végén az 1 értéket szemétgyűjtő lesz minden eleme egy bitmap, amelyek megfelelnek a memória sejtek, hogy rendelkezésre állnak a program változókat.

Egyszerű szemétgyűjtő algoritmus egy köteg (úgynevezett köteg szemétgyűjtő), és a következő:

1. verem a végrehajtási idő lineárisan látható, amíg nem talál olyan jelző változó jelöletlen sejt halom. Ez lehet a tényleges változót is egy mutató (egy csomó), vagy egy rögzítési komponens, amely egy mutató. A jövőben az összes sejt halom, ekkor ezek a változók markiruyutsyaposredstvom magában foglalja a megfelelő bit a bit térkép.

4. A harmadik lépés ismétlődik, amíg a verem mentes szemétgyűjtő, és minden mutató a futási verem kerül feldolgozásra a leírt módon.

Harmadik lépésként mindig jelölt jelöletlen sejteket, akkor a végén, az algoritmus leáll.

A fenti algoritmusnak egy világos, könnyen érthető és hatékony. Azonban van egy hátránya - nem reális, mert használatát igényli tetszőleges méretű verem memória idején maximális terhelés. Más szóval, a szemétgyűjtő egyszerűen nem kezdeményezhető! Természetesen senki sem számít, hogy a memória tisztítás fog végezni annak hiányában a hely dolgozni. Ugyanakkor például a szükséges szemétgyűjtő kicsi (és híres) memóriát, ha kevés a memória lehet kezdeni az első helyen. Tény, hogy van egy szemétgyűjtő algoritmus rendkívül kis munkaterület kérések:

1. Mark heap sejt, amely egyértelműen jelzi az értéket a futási verem.

Amellett, hogy a szükséges helyet bitmap algoritmus is igényel három változó képviselő:

• egy sejt, amely a kérelem címzettje;

Ugyanakkor, az utazási időt tekintve, az algoritmus is rendkívül hatékony. Különösen ez az eset állhat fenn, ha a kupac tartalmaz sok hátra mutató, és ez az ár nem használja a verem.

A kompromisszum a két algoritmus alapján ismertetjük algoritmus ragasztás stratégia 1 elég memória és stratégiák 2 - ellenkező esetben. Például, ha a verem elég nagy, az algoritmus használható fiksirovannogorazmera verem, és tartsák magukat az első stratégia. Miután a verem növekedni fog, amikor az igazi veszélyt a túlfolyó a köteg (alulról) el lehet távolítani egy értéket. Távoli így alacsonyabb verem értéket tároljuk, és használjuk, hogy indítsa el a második szakasz az algoritmus, amely hasonló a szerelvény 2 nagyrészt törmeléket.

Egy másik jól ismert algoritmus kupac tekinthető, mint egy fa struktúra mutató a tetejétől az aljáig. Szemétgyűjtő kezdődik a fa tetején, és megy lefelé. Ahelyett, hogy a verem tárolja a mutatókat, hogy további feldolgozást igényelnek, az algoritmus a fa pointerek átmenetileg fordult őket, hogy biztosítsák a visszirányú fel a fára. Ez az algoritmus hatékonyabb az idő IS, IS szempontjából szükséges memória.

Egyéb memória tisztítási rendszerek magukban foglalják a különböző szemétgyűjtő rendszerek tekintve generációk (generációs szemétgyűjtő), amelyben az elválasztást végrehajtottuk:

• közötti globális objektumok léteznek viszonylag hosszú megkezdése előtt a szemétgyűjtő folyamat, és a memória, ami nem kell tisztítani;

• helyi objektumok léteznek rövidebb idő alatt, és a memória, hogy vissza akar térni véglegesen a rendelkezésre álló területet.

Nyilvánvaló, hogy egy ilyen rendszer csökkenti törmelék építmények időt és lehet elég hatékony. Más rendszerek csökkentik a halom idő tömörítés használ két globális régióban. Linkek néhány részben található további olvasható a fejezet végén.

Bármi szemétgyűjtő módszert alkalmazzák, előfordulhat, hogy a program egyszerűen elfogyott a rendelkezésre álló memória, és kénytelenek lesznek leállítani, ha a rendszer nem oldja meg ezt a problémát más módon. A program memória is lehet miatt korlátozott szemétgyűjtő, ha a használt algoritmust a legtöbb időt vesz igénybe, hogy tisztítsa meg a memória - röviddel a befejezése szemétgyűjtő, ha a program már megjelenik készen áll, hogy továbbra is működik, sok túlcsordul újra, ami ismét azt kívánja, hogy egy üres memóriába. Ebben a helyzetben, a szolgáltatás elvégzéséhez szükséges költségek szemétgyűjtő nagyon jelentős lehet, és ez itt, hogy helyénvaló lenne alternatív megközelítés - használata referencia számít. Ez a módszer lehetővé teszi, hogy (elég gyakran), hogy cserélje ki a kiszámíthatatlan költségeit szemétgyűjtő költség állandó és kiszámítható.

Ha referencia számít próbálja világos minden halom memória elem után azonnal a kezelés befejezése neki. Minden memóriahely a kupac egy referencia száma, ahol a rögzített értékek számát, betekintés egy adott cellában. A megjelenése minden új változó hozzáfér egy adott sejtben, a számláló értékét növeli, és csökkenti annak eltűnése linkeket. Amikor a számláló értéke zéró, a sejt vissza lehet szabad memória további szétosztásra. Ez a módszer sikeres, de vannak bizonyos korlátai:

• Ne tudja törölni társított adat szerkezete hasonló a cirkuláris listán.

• kapcsolódó fix költségek felhasználásával referencia számlálók nagyban csökkenti a hatékonyságot a programok rendkívül kicsi képest memória kéréseket.

Kapcsolódó cikkek