¿Cuál es la definición exacta de ' atomicidad ' en programación?

la definición de «atomicidad» dice que una transacción debe poder ser terminada sin ser tocada o manipulada por acciones en ejecución posiblemente concurrentes durante su proceso. ¿Pero eso también significa que un programa no debería ejecutarse simultáneamente cuando se supone que es atómico?

digamos que tenemos 2 programas como ejemplo:

example_program1:

cuenta int i = 1 a 100 cada segundo

cada número se imprime en una nueva línea

example_program2:

solo imprime » hi »

y un programa principal que incluya ambos programas y ejecutarlos una vez que reciba una señal para iniciar un programa específico (por ejemplo, a través de sigaction en Linux) con la versión 2:

versión 1:

ejecuta el programa (incluso concurrente) en cualquier momento una vez que recibe la señal

lo que significa que program2 puede imprimir » hi » mientras program1 todavía está imprimiendo los números

versión 2:

solo ejecutar un programa a la vez

la señal de otro programa se bloquea hasta que el programa en curso haya terminado

en este ejemplo, solo puede la versión 2 se considerará atómica o ambas? ¿Este programa sería no atómico solo si, por ejemplo, el programa2 incrementara i en 1 durante su proceso?

Comentarios

  • El término » atomic » se usa de (varias) formas diferentes en diferentes contextos. A veces de formas muy similares pero aún diferentes. A menudo también se usa de manera informal. Su pregunta comienza con una definición que parece basarse en la teoría de las bases de datos, pero luego habla de programas. Su definición habla de » transacciones » pero no hay transacciones en su programa. Es ‘ probable que estés usando inadvertidamente la definición incorrecta de » atomic «. (Su definición de atomicidad tampoco ‘ realmente coincide con su significado a la ACID.)

Respuesta

Si una operación X es atómica, eso significa que cualquiera que observe la operación la verá como aún no iniciada o completada, y no en ningún estado que esté parcialmente completado. Eso es todo.

Obviamente, si escribe código para realizar una operación X, y otro código puede verlo medio realizado, o interferir con él, entonces su implementación de la operación X no es atómica.

En algunos contextos, una operación «atómica» puede tener éxito o fallar; si dicha operación atómica falla, el efecto debe ser exactamente el mismo que si la operación nunca se hubiera iniciado.

Comentarios

  • Como nota, esto es lo que significa Aislamiento en ACID, no lo que significa Atomicidad. No ‘ está claro si La definición pretende coincidir / cubrir la noción ACID de atomicidad (que no es ‘ t terriblemente relevante para el código arbitrario).

Respuesta

No estoy seguro de conocer una definición simple, formal y abstracta de «atómico» para un lenguaje de programación. Conozco muchos diferentes en varios niveles de abstracción y con respecto a varios temas. También conozco algunos que parecen bastante abstractos pero tienen requisitos previos bastante sofisticados (por ejemplo, modelos de concurrencia preheaf). Parte del problema es que hay muchas formas diferentes de decir que dos programas «se comportan» «de manera equivalente» y algunas definiciones pueden respetar diferentes nociones de «equivalente».

Un boceto (que estoy haciendo hasta ahora) de un enfoque con respecto a un modelo intercalado de concurrencia es: Dada una semántica operativa, una secuencia de declaraciones se se ejecuta atómicamente si todas las transiciones (de la semántica operativa) que involucran esas declaraciones ocurren en secuencia. Una secuencia de declaraciones es atomic si todas las posibles secuencias de transiciones ejecutan la secuencia de declaraciones de forma atómica. Podríamos aflojar esto a un « como si se hubieran ejecutado de forma atómica» que podríamos comenzar a formalizar diciendo que todas las posibles secuencias de transiciones son equivalentes ( presumiblemente equivalente observacionalmente) a una secuencia de transiciones que ejecuta las declaraciones de forma atómica.

B Asicamente, ejecutado atomicamente significa que una vez que comenzamos a ejecutar alguna secuencia de sentencias, no intercalamos la ejecucion con ninguna otra sentencia en la ejecucion de la secuencia.En cuanto a la implementación, esto podría significar que solo ejecutamos un subproceso a la vez, como en una implementación de subprocesos que divide el tiempo, y una secuencia de declaraciones ejecutadas de forma atómica significa que no hubo cambios de contexto durante su ejecución. La definición anterior tiene el problema de que realmente no maneja bien la coordinación entre subprocesos. Realmente no tendría sentido decir que la comunicación a lo largo de un canal entre dos subprocesos, por ejemplo, alguna vez fue atómica. (A menudo hablamos de operaciones en una estructura de datos como atómicas, y eso probablemente sería más apropiado para este ejemplo. La definición sería específica para la estructura de datos).

Para su programa de ejemplo y asumiendo un semántica operacional donde una instrucción print podría manejarse en una sola transición, entonces el Programa 2 siempre se ejecutaría atómicamente y es (bastante trivialmente) atómico. Su segunda ejecución describe un escenario donde el Programa 1 se ejecuta de forma atómica mientras que la primera no. Si hubiera algún mecanismo que garantizara que su segunda ejecución siempre sucediera, entonces podría decir que el Programa 1 (con ese mecanismo) era atómico, pero de lo contrario presumiblemente no sería atómico por sí solo.

Como se menciona en mi comentario, «atómico» se usa a menudo en un sentido informal y / o orientado a la implementación. Por lo tanto, lo que se pretende exactamente a menudo no está claro, aunque el espíritu de lo que se pretende suele ser razonablemente claro.

Respuesta

El origen antiguo y profundo y oscuro de la palabra Atomic en programación se refiere a una instrucción en lenguaje ensamblador ATOMIC. De la misma manera que un grupo de partículas individuales (protón, neutrón, electrón) forman una sola unidad irrompible llamada átomo, en la programación ATOMIC se refiere a un grupo de instrucciones de ensamblaje que forman una sola instrucción de unidad ininterrumpida . La primera instrucción de ensamblaje es ATOMIC, que suspende todas las interrupciones hasta que se reinician con algo como UNATOMIC.

Desde entonces, la palabra ATOMIC ha sido muy mal utilizada por el marketing. Llamar a una sola instrucción ATOMIC es una tontería.

ATOMIC era originalmente un acrónimo, creo que podría haber sido «¿Un conjunto? De múltiples grupos de instrucciones». Lo siento, no estoy seguro acerca de la T, se ha muchos años.

Comentarios

  • Calling a single instruction ATOMIC is just silly bueno, ha habido atómico transferencias de memoria que involucran más de un ciclo de bus, así como instrucciones como Probar y configurar .

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *