Garbage Collection 1
A programozás, szemétgyűjtő [1] (született szemétgyűjtés.) - egyfajta automatikus memória kezelése. Egy speciális folyamatot nevezzük szemétgyűjtő (Eng. Szemétgyűjtő), rendszeresen memóriát szabadít fel eltávolításával tárgyakat, amelyek már nem a kereslet alkalmazásokat.
Ha a számítógép memóriája végtelen volt. Egy egyszerűen hagyja a nem kívánt objektumokat a memóriában. A szemétgyűjtés - vetélkedés a PC-t a végtelen end memória [2]. Sok szemetesek korlátozások (nincs garancia arra, hogy a véglegesítő lefut, csak azt szabályozza, a memóriát, de nem más források) származik ez a metafora.
A szemétgyűjtés használta először Dzhonom Makkarti 1959 programozási környezetben kifejlesztett funkcionális nyelv Lisp programozási. Később már más, elsősorban a programozási nyelvek és operációs rendszerek - funkcionális és logikus. Annak szükségességét, hogy szemétgyűjtő nyelvén ilyen típusú annak a ténynek köszönhető, hogy a szerkezet a következő nyelveken teszi, hogy nagyon kényelmetlen nyomkövető élettartama memóriában lévő objektumok és manuális kezelését is. Széles körben használják a következő nyelveken és listák alapján ezeket a komplex adatstruktúrák, míg a programokat folyamatosan létre, épülnek, expandált, másolni, és pontosan meghatározni az időt eltávolításának egy tárgy nehéz.
utasítás memória problémák
Hagyományos politikai nyelv memória kezelése módszer utasítás. Ennek lényege a következő:
- Ahhoz, hogy hozzon létre egy objektumot a kupac programozó kifejezetten felkéri memóriafoglalási parancsot. Ez a parancs visszaad egy pointert a lefoglalt memória terület, amely tárolja és használt hozzáférni.
- Mindaddig, amíg a létrehozott objektum szükséges a program, a program fér át egy korábban mentett pointer.
- Ha nincs tárgy elhalad, a programozó kifejezetten felkéri felszabadítása parancsot, átadva neki a mutató egy törölt objektum.
Bármilyen nyelven, megengedi a tárgyat a kupac, esetleg két lehetséges problémák: Függő referenciák és memóriavesztés.
Szemétgyűjtő mechanizmus
alapelvek
Szemétgyűjtés - olyan technológia, amely lehetővé teszi, egyrészt, hogy egyszerűsítse a programozás, a megtakarítás a programozó, hogy manuálisan törölni létrehozott objektumok a kupac, a másik -, hogy megszüntesse hibák okozta helytelen kézi memória kezelése.
A rendszer szemétgyűjtő vámmentes memóriát a tárgyak, amelyek már nem használják, van rendelve a program végrehajtási környezetet. A programozó létrehoz egy dinamikus objektumokat, és használja őket, nem tud vigyázni eltávolítja a tárgyat, ahogyan azt neki szerdán. Végrehajtására vonatkozó szemétgyűjtő a végrehajtási környezet tartalmaz egy speciális szoftver modul az úgynevezett „szemétgyűjtő”. Ez a modul időközönként fut meghatározza, hogy a létrehozott már nem használják a kupac objektumok és felszabadítja a memóriát általuk elfoglalt.
GC startfrekvencia határozza meg a rendszer funkcióit. Collector fut a háttérben, induló program, amikor inaktív (például amikor a program tétlen, várakozás felhasználói input). A szemétgyűjtő fut biztosan megszakítása munka időben a program végrehajtását, amikor a következő memória kiosztás művelet nem hajtható végre annak a ténynek köszönhető, hogy minden rendelkezésre álló memória kimerült. A felszabadulás után az emlékezet, hogy megszakítja a működését memóriakezelését folytatódik, és a program tovább fut tovább. Ha kiderül, hogy lehetetlen, hogy felszabadítja a memóriát, a futási leállítja a program egy hibaüzenetet: „Nincs elég memória”.
megközelíthető tárgyak
Bár általában lehetetlen pontosan meghatározni, ha az objektum használták utoljára, és már nincs szükség, szemetesek használja Óvatos becslések meghatározására, hogy a tárgy a jövőben garantáltan nem használható.
Normális esetben a feltétel, hogy az objektum még mindig használatban van, az, hogy link mutat rá. Ha nincs több utalás az objektumot, akkor nyilvánvalóan nem lehet a program által használt, és ezért el kell hagyni. Ez a kritérium által használt legmodernebb szemetesek nevezett több elérhető tárgyakat.
Informális, akkor adja meg a következő rekurzív definíció elérhető objektum:
Egy ilyen meghatározás nem elméletileg valamint a számos elérhető szerint neki is vannak tárgyak, amelyek soha nem lehet használni, de amelyek még nem léteznek linkeket. Az optimális lenne tekinthető egy elérhetetlen cél, amely során a további munka program nem lehet egyetlen kezelés, de azonosítása ilyen helyek nem lehetséges, mivel csökken eldönthetetlen probléma, hogy állítsa le (elég azt feltételezni, hogy egy objektum X fogják használni, akkor és csak abban az esetben, ha a program sikeres P).
Az algoritmus kiállító zászlók
Egy egyszerű algoritmus meghatározására elérhető tárgyak, „algoritmus jelek» (Mark és Sweep), az alábbiak szerint:
Az algoritmus a referencia számlálás
Egy másik változata az algoritmus meghatározására elérhetőség - a szokásos referencia számlálást. Ennek használata késlelteti hozzárendelés műveletek kapcsolatokat, de a meghatározása elérhető tárgyak triviális - minden tárgyat, az érték a referencia száma nagyobb, mint nulla. További részletezés nélkül, ez az algoritmus, ellentétben az előzővel, nem távolítja el a ciklikusan zárt láncot elavult tárgyak hivatkozást tartanak egymással.
szemétgyűjtő stratégia
Miután meghatároztuk a készlet elérhetetlen tárgyak, a szemétgyűjtő visszaigényelhetik a memória által elfoglalt őket, és a többit hagyja, ahogy van. Ön is tegye a szabad memória mozogni egészét vagy egy részét a fennmaradó tárgyak más memória területek, frissítése egyidejűleg, minden utalást rájuk. Ez a két megoldás nevezzük, sorrendben, és mozgassa a mozdíthatatlan.
Mindkét stratégiák előnyei és hátrányai
A kibocsátás mértékét és engedje memóriát mozdíthatatlan szemétgyűjtő felszabadítja a memóriát (mivel ez a művelet vezet a jelölést a megfelelő memória blokk, mint egy ingyenes), de több időt tölt vele választás (mert a memória a szegmentált és elosztására kell találni a memóriában a kívánt mennyiségű alkalmas blokk méret) . Mozgó kollektor igényel viszonylag több időt szemétgyűjtés (töltött több időt a memória töredezettségét, és módosíthatja az összes utalást a lebegő tárgy), de a mozgás a rendkívül egyszerű és gyors (Kb) (1) algoritmus memóriafoglalási. Amikor töredezettségmentesítés mozgatására, és így elválasztjuk a teljes memória két nagy területek - elfoglalt és lakatlan volt, tárolja a mutatót a határon. Jelölje ki az új memória kell csak mozgatni a határ, visszatérve a darab elejétől szabad memória. Való hozzáférés sebességét tárgyak a kupac tárgyak, amelyek mezők együtt használják, mozgó kollektor segítségével helyezi a memóriában egymás közelében. Aztán valószínűleg a cache a processzor egyidejűleg, ami csökkenti a hívások száma viszonylag lassú RAM. Kompatibilis idegen kód A mozgó szemétgyűjtő okoz nehézséget, ha használja kód, amely nem egy olyan automatikus memória rendszer (ilyen kódot hívják a külföldi (angol. Államok Külföldi) a hagyományos terminológia vagy felügyelt (Eng. Menedzselhető a) a Microsoft terminológia). A mutató a lefoglalt memória a rendszer mozdíthatatlan kollektor, akkor egyszerűen át az idegen kód által használt, amely legalább egy normál objektum hivatkozás a kollektor nem törölte azt. Mozgatja a picker megváltoztatja a tárgyak helyzetének a memóriában, szinkron változik minden utalást őket, de változtatni a referencia nem tud egy idegen kódot, ennek eredményeként a kód által továbbított külföldi kapcsolatok után mozgó tárgy érvénytelenné válik. Dolgozni egy idegen kódot használják a különböző speciális technikák, például rögzítésével - explicit lezárható objektum, amely megtiltja, hogy közben mozog szemétgyűjtés.
erőművek
Mivel a gyakorlat azt mutatja, az újonnan létrehozott objektumok egyre elérhetetlen, mint a tárgyakat, hogy létezik sokáig. E törvény szerint, sok modern szemetesek vannak osztva az összes objektum néhány generáció - egy sor tárgy egy közeli életre. Amint a lefoglalt memória az egyik generáció, akkor véget ér ez a generáció, és minden további „fiatal” keresi elérhetetlen tárgyakat. Mindegyikük eltávolítjuk, és a maradék át az „idősebb” generáció.
A generációk csökkenti szemétgyűjtő ciklus számának csökkentése nézve az összeszerelési tárgyakat, de ez a módszer a futási nyomkövető linkek generációk között.
egyéb mechanizmusok
Megváltoztathatatlan objektumokat (Eng. Megváltoztathatatlan objektumokat) Például java.lang.String a Java. Amint a vonal adott némi értelme, akkor nem lehet változtatni. Rutinok elmúlik a kapcsolatot ezen a vonalon egymást, és amikor az összes hivatkozást el fog tűnni, a húr kell semmisíteni a szemétgyűjtő. Finalizers véglegesítő meghatározza, hogy mit kell tenni, ha egy tárgy alá szemétgyűjtő. Általában finalizers írni csomagolóanyagokat az operációs rendszer objektumok (fájlok, hálózati aljzatok.); Ezek automatikusan lezárja a megfelelő objektumot. Mivel a cél az, hogy összegyűjtse lehet „lógott” a memória hosszú ideig, jó programozási stílus -, hogy közel egy fájl vagy egy foglalat kézzel egy csapat, mint a close ().
Nyelvi követelmények és a rendszer
Így a program használata szemétgyűjtő, szükséges, hogy megfelel számos feltételnek nyelvére vonatkozó működési idő és a legtöbb feladatot.
Ellentétben a gyakori előfordulása, létezése a szemétgyűjtő nem mentesíti a programozó az összes memóriát irányítási problémák.
Előnyök és hátrányok
Összehasonlítva kézi memóriakezelés, szemétgyűjtés biztonságosabb, mivel megakadályozza, hogy a memória szivárgás és holt link miatt korai eltávolítása tárgyakat. Egy másik pozitív dolog - egyszerűsítésére a programozási folyamatot. Másrészt, a jelen szemétgyűjtő okozhat egy tapasztalatlan fejlesztő hamis biztonságérzetet, a nézeten alapul, hogy a kiosztott szabad memória, és nem kell figyelni, mert a kérdéssel a szemétgyűjtő.
Például a tárgy soha nem lesz törölve, ha ez maradt legalább egy neobnulonny mutató a globális hatókörű, és a keresést egy psevdoutechki a nyelven szemétgyűjtő különösen összetett. A programozó nem teljesen figyelmen kívül hagyja a kérdést a memória kezelése jelenlétében egy szemétgyűjtő, ugyanakkor a kézi munkaerő-költségek a memória kezelése ebben az esetben még mindig jóval kevesebb, mint a nyelvek teljes kézi vezérlés nélkül (kollektor és avtodestruktorov). Gyakran a kritikus nem csak a garancia a felszabadulás a forrás, hanem garancia arra, hogy ez szabad hívni egyéb eljárások - például a megnyitott fájlokat, belépő a kritikus szakasz. Adja meg e források kezelésére a szemétgyűjtő nem, így van, hogy távolítsa el őket kézzel. Ugyanakkor az elmúlt években, még a nyelvek szemétdíj bevezetése képes létrehozni osztályokban a determinisztikus módszert-hívja a különleges „destructor» (dobja), amikor elhagyják a láthatósági zónában.
Sok esetben a szemétgyűjtő rendszer mutatnak alacsonyabb hatékonyság, mind a sebesség és a memória használat (ami elkerülhetetlen, mert a szemétgyűjtő maga erőforrásokat igényel, és szükség van némi szabad memória felesleges normál működés). Ezen kívül, a szemétgyűjtő rendszer bonyolult alacsony szintű algoritmusok végrehajtása megkívánja a közvetlen hozzáférést biztosít a számítógép memóriájában, mint az ingyen használható mutatók nem lehetséges, és a közvetlen memória-hozzáférés igényel speciális interfészek írt az alacsony szintű nyelvek. Másrészt, a modern rendszerek elosztásának memória szemétgyűjtő működése közben csökken az elemi összeadó egység a végén a halom. És egy halom időről időre tömörítik csökkentésével adatok töredezettsége.
Támogatás egyes kényszerítő nyelv automatikusan hívja destructor (C ++ [3]. Pokol. Delphi), valamint egyszerűbb, mint a szemétgyűjtés, a használata „smart linkek” technológia (követés számos hivatkozás egy tárgy közvetlenül, és az automatikus törölni, ha törli az utolsó referencia ahogy az a COM technológia) jelentősen csökkenti a szivárgást, így koncentrátumot veszélyes helyeken a végrehajtási osztály, anélkül, hogy további forrásokat, míg ugyanabban az időben igényel készség a programozó. Persze, írni források adómentes szám lesz még, de az automatikus destruktort ad hogy az a kód köteles okoz. Ahhoz azonban, hogy a leggyakrabban használt forrásokat, az összes népszerű nyelv, amely támogatja avtodestruktory már automatikus csomagolására is, amelyek maguk lezárja a forrás, ezáltal ügyelve a források válik szinte könnyebb, mint egy kiszámíthatatlan szemétgyűjtő.
Jelentős kényelem szemétgyűjtő akkor jelentkezik, ha a dinamikusan létrehozott objektumok sokáig élnek, többször ismétlődik, és rájuk hivatkozásokat át különböző részei között a program. Az ilyen programok általában elég nehéz pontosan meghatározni a helyét, ahol az objektum már nem használt, és el lehet távolítani. Mivel ez egy ilyen helyzet, amikor a széles körben elterjedt használata dinamikusan változó adatstruktúrák (listák, fák, grafikonok), szemétgyűjtő szükséges körben az ilyen szerkezetek funkcionális és logikai nyelvek, mint például a Haskell. LISP vagy Prolog. Használata szemétgyűjtő hagyományos kényszerítő nyelveket (a strukturális paradigma, talán kiegészített tárgy jelenti) határozza meg a kívánt közötti arány az egyszerűség és a programozás sebességét és hatékonyságát annak végrehajtását.
Memóriakezelés specifikus nyelvek és rendszerek
A szemétgyűjtés gyakran szembe kézi memóriakezelés, amelyben a programozó kifejezetten meghatározza, hogy mikor és mely területeken memória kell engedni. Vannak azonban olyan nyelv, amely felhasználja a kettő kombinációja memória kezelési technikák, valamint vannak más technológiákat, hogy megoldja az azonos alapvető probléma (például hu: régió következtetés).
Néhány programozási nyelvek használata szükséges szemétgyűjtő mechanizmus szerint a specifikáció (Java C # Eiffel ..), a másik - a hatékonyság miatt a végrehajtás (pl formális nyelvek a lambda-kalkulus) - Ezeket a nyelveket nevezzük nyelvek szemétgyűjtés. Sok nyelvek szemétgyűjtő nincs lehetőség explicit kézi eltávolítása tárgyak (például a delete operátor), ahol az esemény lóg referenciák kizárt elvileg, és a szemétgyűjtő csak foglalkozik eltávolítása tárgyak, amelyek nem hivatkozott a program.
Néhány nyelv (például Modula-3), akkor használja a kézi memóriakezelés és a szemétgyűjtő egy alkalmazás - két különálló cölöpök.