„Szerkesztő:Mr Steve/Garbage Collection” változatai közötti eltérés

Tartalom törölve Tartalom hozzáadva
Mr Steve (vitalap | szerkesztései)
a →‎Egy objektum elérhetősége: fogalmazás (hogy-hogy)
Mr Steve (vitalap | szerkesztései)
49. sor:
 
===Alapvető algoritmusok===
A nyomkövetés alapú szemétgyűjtő nevét a munkamódszeréről kapta, mivel folyamatosan figyeli a program által használt memóriát, kutatva a szemét után. A gyűjtő ciklikusan működik, mindig akkor "kapcsol be", amikor a program erőforrás szűkben van. EkkorAz azeredetileg használt eljárás egy '''naív''' ''jelöld meg és söpörd ki'' ('''mark-and-sweep''') metódus alapján kiválasztja a felesleges elemeket. Ezzel a módszerrel a program futása során többször is végigmegy a felhasznált memórián.
 
Ebben a metódusban minden egyes objektum kap egy jelzést('''flag''') (tipikusan egy [[bit]] hosszúságú), amelyet csakis a szemétgyűjtő használ. Ez a '''flag''' mindig törölt állapotban van, kivéve a gyűjtő ciklusa alatt. A GC először kitakarítja a valószínűleg elérhető elemek ('''root set''') listáját, amelyek a call stack -ben vannak vagy lokálisak, és minden használatban lévő objektumot megjelöl. Minden olyan elem, amely elérhető a root set -ből szintén jelölést kap. Végül ismét végignézi az összes elemet: ha az objektum flag -je alapállapotban van, akkor törlésre kerül ellenkező esetben visszaáll az eredeti helyzetbe, hogy felkészüljön a következő ciklusra.
 
Ennek a módszernek rengeteg hátránya van, a legnagyobb, hogy a gyűjtő ciklusa alatt minden más folyamat várakozik ez pedig az alkalmazás időszakos "lefagyását" okozhatja, lehetetlenné téve a valós-idejű és idő-kritikus folyamatok végrehajtását. A GC legalább kétszer végignézi a memóriát az alkalmazás futása során, ez problémát okozhat a virtuális memóriát használó rendszereken.
 
A fenti hibák miatt a legtöbb modern nyomkövető szemétgyűjtő a ''három színű jelölés'' (''tri-colour marking'') egy változatát implementálja, amely a következőképpen működik:
 
* Létrehozza a kezdeti fehér, szürke és fekete listákat. A fehérek az ún. ''halálraítélt'' elemek (condemned set), amelyek azok az objektumok, amiket törölni fog. A feketével jelölt elemekről "olcsón" bebizonyítható, hogy nem hivatkoznak a fehér lista egyetlen objektumára sem. A maradék szürkével jelölt elemek vagy hivatkoznak a fehérekre vagy nem.
* A következő lépésben kiválaszt egy elemet a szürke listából és feketével jelöli úgy, hogy minden objektumot amire az elem a fehér listában hivatkozik szürkére fest.
* Addig ismétli az előző műveletet, amíg a szürke lista üres nem lesz.
* Azok az elemek amelyek végül a fehér listában maradnak törlödnek.
 
Az algoritmus felállít egy fontos szabályt:
 
''Egyetlen fekete elem sem hivatkozik fehér elemre.''
 
Ez biztosítja, hogy minden fehérrel jelölt elem biztonságosan törölhető, ha a szürke lista kiürül.
 
A módszernek van egy nagy előnye: az alkalmazás futásával párhuzamosan működik, anélkül, hogy jelentős időre megakasztaná azt. Ahogy az objektumok allokálodnak egyben jelölést is kapnak, ez pedig elkerülhetővé teszi a komplett memória átvizsgálását a gyűjtés alatt. Azáltal, hogy a szemétgyüjtő folyamatosan tisztában van az objektumok számával mindig a megfelelő időben kezdheti meg a működését, nem pedig akkor ha az alkalmazás erőforrás szűkében van.
 
==Források==