Numărarea linkurilor

Numărarea referințelor este o  tehnică de stocare a numărului de referințe , pointeri sau descriptori la o resursă, cum ar fi un obiect sau un bloc de memorie. Utilizat de obicei ca mijloc de eliberare a obiectelor care nu mai sunt necesare și care nu mai sunt referite.

Utilizare în colectarea gunoiului

Numărarea referințelor este cunoscută și ca unul dintre algoritmii de colectare a gunoiului , în care fiecare obiect conține o contorizare a numărului de referințe la el utilizate de alte obiecte. Când acest contor scade la zero, înseamnă că obiectul a devenit indisponibil și este plasat pe lista de obiecte de distrus.

Numărarea simplă a referințelor necesită actualizări frecvente ale contorului. Ori de câte ori o referință la obiect este distrusă sau suprascrisă, numărul referințelor acelui obiect este decrementat, iar atunci când oricare dintre referințele obiectului este creată sau copiată, numărul referințelor obiectului este incrementat.

Numărarea referințelor este, de asemenea, utilizată în sistemele de operare pe disc și sistemele distribuite, unde colectorii de gunoi de urmărire completă non-incrementală ar consuma prea mult timp din cauza dimensiunii graficului obiectelor interconectate și a vitezei de acces reduse.

Avantaje și dezavantaje

Principalul avantaj al numărării referințelor față de urmărirea colectoarelor de gunoi este că obiectele sunt îndepărtate de îndată ce nu pot fi referite, și într-o manieră incrementală, fără pauze lungi pentru ciclurile de colectare și cu o durată de viață clar definită a fiecărui obiect. În aplicațiile în timp real sau sistemele cu memorie limitată, acest lucru este foarte important pentru a menține timpi de răspuns rapid. Numărarea referințelor este, de asemenea, una dintre cele mai simple moduri de a implementa colectarea gunoiului. De asemenea, oferă o gestionare eficientă nu numai a memoriei, ci și a altor tipuri de resurse, cum ar fi obiectele sistemului de operare, care sunt adesea mult mai rare decât memoria (sistemele cu urmărire a colectării gunoiului folosesc finalizatoare pentru aceasta , dar curățarea întârziată poate cauza totuși probleme) . Numărările de referință ponderate sunt o soluție bună pentru colectarea gunoiului în sistemele distribuite.

Numărările de referință sunt, de asemenea, utile ca intrare pentru diferite optimizatoare de rulare. De exemplu, sistemele puternic dependente de obiecte imuabile (multe limbaje funcționale ) pot pierde performanța din cauza operațiilor frecvente de copiere. Totuși, dacă știm că un obiect are o singură legătură, iar această legătură se pierde, dar în același timp este creat un nou obiect similar (ca în expresia pentru adăugarea unui șir str ← str + "a"), putem înlocui această operație cu o modificare ( Mutație engleză  ) obiect original.

Numărarea referințelor în forma sa cea mai simplă are două dezavantaje majore în comparație cu urmărirea colectării gunoiului , ambele necesită mecanisme suplimentare de îmbunătățire:

Reprezentare grafică

Când lucrați cu scheme de colectare a gunoiului, este adesea convenabil să ne gândim la un grafic de legătură , care este un grafic direcționat în care vârfurile sunt obiecte, iar dacă obiectul A conține o referință la obiectul B, vârfurile sunt conectate printr-o muchie de la vârful A. la B. Există și vârfuri speciale care reprezintă variabile locale sau referințe legate de mediul de execuție (runtime). Muchiile nu indică niciodată aceste vârfuri, dar muchiile pot merge de la aceste vârfuri la altele.

În acest context, cel mai simplu număr de referințe a unui obiect este numărul de muchii de intrare ale unui vârf. Ștergerea unui vârf înseamnă eliberarea (ștergerea) obiectului. Ștergerea unui vârf are loc atunci când un vârf nu mai are margini de intrare. Prin urmare, ștergerea nu afectează numărul de margini de ieșire ale altor vârfuri, dar poate afecta numărul de margini de intrare ale acestora, ceea ce, la rândul său, poate duce la eliberarea obiectelor corespunzătoare.

Link -uri