Le langage Nim a introduit YRC — un collecteur de liens cycliques thread-safe

Andreas Rumpf (Araq), l'auteur du langage de programmation Nim, a annoncĂ© un nouvel algorithme de gestion de la mĂ©moire YRC (prononcĂ© « Ürk »), qui rĂ©sout l'un des problĂšmes clĂ©s des mĂ©canismes existants dans Nim : l'impossibilitĂ© de gĂ©rer correctement les rĂ©fĂ©rences circulaires traversant les frontiĂšres des threads.

Avant l'apparition de YRC, les algorithmes de gestion de la mémoire proposés dans Nim présentaient les limitations suivantes : l'ARC ne supportait ni la multiprogrammation, ni la gestion des cycles ; l'Atomic ARC était sûr pour les threads, mais ne gérait pas les références circulaires ; l'ORC gérait les références circulaires, mais pouvait le faire correctement uniquement à l'intérieur d'un seul thread (l'utilisation de références partagées entre les threads entraßnait des fuites de mémoire).

Le YRC proposĂ© combine la sĂ©curitĂ© des threads et la gestion des cycles entre threads, grĂące Ă  une approche combinĂ©e : pour les donnĂ©es acycliques, il applique un comptage de rĂ©fĂ©rences atomiques, et pour les donnĂ©es circulaires, un barrier d'Ă©criture (write barrier) qui s'active uniquement lors de l'attribution de pointeurs. Dans la mise en Ɠuvre proposĂ©e : le collecteur est dĂ©clenchĂ© en fonction des nĂ©cessitĂ©s rĂ©elles (absence de pauses stop-the-world) ; les objets racines RC sont explicitement dĂ©finis et unis une seule fois (aucun balayage des piles des threads n'est nĂ©cessaire) ; l'Ă©limination multi-thread pendant l'itĂ©ration est Ă©vitĂ©e (pas de phase de balayage globale) ; les mutateurs lisent librement les donnĂ©es ; tout thread peut lancer le ramasse-miettes si nĂ©cessaire (sans thread GC dĂ©diĂ©).

Le YRC utilise des informations complĂštes sur les Ă©vĂ©nements incRef/decRef, que les collecteurs de dĂ©chets traçants traditionnels (tracing GC) rejettent puis doivent restaurer via le balayage des piles et le parcours du graphique. L'implĂ©mentation ne nĂ©cessite que 550 lignes de code et possĂšde une vĂ©rification formelle de sĂ©curitĂ© et d'absence de blocage mutuel via une spĂ©cification en TLA+ et une dĂ©monstration dans l'outil Lean. Le YRC se positionne comme « presque le dernier collecteur de cycles basĂ© sur le comptage des rĂ©fĂ©rences » (la lettre Y prĂ©cĂšde Z dans l'alphabet), ainsi que comme le collecteur de dĂ©chets le plus simple et sĂ»r pour les threads — selon l'auteur, il ne nĂ©cessite pas de nombreux mĂ©canismes complexes prĂ©sents dans les collecteurs de dĂ©chets traçants traditionnels.

YRC fournit la mĂȘme API que ORC, avec l'exĂ©cution des destructeurs pendant le ramassage des ordures. Le ramasse-miettes ne traite que les sous-graphes d'objets auxquels les threads accĂšdent, sans toucher aux structures de donnĂ©es non liĂ©es (caches, objets Ă  longue durĂ©e de vie) — une approche similaire Ă  celle d'un ramasse-miettes gĂ©nĂ©rationnel « idĂ©al » sans utilisation de gĂ©nĂ©rations. Le principal inconvĂ©nient rĂ©side dans les performances : YRC montre un ralentissement de 1,5 Ă  2,0 fois par rapport Ă  ORC dans le test de performance orcbench. L'auteur considĂšre que c'est un prix acceptable Ă  payer pour un traitement complet des cycles de rĂ©fĂ©rence en toute sĂ©curitĂ© des threads.

YRC est dĂ©jĂ  disponible dans la version dĂ©veloppement de Nim et s'active avec le drapeau « —mm:yrc ». Cependant, dans les messages suivants, l'auteur a reconnu que la premiĂšre implĂ©mentation contenait de graves erreurs et ne collectait pas correctement les cycles. Au moment de la publication, un ensemble de correctifs a Ă©tĂ© prĂ©parĂ© pour rĂ©soudre les principaux bugs. L'auteur continue d'ajuster les heuristiques de ramassage et de corriger les erreurs restantes, l'algorithme de base et sa vĂ©rification formelle restant corrects.

Source : opennet.ru

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster