Total Store Ordering (TSO) es un modelo de consistencia de memoria que define cómo las operaciones de lectura y escritura (loads y stores) de múltiples procesadores se observan en un sistema multiprocesador. En TSO, las escrituras de un procesador a la memoria se propagan a todos los demás procesadores en el orden en que fueron emitidas por el procesador de origen (orden secuencial de escrituras). Sin embargo, las lecturas (loads) pueden ser reordenadas con respecto a las escrituras (stores) dentro de un mismo procesador, siempre que no haya dependencias de datos. Esto se logra típicamente mediante un 'store buffer' o 'write buffer' que almacena las escrituras pendientes antes de que se hagan visibles globalmente, permitiendo que las lecturas posteriores se ejecuten antes de que las escrituras previas se completen.
El modelo TSO es fundamentalmente implementado en la arquitectura de procesadores SPARC de Sun Microsystems (ahora Oracle) y es el modelo de memoria por defecto para la arquitectura x86 de Intel y AMD. Aunque x86 es más complejo y se describe a menudo como 'Processor Ordering' o 'x86-TSO', comparte las características clave de TSO: las escrituras de un procesador son vistas en orden por todos, pero las lecturas pueden adelantarse a las escrituras. Esto contrasta con modelos más fuertes como 'Sequential Consistency' o más débiles como 'Release Consistency'. Las herramientas de programación concurrente y los sistemas operativos deben tener en cuenta este modelo para garantizar la corrección, utilizando barreras de memoria (memory barriers o fences) explícitas cuando se requiere un ordenamiento más estricto para sincronización entre hilos o procesos.
Para un arquitecto de sistemas, entender TSO es crucial para diseñar software concurrente de alto rendimiento y sistemas distribuidos. TSO ofrece un equilibrio entre el rendimiento y la complejidad de la programación: es más rápido que la 'Sequential Consistency' porque permite el reordenamiento de lecturas, lo que facilita la optimización del hardware (ej. out-of-order execution). Sin embargo, requiere que los desarrolladores de software utilicen barreras de memoria (como `mfence` en x86 o `membar` en SPARC) para garantizar la visibilidad y el ordenamiento correctos de las operaciones de memoria en escenarios de sincronización. Ignorar las implicaciones de TSO puede llevar a bugs sutiles y difíciles de depurar en sistemas concurrentes, como condiciones de carrera (race conditions) o inconsistencias de datos. La elección de lenguajes de programación y bibliotecas de concurrencia que abstraen estos detalles (ej. Java Memory Model, C++ Memory Model) es una decisión estratégica importante para mitigar esta complejidad.