„Szemétgyűjtés” változatai közötti eltérés

[ellenőrzött változat][ellenőrzött változat]
Tartalom törölve Tartalom hozzáadva
Nincs szerkesztési összefoglaló
B36Bot (vitalap | szerkesztései)
a Haskell, Haskell programozási nyelv → Haskell (programozási nyelv) (WP:BÜ) AWB
88. sor:
 
* A legegyszerűbb megoldás a ''kettős-űr'' -t (''semi-space'', ''two-space'' vagy ''stop-and-copy'') használó algoritmus.<ref>[http://www.memorymanagement.org/glossary/t.html#two-space.collector Semi-space]</ref> A memória két részre oszlik. Kezdetben az objektumok az első részben allokálódnak, majd amikor az megtelik meghívódik a szemétgyűjtő és az elérhető elemeket a másik rekeszbe másolja. Ekkor a szerepek megcserélődnek, a következő alkalommal a második rekeszből az elsőbe helyezi át az objektumokat, és így tovább. A módszer előnye, hogy nagyon egyszerűen működik (a három lista a másolás folyamata alatt jön létre), hátránya pedig, hogy egyszerre csak a memória fele van használatban (bár ez kiküszöbölhető a virtuális memóriát használó környezetekben, a GC gondos megírásával). A [[C. J. Cheney]], [[R. R. Fenichel]] és [[J. C. Yochelson]] által elkészített algoritmus<ref>[http://doi.acm.org/10.1145/362790.362798 C. J. Cheney: A Nonrecursive List Compacting Algorithm]</ref> ([[1970]]) ennek a módszernek a tökéletesítése.
 
* A ''mark-and-sweep'' elven működő gyűjtő egy vagy két [[bit]]et tart fenn amellyel jelöli, hogy az adott objektum fehér vagy fekete. A szürke elemek vagy egy különálló listában szerepelnek vagy egy újabb bitet kapnak. Ahogy a hivatkozások fája felépül, úgy kapják meg a megfelelő jelölést az objektumok (ez az ún. megjelölő (marking) ciklus). Végül a törölhető elemek „kisöprődnek” (sweep ciklus). Ennek a stratégiának megvan az az előnye, hogyha a hivatkozás nélküli elemek kiválasztódtak, azután a másoló és helybenhagyó módszereket egyaránt lehet használni, akár futásidőben kiválasztva a memória állapotától függően. Hátránya, hogy az objektumok mérete a hozzáadott bitek miatt megnőhet.
 
* A ''mark-and-don't-sweep'' stratégia hasonlít a társához, szintén egy plusz bit jelzi, hogy fehér vagy fekete objektumról van szó. A szürke elemek is ugyanúgy elkülönülnek. Két különbség van a két módszer között:
** Az első az, hogy minden elérhető elem mindig fekete. Amint létrejön a memóriában egy objektum automatikusan fekete jelzést kap, és ez így is marad, még akkor is, ha nincs rá érvényes hivatkozás. A fehér szín a szabad memóriát jelöli.
106 ⟶ 104 sor:
 
* A megszakításos ''(stop-the-world)'' modell, teljes mértékben felfüggeszti a program futását, így garantálva azt, hogy nem jönnek létre új objektumok és nem válnak elérhetetlenné a régiek. Ennek a módszernek a nagy hátránya, hogy a ciklus alatt az alkalmazás nem csinál semmit.
 
* A növekvényes ''(incremental)'' modell párhuzamosan fut az alkalmazással. Ebben az esetben körültekintő tervezés szükséges, hogy a program ne zavarja meg a gyűjtőt és viszont. Például, ha egy új objektumot hozna létre, akkor vagy megvárja amíg a ciklus véget ér, vagy tájékoztatja a GC -t az új egyedről.
 
* A konkurens ''(concurrent)'' modell a párhuzamos rendszerek eszköze. Valós időben párhuzamosan fut az alkalmazással. A program helyességének érdekében összetett ''lock'' rendszer szükséges.
 
132 ⟶ 128 sor:
 
* Ha két vagy több elem egymásra hivatkozik, akkor kör keletkezhet, ezért sohasem kerülnek felszabadításra. Egyes referenciaszámlálás alapú szemétgyűjtők – mint a [[CPython]]ban implementált – rendelkezik ezt a hibát kivédeni szándékozott körfigyelő algoritmusokkal.
 
* A hivatkozások élettartama elején és végén szükség van a számlálók módosítására, s bár ennek kioptimalizálására vannak jól használható módszerek, többszálas környezetben ez lockokat igényelhet, amelyek költsége igen nagy is lehet.
 
138 ⟶ 133 sor:
A magas szintű programozási nyelvek egyre inkább alapértelmezés szerint támogatják a szemétgyűjtő használatát. A standard gyűjtővel nem rendelkező nyelvekhez gyakran elérhetőek a GC-t támogató környezetek, az azt megvalósító könyvtárak.
 
A [[funkcionális programozási nyelv]]ek, mint az [[ML]], a [[Haskell (programozási nyelv)|Haskell]] vagy az [[APL]] beépített gyűjtővel rendelkeznek. A [[funkcionális programozás]]t bevezető [[Lisp]] elsőként használt szemétgyűjtőt.
 
A dinamikus nyelvek mint a [[Ruby (programozási nyelv)|Ruby]] szintén rendelkeznek szemétgyűjtővel (kivételt képeznek ez alól a [[PHP]] és [[Perl (programozási nyelv)|Perl]] nyelvek, amelyek referenciaszámlálást használnak). Az objektumorientált nyelvek – [[Smalltalk]], [[Java (programozási nyelv)|Java]], [[ECMAScript]] – szintén használják (nevezetes kivétel a [[C++]]).