2011-07-28 17 views
8

¿Cómo funcionan las operaciones atómicas, debajo del capó?Operaciones atómicas: debajo del capó

son operaciones atómicas de los llamados de "esperar libre"?

Estoy en busca de una descripción del "divisor mínimo común" de las operaciones atómicas. ¿Qué comparten todas las operaciones atómicas?

+0

¿Qué lenguaje de programación? ¿Qué plataforma? ¿Qué operación atómica? ¿Qué nivel de atomicidad (sistema de archivos, red, base de datos, ...)? –

+2

@Matt Ball: ¿eso importa? (actualizó la pregunta) – Pindatjuh

Respuesta

4

atomicidad como concepto se produce en varios lugares, sospecho que usted está pensando acerca de las operaciones atómicas en el código, pero hay otros significados.

Una propiedad fundamantal de una transacción de base de datos es atomicidad, ver una descripción de ACID propiedades de transacciones.

En este caso, usted tiene mucha inteligencia de base de datos, bloqueos y demás, lo que casi con seguridad implica esperar cuando dos hilos de control (o dos procesos) desean obtener los mismos datos.

Al llegar a las líneas de código que supongo que está pensando en una declaración (en algún lenguaje ficticio)

global int x = 7; 

en un único hilo

x = 25000; 

print x; 

y en otro

print x; 

¿Podemos decir algo sobre lo que se imprimirá el segundo hilo? Podríamos aceptar 7 o 25000, estaríamos menos contentos de obtener un número que fuera el byte de orden superior de 25,000 y un byte de orden inferior de 7, que conceptualmente sería el resultado de una asignación de enteros no atómicos.

Diferentes lenguajes de programación son libres de definir cualquier semántica que deseen, es concebible que algunos simplemente acepten cualquier comportamiento natural en el que trabajen (digamos 32 bit int fue atómico, 64 long no) o podrían hacer algo mucho más inteligente, y si la CPU en sí no proporciona operaciones atómicas, entonces no veo mucha alternativa a algún tipo de espera si quieren fingir atomicidad, por ej. Palabra clave sincronizada de Java

+0

La atomicidad implica esperar a que finalice su operación completa, antes de que su resultado sea visible para otras partes interesadas. ¿Es ese un resumen correcto? – Pindatjuh

+0

sí atomicity implica que no se puede obtener un resultado parcial, en algunos casos no hay posibilidad de interrupción, por lo que solo se está "esperando" una única operación de CPU, en otros se necesita una espera explícita, implementada por algún código adicional (por ejemplo, Java sincronizado) y pagar algunos gastos generales. Creo que desea saber cuándo se produce dicha sobrecarga, desafortunadamente no hay una sola respuesta, todo depende del idioma y la plataforma. – djna

+0

Una operación atómica es todo o nada. En los casos en que la operación ha comenzado, si no puede finalizar, se retira correctamente, asegurando que al fallar todo quede como estaba cuando comenzó. – MRAB

0

depende de la operación atómica que está hablando. Si está hablando de cosas a nivel de ISA, las instrucciones de "prueba y configuración" están incluidas en algunas ISA populares, creo.

+2

¿Qué es "ISA"? (La Sociedad Internacional de Automatización, Autorización de Salvaguardia Independiente, Agencia Internacional de Surf, etc. probablemente no lo sea) – Pindatjuh

+3

Arquitectura del Conjunto de Instrucciones ... como en qué programas de lenguaje ensamblador están escritos (bueno, mnemónicos para instrucciones de la máquina, pero aún así). – Patrick87

+0

¡Gracias! Nunca me gustaron los acrónimos: son bastante oscuros. – Pindatjuh

8

Si hablamos de operaciones atómicas que utilizan el mecanismo de sincronización (mutexes, semáforos, etc.) tienen que ser compatibles con el SO en máquinas con una sola CPU y con el hardware en múltiples CPU.

En una sola máquina de CPU, una secuencia de instrucciones puede hacerse "atómica" en el sentido de que no puede interrumpirse en el medio (por ejemplo, la interrupción del temporizador que da un cambio a otra secuencia) si se interrumpen las interrupciones. Esto significa que las primitivas de sincronización se pueden escribir simplemente una vez que la CPU ingrese al modo kernel y pueda acceder a los registros de control de interrupción.

En una máquina con núcleo múltiple es más complejo. Entonces las instrucciones tienen que ser verdaderamente atómicas, en todas las CPU. Esto requiere todas las CPU, no solo la que ejecuta las instrucciones atómicas, para vaciar las partes relevantes de su caché a la RAM. Este enjuague es lo que hace que la sincronización sea tan costosa en estas arquitecturas.

Las instrucciones mismos toman la forma de "prueba de bits y ajuste" en una sola operación. Esto es suficiente para implementar un mutex simple.Incluso si dos subprocesos en diferentes CPU/núcleos están ejecutando la prueba y configurando la operación al mismo tiempo en la misma dirección, solo uno obtendrá el resultado de que el bit no se configuró y ahora está configurado. Ese hilo es el que posee el mutex.

+0

Estoy tratando de obtener una descripción conceptual del "divisor común más bajo", pero gracias por su respuesta. – Pindatjuh

+0

¿Cuándo las interrupciones * alguna vez * están deshabilitadas? ¿Eso realmente se hace en realidad? Parece que tal mecanismo sería una cosa peligrosa para dejar en el espacio del usuario. –

+0

@Brian: Interruts solo se puede deshabilitar en el espacio del kernel. Por lo general, se desactivan dentro de los núcleos durante las operaciones críticas y se vuelven a activar. La situación más común es el enmascaramiento automático de interrupciones de menor prioridad cada vez que se ejecuta un controlador de interrupción. –

Cuestiones relacionadas