A Nim nyelvben bemutatkozott az YRC — szálbiztos ciklikus hivatkozásgyűjtő.

Andreas Rumpf (Araq), a szerző a Nim programozási nyelv mögött, bejelentette az új YRC memória kezelési algoritmust (kiejtése: „Ürk”), amely megoldja a Nim létező mechanizmusainak egyik kulcsfontosságú problémáját: a szálak közötti határvonalakat átszelő ciklikus hivatkozások helyes kezelésének lehetetlenségét.

A YRC megjelenését megelőzően a Nim által javasolt memória kezelési algoritmusoknak a következő korlátozásai voltak: ARC — nem támogatta sem a több szálat, sem a köröket; Atomic ARC — szálbiztos volt, de nem kezelte a ciklikus hivatkozásokat; ORC — kezelte a ciklikus hivatkozásokat, de ezt csak egy szálon belül tudta helyesen megtenni (a szálak közötti megosztott hivatkozások használatakor memória szivárgások léptek fel).

A javasolt YRC egyesíti a szálbiztonságot és a körök kezelését a szálak között egy kombinált megközelítéssel: az aciklikus adatokhoz atomikus hivatkozás számítást alkalmaz, míg a ciklikusakhoz egy írási korlátot (write barrier), amely csak a mutatók hozzárendelésekor aktiválódik. A javasolt implementációval: a gyűjtő tényleges szükség esetén indul el (nincs stop-the-world szünet); a gyökér objektumok RC világosan vannak meghatározva és egyszer egyesítve (nincs szükség a szálak veremének átvizsgálására); elkerülhető a több szálas eltávolítás iteráció közben (nincs globális letakarítási fázis); a mutátorok szabadon olvasnak adatokat; bármely szál elindíthatja a szemétgyűjtőt szükség esetén (nincs dedikált GC szál).

A YRC teljes információt használ az incRef/decRef eseményekről, amelyet a hagyományos nyomozó szemétgyűjtők (tracing GC) elvetnek, majd kénytelenek visszaállítani verem átvizsgálással és gráf átböngészéssel. Az implementáció mindössze 550 kódsorból áll, és formális biztonsági és holtlock-mentességi verifikációval rendelkezik a TLA+ nyelven írt specifikáció és a Lean eszközkeret segítségével. A YRC „majdnem az utolsó ciklus gyűjtő a hivatkozás számításon alapuló gyűjtők között” (a Y megelőzi a Z-t az ábécében), valamint a legegyszerűbb szálbiztos szemétgyűjtőként van pozicionálva — a szerző állítása szerint nem igényel sok bonyolult mechanizmust, amely a hagyományos nyomozó szemétgyűjtők sajátja.

A YRC ugyanazt az API-t biztosítja, mint az ORC, azzal a különbséggel, hogy a destruktorok a szemétgyűjtés során hajtódnak végre. A gyűjtő csak azokat az objektum-algoritmusokat dolgozza fel, amelyekkel a szálak dolgoznak, anélkül, hogy érintené a kapcsolódó struktúrákat (például cache-eket, hosszú élettartamú objektumokat) — hasonló megközelítéssel, mint az "ideális" generációs szemetet gyűjtő, generációk használata nélkül. A fő hátrány a teljesítmény: a YRC teljesítménye 1,5-2,0-szer lassabb, mint az ORC az orcbench teszt során. A szerző ezt a teljes szálbiztos körkörös hivatkozások kezelésének költségeként tekinti.

A YRC már elérhető a Nim fejlesztési verziójában, és a "—mm:yrc" kapcsoló aktiválásával használható. Azonban a következő bejegyzésekben a szerző elismerte, hogy az eredeti megvalósítás súlyos hibákat tartalmazott, és nem kezelte a ciklusokat helyesen. A publikáció időpontjára egy javítási csomag készült, amely kiküszöböli a fő hibákat. A szerző folytatja a szemetelési heurisztikák finomítását és a fennmaradó hibák kijavítását, miközben az alap algoritmus és annak formális verifikációja helyesnek marad.

Forrás: opennet.ru

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster