Son barreras de memoria necesaria para el recuento de referencias atómica compartido de datos inmutable?

StackOverflow https://stackoverflow.com/questions/2599238

Pregunta

Tengo algunas estructuras de datos inmutables que me gustaría para gestionar el uso de las cuentas de referencia, compartirlos a través de roscas en un sistema SMP.

Esto es lo que las miradas código de liberación como:

void avocado_release(struct avocado *p)
{
    if (atomic_dec(p->refcount) == 0) {
        free(p->pit);
        free(p->juicy_innards);
        free(p);
    }
}

¿El atomic_dec necesita una barrera de memoria en ella? Si es así, ¿qué tipo de barrera de memoria?

Notas adicionales: La aplicación debe ejecutarse en PowerPC y x86, por lo que cualquier información específica del procesador es bienvenida. Ya sé acerca de las órdenes internas del CCG atómicas. En cuanto a la inmutabilidad, la refcount es el solamente campo que cambia con la duración del objeto.

¿Fue útil?

Solución

En x86, que se convertirá en una cerradura con el prefijo de instrucciones de montaje, como LOCK XADD.
Al ser una sola instrucción, es no interrumpible. Como añadido "feauture", los resultados de prefijo de bloqueo en una barrera de memoria completo:

  

"... bloqueado operaciones serializar todas las operaciones de carga y almacenamiento en circulación (es decir, esperar a que se complete)." ... "Las operaciones son bloqueadas atómica con respecto a todas las demás operaciones de memoria y todos los eventos visibles externamente. Sólo captura de instrucciones y accesos tabla de páginas puede pasar instrucciones bloqueados. Instrucciones bloqueadas se pueden utilizar para Sincronizar datos escritos por un procesador y leídos por otro procesador ". - Intel® 64 y Manual del IA-32 Arquitecturas de Software Developer, Capítulo 8.1.2.

Una barrera de memoria está de hecho implementa como un LOCK OR maniquí o LOCK AND en tanto .NET y JAVA JIT en x86 / x64.
Por lo que tiene una cerca completa en x86 como una ventaja adicional, ya sea que nos guste o no. :)

El PPC, es diferente. Un LL / SC par - lwarx y stwcx - con un interior de la resta se puede utilizar para cargar el operando de memoria en un registro, resta uno, entonces o bien escribir de nuevo si no había otra tienda para la ubicación de destino, o volver a intentar todo el bucle si había. Un LL / SC puede ser interrumpido.
También no significa una valla totalmente automático.
Esto sin embargo no compromete la atomicidad del contador de ninguna manera.
Sólo significa que en el caso X 86, que sucede conseguir una cerca, así, "de forma gratuita".
En PPC, se puede insertar una valla completo mediante la emisión de un (lw)sync instrucciones .

Con todo, las barreras de memoria explícita no son necesarios para el contador atómica para que funcione correctamente.

Otros consejos

Es importante distinguir entre los accesos atómicas (que garantiza que la lectura / Modificar / escritura de los valores se ejecuta como una unidad atómica) y la reordenación de memoria.

barreras de memoria entren reordenamiento de las lecturas y escrituras y reordenamiento es completamente ortogonal a la atomicidad. Por ejemplo, en PowerPC si implementa el incremento atómico más eficiente posible, entonces, que no impedirá que la reordenación. Si desea evitar la reordenación entonces necesita un lwsync o instrucción de sincronización, o algún alto nivel equivalente (C ++ 11?) Barrera de memoria.

Las afirmaciones de que "no hay posibilidad de que el compilador reordenar las cosas de una manera problemática" parece ingenuo como declaraciones generales ya las optimizaciones del compilador pueden ser bastante sorprendente y debido a las CPU (PowerPC / ARM / Alfa / MIPS en particular) las operaciones de memoria de forma agresiva de nuevo pedido .

Una caché coherente no guarda usted tampoco. Ver http://preshing.com/ para ver cómo la memoria de reordenamiento realmente funciona.

En este caso, sin embargo, creo que la respuesta es que no se requieren barreras. Esto es así porque en este caso concreto (el conteo de referencias) no hay necesidad de una relación entre el número de referencia y los otros valores del objeto. La única excepción es cuando el contador de referencias llega a cero. En ese punto, es importante asegurarse de que todas las actualizaciones de otros hilos son visibles para el hilo actual así una barrera de lectura-acquire puede ser necesario .

Es usted la intención de poner en práctica su propia atomic_dec o simplemente estás preguntando si una función de sistema suministrado se comportará como desea?

Como regla general, se aplicarán las instalaciones de incremento / reducción atómicas proporcionados por el sistema sea cual sea barreras de memoria se requieren para simplemente hacer lo correcto. En general, usted no tiene que preocuparse por las barreras de memoria a menos que usted está haciendo algo loco como la implementación de sus propias estructuras de datos sin bloqueo o una biblioteca STM.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top