În limbajul Nim a fost introdus YRC — un colector de linkuri ciclice thread-safe

Andreas Rumpf (Araq), autor al limbajului de programare Nim, a anunțat un nou algoritm de gestionare a memoriei YRC (pronunțat „Ürk”), care rezolvă una dintre problemele cheie ale mecanismelor existente în Nim: imposibilitatea de a gestiona corect referințele circulare care traversează limitele firelor.

Până la apariția YRC, algoritmii de gestionare a memoriei propusi în Nim aveau următoarele limitări: ARC – nu susținea nici multithreading, nici gestionarea ciclicilor; Atomic ARC – era sigur pentru fire, dar nu gestiona referințele circulare; ORC – gestiona referințele circulare, dar corect putea face acest lucru doar într-un singur fir (utilizarea referințelor comune între fire provoca scurgeri de memorie).

YRC propus combină siguranța în fire și gestionarea ciclicilor între fire, prin utilizarea unei abordări combinate: pentru datele aciclice se aplică numărarea atomică a referințelor, iar pentru cele circulare – un barrier de scriere (write barrier), care se activează doar la atribuirea de pointeri. În implementarea propusă: colectorul este activat la necesitate (fără pauze stop-the-world); obiectele rădăcină RC sunt definite explicit și combinate o singură dată (nu este necesară scanarea stivelor firelor); se evită ștergerea multithreaded în timpul iterației (nu există o fază de curățare globală); mutatorii pot citi liber datele; orice fir poate lansa colectorul de gunoi la nevoie (fără un fir dedicat GC).

YRC folosește informații complete despre evenimentele incRef/decRef, pe care colectorii de gunoi tradiționali bazat pe trasare (tracing GC) le resping și sunt apoi obligați să le recupereze prin scanarea stivelor și traversarea grafului. Implementarea ocupă doar 550 de linii de cod și are o verificare formală a siguranței și absenței blocărilor mutuale prin specificația în limbajul TLA+ și dovada în instrumentul Lean. YRC este poziționat ca „aproape ultimul colector de cicli bazat pe numărarea referințelor” (litera Y precede Z în alfabet), precum și ca cel mai simplu colector de gunoi sigur pentru fire – conform autorului, acesta nu necesită o multitudine de mecanisme complexe specifice colectorilor de gunoi tradiționali bazate pe trasare.

YRC oferă același API ca ORC, cu executarea destructorilor în timpul colectării gunoiului. Colectorul procesează doar acele subgrafuri de obiecte cu care lucrează firele, fără a afecta structurile de date nesincronizate (caches, obiecte de lungă durată) - o abordare similară cu „colectorul de gunoi ideal” fără utilizarea generațiilor. Principalul dezavantaj este performanța: YRC arată o încetinire de 1,5-2,0 ori comparativ cu ORC în testul de performanță orcbench. Autorul consideră că aceasta este o compensație acceptabilă pentru procesarea complet sigură a firelor în cazul referințelor circulare.

YRC este deja disponibil în versiunea de dezvoltare a Nim și se activează cu flag-ul „—mm:yrc”. Cu toate acestea, în mesajele ulterioare, autorul a recunoscut că implementarea inițială conținea erori grave și nu colecta corect ciclurile. La momentul publicării, a fost pregătit un set de corecturi care elimină erorile majore. Autorul continuă să ajusteze euristicile de acumulare și să corecteze erorile rămase, având în continuare algoritmul de bază și verificarea sa formală corecte.

Sursa: opennet.ro

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster