El lenguaje Nim presenta YRC — un recolector de ciclos de referencias seguro para hilos

Andreas Rumpf (Araq), autor del lenguaje de programación Nim, ha anunciado un nuevo algoritmo de gestión de memoria YRC (se pronuncia «Ürk»), que resuelve uno de los problemas clave de los mecanismos existentes en Nim: la incapacidad para manejar correctamente las referencias cíclicas que cruzan los límites de los hilos.

Antes de la llegada de YRC, los algoritmos de gestión de memoria propuestos en Nim presentaban las siguientes limitaciones: ARC no soportaba ni la multiprocesación ni el manejo de ciclos; Atomic ARC era seguro para hilos, pero no manejaba referencias cíclicas; ORC procesaba referencias cíclicas, pero solo podía hacerlo correctamente dentro de un único hilo (al usar referencias compartidas entre hilos, se producían fugas de memoria).

El YRC propuesto combina seguridad para hilos y manejo de ciclos entre hilos, utilizando un enfoque combinado: para datos acíclicos, se aplica un conteo de referencias atómico, y para cíclicos, se utiliza una barrera de escritura (write barrier), que se activa solo al asignar punteros. En la implementación propuesta: el recolector se activa solo cuando es necesario (sin pausas 'stop-the-world'); los objetos raíz RC están claramente definidos y se combinan una vez (no se requiere escanear las pilas de hilos); se evita la eliminación multihilo durante la iteración (no hay una fase global de barrido); los mutadores pueden leer datos libremente; cualquier hilo puede iniciar el recolector de basura según sea necesario (sin un hilo de GC dedicado).

YRC utiliza información completa sobre eventos incRef/decRef, que los recolectores de basura tradicionales basados en trazas (tracing GC) descartan y luego deben recuperar mediante el escaneo de pilas y el recorrido del grafo. La implementación consta de solo 550 líneas de código y cuenta con verificación formal de seguridad y ausencia de bloqueos mutuos a través de especificaciones en el lenguaje TLA+ y una prueba en el entorno Lean. YRC se posiciona como "casi el último recolector de ciclos basado en conteo de referencias" (la letra Y precede a la Z en el alfabeto), así como el recolector de basura seguro para hilos más simple: según el autor, no requiere muchos de los complejos mecanismos propios de los recolectores de basura tradicionales basados en trazas.

YRC proporciona la misma API que ORC, ejecutando destructores durante la recolección de basura. El recolector solo procesa aquellos subgráfos de objetos que los hilos están utilizando, sin tocar estructuras de datos no relacionadas (cachés, objetos de larga vida) — un enfoque similar al de un recolector de basura de generación "ideal" sin el uso de generaciones. La principal desventaja es el rendimiento: YRC muestra una ralentización de 1.5 a 2.0 veces en comparación con ORC en la prueba de rendimiento orcbench. El autor considera que esto es un precio aceptable por el procesamiento seguro de hilos para los enlaces cíclicos.

YRC ya está disponible en la versión de desarrollo de Nim y se habilita con la bandera "—mm:yrc". Sin embargo, en comunicaciones posteriores, el autor reconoció que la implementación inicial contenía errores graves y no manejaba correctamente los ciclos. Al momento de la publicación, se ha preparado un conjunto de correcciones que resuelven los errores principales. El autor continúa ajustando las heurísticas de recolección y corrigiendo los errores restantes, mientras que el algoritmo básico y su verificación formal permanecen correctos.

Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster