Cheney's algorithm

Üdvözlöm, Ön a Cheney's algorithm szó jelentését keresi. A DICTIOUS-ban nem csak a Cheney's algorithm szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a Cheney's algorithm szót egyes és többes számban mondani. Minden, amit a Cheney's algorithm szóról tudni kell, itt található. A Cheney's algorithm szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. ACheney's algorithm és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

Főnév

Cheney's algorithm (tsz. Cheney's algorithms)

  1. (informatika) A Cheney-féle algoritmus egy híres garbage collection (szemétgyűjtés) algoritmus. Célja: automatikusan eltakarítani azokat a dinamikusan lefoglalt memóriaterületeket, amelyeket a program már nem használ → így elkerüljük a memória szivárgást (memory leak).

Az algoritmust 1970-ben C.J. Cheney publikálta. Fő jellemzője: egyszerű, gyors copying collector (másoló szemétgyűjtő) technika.



Előzmények — Mi az a garbage collection?

A garbage collection (GC) automatikusan felszabadítja a már nem használt memóriaterületeket.

Miért fontos?

  • Ha nem szabadítod fel a memóriát → memória szivárgás (memory leak) → elfogy a memória → program lelassul vagy összeomlik.

Programozási nyelvek, amik gyakran használnak GC-t:

  • Java
  • C#
  • JavaScript
  • Python (bizonyos fokig)
  • Lisp
  • stb.



Hogyan működik általában a garbage collection?

  1. Mark: megjelöljük azokat a memóriaterületeket, amik elérhetők (gyökértől indulva → pl. globális változók, verem (stack), CPU regiszterek).
  2. Sweep: a többi memóriaterületet (ami nincs megjelölve) felszabadítjuk → szemét.

Ez az alapvető Mark & Sweep algoritmus.

Probléma: lehet, hogy a memória fragmentálódik → sok kis szabad terület, amit nehéz jól kihasználni.



Cheney’s algorithm — a copying collector

A Cheney-féle algoritmus másképp dolgozik:

  • nem csak megjelöl → másolja az elérhető objektumokat egy új memória területre → így a memória kompakt marad → nem lesz fragmentáció.

Fő lépések:

  1. A heap két részre van osztva: From-space és To-space.
  2. Eleinte az összes objektum a From-space-ben van.
  3. Elindítjuk a GC-t → elérhető objektumokat átmásoljuk a To-space-be.
  4. Amikor az összes élő objektum a To-space-ben van → To-space lesz az új From-space → a régi From-space üres lesz → újrahasználható.



Memória felosztás

+------------------------+------------------------+
|      From-space        |        To-space        |
+------------------------+------------------------+
  • Csak két félt kell fenntartani.
  • Éppen az egyikben dolgozunk → másikba másolunk.



Részletes működés

1️⃣ Alapötlet

  • Egy GC futásnál csak a To-space-et fogjuk feltölteni.
  • Nem “takarítjuk ki” a From-space-t, csak átmásolunk.

2️⃣ Elindítás

  • Elindítjuk a GC-t.
  • Van egy gyökérhalmaz (root set): pl. globális változók, stack referenciai, regiszterek.

3️⃣ Copy + Forwarding

  • Minden elérhető objektumot átmásolunk a To-space-be.
  • Az eredeti helyére egy forwarding pointert teszünk → ha másik referencia is hivatkozik rá, nem kell újra másolni → a forwarding pointerre mutatunk.

4️⃣ Breadth-first másolás

Cheney algoritmusa breadth-first (szélességi bejárású) másolást végez.

Két mutató van:

  • scan: amit eddig már kimásoltunk → de a benne lévő referenciákat még nem dolgoztuk fel.
  • free: az aktuális szabad hely a To-space-ben → ide másolunk.

Lépések:

  • Kezdetben a root set-et másoljuk → To-space-be → scan és free mutatók beállítva.
  • Amíg scan < free, feldolgozzuk a scan által mutatott objektumot:
    • Ha az objektum referenciát tartalmaz → a referencia által mutatott objektumot is bemásoljuk (ha még nem tettük meg).
    • Előrelépünk scan-nel.
  • Ha minden kész → az összes élő objektum a To-space-ben van → kész!

5️⃣ Flip (váltás)

  • Miután a To-space tele van az élő objektumokkal → a szerepeket megfordítjuk:
    • To-space → From-space (innentől innen fogunk dolgozni)
    • Régi From-space → To-space → üres → készen áll a következő GC-re.



Miért jó a Cheney algoritmus?

Egyszerű implementáció → kevés kód.

Gyors allokáció:

  • Új objektumot a To-space végére teszünk → egyszerű pointer bumping → nincs bonyolult szabad lista.

Nincs fragmentáció:

  • Minden élő objektumot folyamatosan helyezünk el → memória “szép tömbös” marad.

O(élő objektumok mérete) → a GC futási ideje csak az élő adatok méretétől függ, nem a teljes heap méretétől!



Hátrányok

Dupla memória kell (From-space + To-space):

  • A heap felét sosem használjuk → a memóriaigény nagyobb.

Copying overhead:

  • Minden élő objektumot másolni kell → ez önmagában költség.

❌ Nem ideális, ha sok nagyméretű, hosszú életű objektum van (pl. cache-ek) → ezeket folyamatosan másolgatni kell.



Összefoglaló példa (pszeudokód)

initialize To-space and From-space

copy roots to To-space
scan = To-space.begin
free = To-space.end_of_copied_area

while (scan < free) {
    for each reference in object at scan {
        if referenced object not yet copied:
            copy referenced object to free
            set forwarding pointer
            update reference
            advance free
        else:
            update reference to forwarding pointer
    }
    advance scan
}

flip From-space and To-space

Összefoglalás

Cheney’s Algorithm jellemző Érték
GC típusa Copying collector
Memória fragmentáció Nincs
Futási idő Proporcionális az élő adatok méretéhez
Bonyolultság Alacsony
Memóriaigény Kétszeres heap



Mikor érdemes használni?

Interpreterekben (pl. Lisp, Scheme, kis runtime-ok) ✅ VM-ekben (virtual machine), ahol gyors GC kell ✅ Rövid életű objektumokkal dolgozó programoknál ✅ Oktatási célra → könnyű implementálni, könnyű megérteni



Záró gondolat

A Cheney’s Algorithm egy klasszikus, elegáns szemétgyűjtő algoritmus, amely:

  • egyszerű,
  • hatékony,
  • fragmentációmentes memóriakezelést biztosít.

Modern rendszerekben sok GC algoritmus kombinálja a copying és más technikákat (generational GC, incremental GC, stb.), de a Cheney algoritmus alapelve máig él sok interpreter és VM tervezésében.