Stackful Fibers, también conocidas como coroutines o green threads, son una forma de concurrencia cooperativa donde las unidades de ejecución (fibers) gestionan explícitamente su propio stack de llamadas. A diferencia de los threads del sistema operativo, que son gestionados por el kernel y tienen un stack independiente, los Stackful Fibers son implementados en el espacio de usuario y pueden suspender su ejecución y reanudarla posteriormente desde el mismo punto, manteniendo todo su contexto (incluyendo variables locales y el program counter). Esto se logra guardando y restaurando el stack completo del fiber, lo que les permite comportarse como funciones que pueden pausarse y reanudarse, manteniendo su estado a través de múltiples llamadas.

En el mundo real, los Stackful Fibers son utilizados en sistemas que requieren alta concurrencia con bajo overhead de switching de contexto. Ejemplos notables incluyen Go con sus 'goroutines' (aunque Go las implementa de manera ligeramente diferente, su modelo de concurrencia se inspira en fibers), Erlang con sus 'processes' ligeros, y frameworks de concurrencia asíncrona como 'gevent' en Python o 'libmill' en C. También son fundamentales en lenguajes como Rust a través de crates como 'async-std' o 'tokio' cuando se utilizan ejecutores que implementan un modelo de concurrencia basado en tareas cooperativas. Su uso es prevalente en servidores de red de alto rendimiento, sistemas de bases de datos y aplicaciones que manejan un gran número de conexiones concurrentes.

Para un arquitecto, la elección de Stackful Fibers es estratégica para lograr alta escalabilidad y eficiencia en sistemas concurrentes. Ofrecen un modelo de programación más simple para la concurrencia secuencial ('sequential-looking concurrent code') en comparación con callbacks o futures anidados, reduciendo la complejidad del código. Sin embargo, implican trade-offs: la programación cooperativa requiere que el código ceda explícitamente el control, lo que puede llevar a problemas de 'starvation' si un fiber monopoliza la CPU. La gestión del tamaño del stack para cada fiber es crucial para evitar desbordamientos o desperdicio de memoria. La decisión de usar Stackful Fibers frente a threads del SO o modelos 'stackless' (como async/await en JavaScript o C#) depende de los requisitos de rendimiento, la complejidad del modelo de concurrencia deseado y la capacidad de la plataforma para gestionar eficientemente un gran número de stacks pequeños.