Qual è la definizione esatta di ' atomicità ' nella programmazione?

la definizione di “atomicità” dice che una transazione dovrebbe essere in grado di essere terminata senza essere toccata o manipolata da eventuali azioni in esecuzione simultanee durante il suo processo. Ma questo significa anche che un programma non dovrebbe essere eseguito simultaneamente quando dovrebbe essere atomico?

diciamo che abbiamo 2 programmi come esempio:

example_program1:

conta int i = da 1 a 100 ogni secondo

ogni numero viene stampato in una nuova riga

example_program2:

stampa solo ” ciao ”

e un programma padre che include entrambi questi programmi ed eseguirli una volta ricevuto un segnale per avviare un programma specifico (ad es. tramite sigaction in linux) con la 2 versione:

versione 1:

esegue il programma (anche simultaneo) in qualsiasi momento una volta ricevuto il segnale

il che significa che programma2 può stampare ” ciao ” mentre programma1 sta ancora stampando i numeri

versione 2:

solo eseguire un programma alla volta

il segnale di un altro programma è bloccato finché il programma in corso non è terminato

in questo esempio, può solo la versione 2 può essere considerata atomica o entrambe? Questo programma sarebbe non atomico solo se, ad esempio, programma2 incrementasse i di 1 durante il suo processo?

Commenti

  • Il termine ” atomic ” viene utilizzato in (diversi) modi diversi in contesti diversi. A volte in modi molto simili ma comunque diversi. Viene spesso utilizzato anche in modo informale. La tua domanda inizia con una definizione che sembra essere basata sulla teoria dei database, ma poi parla di programmi. La tua definizione parla di ” transazioni ” ma non ci sono transazioni nel tuo programma. ‘ è probabile che tu stia utilizzando inavvertitamente la definizione sbagliata di ” atomic “. (La tua definizione di atomicità inoltre ‘ non corrisponde realmente al significato di ACID.)

Risposta

Se unoperazione X è atomica, significa che chiunque osservi loperazione la vedrà come non ancora iniziata o come completata, e non in uno stato parzialmente completato. Questo è tutto.

Ovviamente se scrivi codice per eseguire unoperazione X e un altro codice può vederla eseguita a metà, o interferire con essa, la tua implementazione delloperazione X non è atomica.

In alcuni contesti, unoperazione “atomica” può avere esito positivo o negativo; se tale operazione atomica fallisce, leffetto deve essere esattamente lo stesso che se loperazione non fosse mai stata avviata.

Commenti

  • Come nota, questo è ciò che significa isolamento in ACID, non ciò che significa atomicità. ‘ non è chiaro se il tuo la definizione è intesa a coincidere / coprire la nozione ACID di atomicità (che non è ‘ t terribilmente rilevante per il codice arbitrario).

Risposta

Non sono sicuro di conoscere una definizione semplice, formale e astratta di “atomico” per un linguaggio di programmazione. Conosco molti diversi a vari livelli di astrazione e riguardo a vari argomenti. Conosco anche alcuni che sembrano abbastanza astratti ma hanno prerequisiti abbastanza sofisticati (ad es. Modelli di concorrenza prefabbricati). Parte del problema è che ci sono molti modi diversi di dire che due programmi “si comportano” “in modo equivalente” e alcune definizioni possono rispettare nozioni differenti di “equivalente”.

Uno schizzo (che sto facendo up right now) di un approccio rispetto a un modello di interleaving di concorrenza è: data una semantica operazionale, una sequenza di istruzioni è eseguita atomicamente se tutte le transizioni (della semantica operazionale) che coinvolgono tali istruzioni avvengono in sequenza. Una sequenza di istruzioni è atomic se tutte le possibili sequenze di transizioni eseguono la sequenza di istruzioni in modo atomico. Potremmo scioglierlo in un “ come se fossero eseguite atomicamente” che potremmo iniziare a formalizzare dicendo che tutte le possibili sequenze di transizioni sono equivalenti ( presumibilmente equivalente dal punto di vista dellosservazione) a una sequenza di transizioni che esegue le istruzioni in modo atomico.

B asicamente, eseguito atomicamente significa che una volta che iniziamo a eseguire una sequenza di istruzioni, non intercaliamo lesecuzione con nessunaltra istruzione nellesecuzione della sequenza.Dal punto di vista dellimplementazione, questo potrebbe significare che eseguiamo solo un thread alla volta come in unimplementazione di thread con suddivisione del tempo, e una sequenza di istruzioni eseguite atomicamente significa che non ci sono stati cambi di contesto durante la loro esecuzione. La definizione di cui sopra ha un problema in quanto non gestisce veramente bene il coordinamento tra i thread. Non avrebbe davvero senso dire che la comunicazione lungo un canale tra due thread, per esempio, sia mai stata atomica. (Spesso si parla di operazioni su una struttura dati come atomiche, e questo sarebbe probabilmente più appropriato per questo esempio. La definizione sarebbe specifica per la struttura dati.)

Per il programma di esempio e assumendo un semantica operazionale dove unistruzione print potrebbe essere gestita in una singola transizione, il Programma 2 verrebbe sempre eseguito atomicamente ed è (abbastanza banalmente) atomico. La seconda esecuzione descrive uno scenario in cui il Programma 1 viene eseguito in modo atomico mentre la prima no. Se ci fosse un meccanismo che garantisse che la tua seconda esecuzione fosse sempre avvenuta, allora potresti dire che il Programma 1 (con quel meccanismo) era atomico, ma altrimenti presumibilmente non sarebbe atomico da solo.

Come menzionato nel mio commento, “atomico” è spesso usato in un senso informale e / o orientato allimplementazione. Pertanto, ciò che si intende esattamente è spesso poco chiaro, anche se lo spirito di ciò che si intende è generalmente abbastanza chiaro.

Risposta

Lantica origine oscura e profonda della parola Atomic nella programmazione si riferisce a unistruzione in linguaggio assembly ATOMIC. Allo stesso modo in cui un gruppo di singole particelle (protone, neutrone, elettrone) forma una singola unità indistruttibile chiamata atomo, nella programmazione ATOMIC si riferisce a un gruppo di istruzioni di assemblaggio che formano ununica istruzione unitaria uninterruptable . La prima istruzione di assemblaggio è ATOMIC che sospende tutte le interruzioni fino a quando le interruzioni non vengono riavviate con qualcosa come UNATOMIC.

Da allora la parola ATOMIC è stata ampiamente utilizzata in modo improprio dal marketing. Chiamare una singola istruzione ATOMIC è semplicemente sciocco.

ATOMIC era originariamente un acronimo, penso che avrebbe potuto essere “A seT? Of Multiple Instruction Clusters” – mi dispiace, non sono sicuro della T, è stato molti anni.

Commenti

  • Calling a single instruction ATOMIC is just silly beh, ci sono stati atomic trasferimenti di memoria che coinvolgono più di un ciclo di bus, nonché istruzioni come Prova e imposta .

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *