Cheney-algoritmus
Kiejtés
- IPA: [ ˈhɛnɛiɒlɡoritmuʃ]
Főnév
Cheney-algoritmus
A Cheney-algoritmus egy szemétgyűjtő (garbage collection) technika, amelyet C. J. Cheney javasolt 1970-ben. Az algoritmus az automatikus memória-kezelés egyik hatékony módszere, amelyet elsősorban a félterület-alapú szemétgyűjtés (semispace garbage collection) megvalósítására használnak. Az algoritmus a dinamikusan lefoglalt objektumok élő halmazának másolásán alapul.
Fő ötlet
A memória két részre, úgynevezett félterületekre (semispaces) oszlik: 1. Aktív terület (from-space): A futó program által használt memória aktuális része. 2. Tartalék terület (to-space): Egy üres memóriaterület, amelyet a szemétgyűjtés során használnak az élő objektumok átmásolására.
A Cheney-algoritmus a következőképpen működik: 1. Az élő objektumokat (azokat az objektumokat, amelyek elérhetők a gyökérből) átmásolja a tartalék területre. 2. A másolás során a gyökérből indulva rekurzívan átmásolja az összes élő objektumot és azok hivatkozásait. 3. Az átmásolás után az eredeti aktív terület felszabadul, és a két terület szerepe felcserélődik.
Lépések
1. Inicializálás
- A memória két egyenlő méretű félterületre oszlik.
- A program az aktív területet használja az objektumok allokálására.
2. Gyökérpontok mentése
- A gyökérpontok (pl. globális változók vagy a verem lokális változói) azonosítása.
3. Másolás a tartalék területre
- Az algoritmus a gyökérpontokból kiindulva átmásolja az objektumokat a tartalék területre.
- A másolás során a hivatkozásokat is frissíti.
4. Iteratív bejárás
- Egy másoló mutató (scan pointer) bejárja az összes átmásolt objektumot, és rekurzívan másolja azok hivatkozásait.
5. Területcsere
- Miután minden élő objektum átmásolásra került, a két terület szerepe felcserélődik:
- A tartalék terület válik az új aktív területté.
- Az eredeti aktív terület felszabadul.
Pszeudokód
Cheney(from_space, to_space, roots): // Másoló mutatók inicializálása allocate_ptr = to_space.start scan_ptr = to_space.start // Gyökér objektumok másolása for root in roots: root = CopyObject(root, allocate_ptr) // Élő objektumok iteratív bejárása while scan_ptr < allocate_ptr: for reference in scan_ptr.references: reference = CopyObject(reference, allocate_ptr) scan_ptr += scan_ptr.size // Területcsere from_space, to_space = to_space, from_space function CopyObject(object, allocate_ptr): if object already copied: return object.forwarding_address new_object = allocate_ptr copy object to allocate_ptr object.forwarding_address = new_object allocate_ptr += object.size return new_object
Példa működés
Bemenet:
- Objektumok:
- ( A ): gyökér objektum, hivatkozik ( B )-re és ( C )-re.
- ( B ): hivatkozik ( D )-re.
- ( C ): nincs hivatkozása.
- ( D ): nincs hivatkozása.
Lépések:
- Gyökér átmásolása:
- ( A ) átmásolása az új területre.
- Hivatkozások másolása:
- ( B ) és ( C ) átmásolása az új területre.
- ( D ) átmásolása az új területre ( B ) hivatkozása alapján.
- Területcsere:
- A régi aktív terület felszabadul.
Python implementáció
Az alábbi egy egyszerű implementáció a Cheney-algoritmus működésének szimulálására:
class Object:
def __init__(self, name, references=[]):
self.name = name
self.references = references
self.forwarding_address = None
def cheney(from_space, to_space, roots):
allocate_ptr = 0
scan_ptr = 0
# Másolás gyökér objektumokhoz
for i, root in enumerate(roots):
roots[i] = copy_object(root, from_space, to_space, allocate_ptr)
allocate_ptr += 1
# Iteratív bejárás
while scan_ptr < allocate_ptr:
current_object = to_space[scan_ptr]
for i, ref in enumerate(current_object.references):
current_object.references[i] = copy_object(ref, from_space, to_space, allocate_ptr)
allocate_ptr += 1
scan_ptr += 1
return to_space[:allocate_ptr]
def copy_object(obj, from_space, to_space, allocate_ptr):
if obj is None:
return None
if obj.forwarding_address is not None:
return obj.forwarding_address
to_space[allocate_ptr] = obj
obj.forwarding_address = allocate_ptr
return obj
# Példa objektumok
A = Object("A")
B = Object("B")
C = Object("C")
D = Object("D")
A.references = [B, C]
B.references = [D]
from_space = [A, B, C, D]
to_space = [None] * len(from_space)
roots = [A]
# Futassuk az algoritmust
new_space = cheney(from_space, to_space, roots)
print("Átmásolt objektumok:", [obj.name for obj in new_space if obj is not None])
Kimenet:
Átmásolt objektumok: ['A', 'B', 'C', 'D']
Előnyök
- Hatékonyság:
- Az algoritmus lineáris időben fut ((O(n))), ahol (n) az élő objektumok száma.
- Egyszerűség:
- A másolási szemétgyűjtés automatikusan kezeli a memóriát és felszabadítja a nem használt területet.
- Hivatkozások frissítése:
- Az algoritmus automatikusan frissíti a hivatkozásokat az új memóriacímmel.
Hátrányok
- Memóriaigény:
- A memória fele mindig tartalékként van fenntartva, ami növeli a memóriaigényt.
- Objektumok mozgatása:
- Az objektumok átmásolása miatt a hivatkozások frissítése jelentős költséggel járhat.
- Csak élő objektumokra koncentrál:
- Az algoritmus nem alkalmas nagy memóriaterületekhez, ha az objektumok nagy része szemét.
Alkalmazások
- Virtuális gépek:
- Lisp, Java és más nyelvek futtatókörnyezeteiben használatos.
- Számítógépes grafikák:
- Az élő objektumok hatékony kezelése animációk során.
- Beágyazott rendszerek:
- Korlátozott memóriájú rendszerekben is hatékony.
Összegzés
A Cheney-algoritmus egy egyszerű és hatékony technika a dinamikus memória automatikus kezelésére. Bár memóriaterületet pazarol, lineáris futási ideje és az élő objektumok kezelésének garantált pontossága miatt széles körben alkalmazzák a szemétgyűjtési rendszerekben. Az algoritmus különösen hasznos nagy és dinamikus objektumhalmazok kezelésében, ahol a memóriahatékonyság kevésbé fontos, mint a sebesség és a megbízhatóság.
- Cheney-algoritmus - Értelmező szótár (MEK)
- Cheney-algoritmus - Etimológiai szótár (UMIL)
- Cheney-algoritmus - Szótár.net (hu-hu)
- Cheney-algoritmus - DeepL (hu-de)
- Cheney-algoritmus - Яндекс (hu-ru)
- Cheney-algoritmus - Google (hu-en)
- Cheney-algoritmus - Helyesírási szótár (MTA)
- Cheney-algoritmus - Wikidata
- Cheney-algoritmus - Wikipédia (magyar)