Cómo aprovechar las interrupciones del procesador como barreras de memoria en programación lock-free

Fuentes: Preemption is GC for memory reordering

En los sistemas operativos modernos, la multitarea preemptiva es un coste asumido: igual que la recolección de basura, ya se paga por ella y conviene sacarle partido. Este trabajo explora una idea concreta: tratar las interrupciones como fuente de barreras de memoria gratuitas para código lock-free en espacio de usuario, sin instrucciones explícitas de fencing.

El artículo parte de una observación técnica: en x86, el retorno de un manejador de interrupciones es una operación totalmente serializante, por lo que cualquier instrucción en curso se completa antes o se reinicia tras la vuelta al espacio de usuario. Esa propiedad puede aprovecharse para ordenar accesos a memoria, complementando técnicas como Bounded TSO, que limita el número de stores en vuelo para garantizar vivacidad sin barreras, pero adolece de la dificultad de traducir cuentas de instrucciones a tiempo real. Las interrupciones, en cambio, permiten inferir cuándo ha transcurrido tiempo real suficiente para que escrituras anteriores se hayan retirado, aunque con una latencia más conservadora.

El autor llegó a esta conclusión tras implementar dos primitivas de sincronización lock-free: los event counts, una especie de contador de versión sobre el que los hilos pueden esperar durmiendo en lugar de girar activamente, y los volteos de flag asimétricos usados en hazard pointers y epoch reclamation. Ambas usan interrupciones como mecanismo de ordenación. El texto describe con detalle la implementación de los event counts sobre x86-TSO y futexes, resuelve el problema de los wake-ups perdidos que sufren las variables de condición mal usadas y discute casos como un anillo lock-free entre productor y consumidor. La audiencia objetivo son lectores familiarizados con programación lock-free, técnicas de reclamación segura de memoria y modelos formales de memoria.