Uso compartido falso

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda

En las ciencias de la computación, el uso compartido falso (conocido como false sharing en Inglés) es un patrón de uso que puede reducir el rendimiento de cachés distribuidos con coherencia en los bloques de recurso de tamaño más pequeño gestionado por el mecanismo de cache.

Funcionamiento[editar]

Cuando una parte del programa intenta acceder periódicamente a datos que nunca serán alterados pero que comparten bloques de caché con datos que si son alterados, el protocolo de caché puede forzar al programa a recargar todo el bloque a pesar de no existir necesidad para ello. El sistema de caché no está al corriente de la actividad de este bloque y fuerza al programa a usar el sistema de caché como si se diera un verdadero uso compartido de un recurso.

El uso más común de este término es en la caché de procesador en sistemas multiproceso, en estos sistemas la memoria se cachea en bloques de pequeñas potencias de dos del tamaño de la palabra de procesador (por ejemplo 64 Bytes contiguos alineados). Si dos procesadores operan sobre datos independientes en la misma región de una dirección de memoria, los mecanismos de coherencia de caché forzarán esperas en la memoria además de perder ancho de banda de procesador. El uso compartido falso es inherente a los protocolos de caché sincronizada y puede existir en otros entornos como sistemas de archivos distribuidos o bases de datos.

Ejemplo[editar]

struct foo
{
    int x;
    int y;
};
 
foo f;
 
/* La siguientes funciones se ejecutan de manera concurrente: */
 
int sumar_x()
{
    int resultado = 0;
 
    for (int i = 0; i < 1000000; ++i)
    {
        resultado += f.x;
    }
 
    return resultado;
}
 
void incrementar_y()
{
    for (int i = 0; i < 1000000; ++i)
    {
        ++f.y;
    }
}

En el ejemplo, sumar_x puede necesitar re-leer f.x de la memoria (en lugar de usar la caché) a pesar de no estar escribiendo en dicha variable y a pesar de que las operaciones de incrementar_y no deberían afectar a f.x.

Herramientas[editar]

Referencias[editar]

Enlaces externos[editar]