Unix GC
Koleksionuesi i plehrave AF UNIX është një pjesë interesante e kokrrave. Ekziston sepse bazat mund të dërgohen me SCM DOS, por ato mund të bëhen të paarritshme nga hapësira e përdoruesit, ndërsa ende mbahen gjallë nga kokrra, gjë që nuk është e efektshme për kujtesën; në këtë situatë, koleksionuesi i plehrave ndërhyn për t’i liruar. Jo shumë kohë më parë, nën-sistemi u rishkruar nga gervishtje në krye të një modeli grafik/të lidhur fuqishëm, por është ende i prirur ndaj difektit. Ky postim ecën në fund dhe diskuton mbi një insekt të lirë pas përdorimit.
AF UNIX Garbage Collector
Një mbledhës plehrash për-substem është përgjegjës për marrjen e objekteve të kokrrave që nuk mund të arrihen më nëpërmjet dorezave të hapësirës së përdoruesit. Për AF UNIX, pika e hyrjes është unix gc) :
Fusha kritike për GC është e lehtë (1]). Një bazë është fluturimi i saj, kur dosja e ndërtimit * është duke kalëruar si një ngarkesë SCM DOS nga procesi A, ende e papranuar nga procesi B. Çdo herë që dërgohet, drita e saj rritet; çdo herë që merret, inflight është decmented. GC është duke kërkuar bazat për të cilat file counto inflight : të vetmet referenca të mbetura janë ato të bllokuara në bazat e tjera të marra rradhë, d.m.th. asnjë dorezë përdoruesi-hapësirë nuk mund t’i arrijë më.
Artikulli LWN AF UNIX GC e thotë më shkurt:
Let’s said we sending a fd of AF UNIX socket A to B dhe anasjelltas dhe mbyll çdo gjë. Kur është krijuar, çdo file udhëzues bazë fillimisht ka një referim. Pas këmbimit të fd, të dy refuncionet janë goditur deri në 2. Pastaj, nga afër, të dyja në 1. Nga kjo pikë e tutje, askush nuk mund të prekë dosjen/sucket. Megjithatë, file i strukturës ka një vlerë dhe kështu nuk e quan kurrë funksionin e lëshimit të socket AF UNIX. Kjo është arsyeja pse duhet të gjurmojmë të gjitha bazat AF UNIX dhe të bëjmë mbledhjen e plehrave.
Kokrra mban një numër global unix tot inflight, rritet në çdo tranzicion inflight dhe decremented në çdo pranuar.
(UNIX INFIGHT TRIGGER GC = 16000 .)
Një socket mbyllur, në qoftë se diçka është e paqartë:
Koleksionuesi i para-24 është përshkruar mirë në postimin e Google P0, gjendja kuantike e mbledhjes së kokrrave të misrit Linux, e cila mbulon si algoritmin, ashtu edhe të 2021 Android në shfrytëzimin e egër. Ky postim është shoqëruesi i rekomanduar, këtu është vetëm përmbledhja me një rresht: GC e vjetër eci grafikun e ndriçimit, ciklet e shënuara, dhe kontrolloi infflight!= refcount për të vendosur nëse çdo cikël ishte i koleksionueshëm.
[Ajo] zëvendëson zbatimin aktual të GC-së që mbyll çdo bazë të ndritshme merr rradhë dhe kërkon mashtrim në vende të tjera. GC i ri nuk mbyll çdo socket në radhë për të minimizuar efektin e tij dhe përpiqet të jetë i lehtë nëse nuk ka referim cyclik apo asnjë përditësim në formë të grafit fd inflight.
Çdo bazë e ndritshme bëhet një vertex ; çdo dosje udhëzuese mbështetëse * e mbajtur në një cmsg SCM ADS bëhet një buzë e drejtuar (paraardhësi → ).
Shembull D. Tre baza drite (A, B, C (jo D), duke dhënë grafikun:
Algoritmi Tarjan e ndan këtë grafik në përbërës të lidhur fort. Pse SCC-të? Për çdo grafik të drejtuar, çdo SCC e më shumë se një vertex përmban domosdoshmërisht të paktën një cikël:
Një cikël është i nevojshëm por jo i mjaftueshëm për një vertex që të jetë i koleksionueshëm: koleksioni kërkon që verteksi të jetë i dukshëm dhe i paarritshëm nga përdoruesi-hapësirë (file count out grade) Sockets jo në çdo cikël nuk mund të jetë ndoshta e vendosur reciprokisht mbeturinat, dhe janë anashkaluar.
uix graph maybe cyclic është ndryshuar në sa herë që shtohet një buzë e re me të dy pikat e fundit:
Ki parasysh që unix pditu grafia) rivendos gjithashtu unix graph grouped = i rremë , duke detyruar GC të rindërtojë SCC-të nga zero.
Disponimi midis rrugëve të ngadaltë dhe të shpejta:
Këtu janë ndërtuar SCC-të:
Treguesi fillon tek UNIX VERSIX INDEX START = 2. Në krye të këtij grafiku merret acyclik; ecja e nxit atë përsëri në citolik nëse dhe vetëm nëse gjen një cikël.
Shënim i ndërlikuar. E jashtme, ndërkohë që është vetëm një herë, grafiku është një pyll me nën-grafi të shkëputura. Për çdo grafik me lidhje të dobët GYV, E) një përsëritje e vetme viziton çdo vertex. Kostoja fund-fundi është O⇩VY + udhërrëfyese).
Algoritmi i Tarjan-it merr një grafik të drejtuar dhe prodhon SCC-të e tij. Çdo verteks përfundon saktësisht në një SCC; vertikë pa asnjë cikël që vjen apo largohet, një SCC e parëndësishme. Ideja është një DFS ku çdo vertex fillon të etiketohet (index, scc glus) = (k, k) për një rritje monotonalisht k, dhe më pas fqinjët, vlerat scc profesionale janë përhapur përsëri në një stuck në mënyrë që të gjitha verticet në një cikël të kombinuar në scc blogun më të vogël në këtë cikël.
Shih faqen Wikipedia për shkrimin zyrtar.
Pseudo kod, duke krahasuar kokrrat në formën iterative:
Kur grafiku është i pandryshuar që kur GC e fundit (unix graph grouped real ), SCC-të ripërdoren si:
Rruga e shpejtë ecën çdo SCC me radhë të kundërt (5] ), lëviz çdo vertex në listën e vizituar (6]) dhe shkon unix vertex vdead (7] ). Nëse çdo vertex në
