a definição de “atomicidade” diz que uma transação deve poder ser encerrada sem ser tocada ou manipulada por ações possivelmente em execução simultâneas durante seu processo. Mas isso também significa que um programa não deve ser executado simultaneamente quando deveria ser atômico?
Digamos que temos 2 programas como exemplo:
example_program1:
conta int i = 1 a 100 a cada segundo
cada número é impresso em uma nova linha
example_program2:
apenas imprime ” hi ”
e um programa pai que inclui ambos os programas e os executa ao receber um sinal para iniciar um programa específico (por exemplo via sigaction no linux) com 2 versão:
versão 1:
executa o programa (mesmo concorrente) a qualquer momento, uma vez que recebe o sinal
o que significa que o programa2 pode imprimir ” hi ” enquanto o programa1 ainda está imprimindo os números
versão 2:
apenas execute um programa por vez
o sinal de outro programa é bloqueado até que o programa em andamento seja encerrado
neste exemplo, só pode versão 2 ser considerada atômica ou ambos? Este programa seria não atômico apenas se, por exemplo, o programa2 incrementasse i em 1 durante seu processo?
Comentários
- O termo ” atomic ” é usado em (várias) maneiras diferentes em contextos diferentes. Às vezes de maneiras muito semelhantes, mas ainda diferentes. Freqüentemente, também é usado informalmente. Sua pergunta começa com uma definição que parece ser baseada na teoria de banco de dados, mas depois fala sobre programas. Sua definição fala sobre ” transações “, mas não há transações em seu programa. É ‘ provável que você esteja usando inadvertidamente a definição errada de ” atômico “. (Sua definição de atomicidade também não ‘ realmente corresponde ao significado dela a Ia ACID.)
Resposta
Se uma operação X for atômica, significa que qualquer pessoa que observar a operação a verá como ainda não iniciada ou concluída e não em qualquer estado parcialmente concluído. É isso.
Obviamente, se você escrever código para realizar uma operação X e outro código puder vê-lo executado pela metade ou interferir com ele, então sua implementação da operação X não é atômica.
Em alguns contextos, uma operação “atômica” pode ser bem-sucedida ou falhar; se essa operação atômica falhar, o efeito deve ser exatamente o mesmo como se a operação nunca tivesse sido iniciada.
Comentários
- Como uma observação, isso é o que isolamento significa no ACID, não o que significa atomicidade. ‘ não está claro se o seu a definição pretende coincidir / cobrir a noção ACID de atomicidade (que não é ‘ t terrivelmente relevante para código arbitrário).
Resposta
Não tenho certeza se conheço uma definição simples, formal e abstrata de “atômico” para uma linguagem de programação. Eu conheço muitos diferentes em vários níveis de abstração e com relação a vários tópicos. Também conheço alguns que parecem bastante abstratos, mas têm pré-requisitos bastante sofisticados (por exemplo, modelos de pré-capa de simultaneidade). Parte do problema é que existem muitas maneiras diferentes de dizer que dois programas “se comportam” “de forma equivalente” e algumas definições podem respeitar diferentes noções de “equivalente”.
Um esboço (que estou fazendo até agora) de uma abordagem com relação a um modelo de intercalação de simultaneidade é: Dada uma semântica operacional, uma sequência de instruções é executada atomicamente se todas as transições (da semântica operacional) envolvendo essas declarações acontecerem em sequência. Uma sequência de declarações é atômica se todas as sequências possíveis de transições executam a sequência de instruções atomicamente. Poderíamos afrouxar isso para um “ como se elas fossem executadas atomicamente”, que podemos começar a formalizar dizendo que todas as sequências possíveis de transições são equivalentes ( presumivelmente, observacionalmente equivalente) a uma sequência de transições que executa as instruções atomicamente.
B asicamente, executado atomicamente significa que, uma vez que começamos a executar alguma sequência de instruções, não intercalamos a execução de qualquer outra instrução na execução da sequência.Em termos de implementação, isso pode significar que executamos apenas um thread por vez, como em uma implementação de threads de segmentação de tempo, e uma sequência de instruções executadas atomicamente significa que não houve troca de contexto durante sua execução. A definição acima tem o problema de que realmente não lida bem com a coordenação entre threads. Não faria muito sentido dizer que a comunicação ao longo de um canal entre dois threads, por exemplo, sempre foi atômica. (Freqüentemente, falamos sobre as operações em uma estrutura de dados como sendo atômicas, e isso provavelmente seria mais apropriado para este exemplo. A definição seria específica para a estrutura de dados.)
Para seu programa de exemplo e assumindo um semântica operacional em que uma instrução print
pudesse ser tratada em uma única transição, então o Programa 2 sempre seria executado atomicamente e é (bastante trivialmente) atômico. Sua segunda execução descreve um cenário onde o Programa 1 é executado atomicamente, enquanto a primeira não. Se houvesse algum mecanismo que garantisse que sua segunda execução sempre acontecesse, você poderia dizer que o Programa 1 (com esse mecanismo) era atômico, mas, do contrário, presumivelmente não seria atômico por conta própria.
Conforme mencionado em meu comentário, “atômico” é freqüentemente usado em um sentido informal e / ou orientado para a implementação. Portanto, o que exatamente é pretendido geralmente não está claro, embora o espírito do que se pretende seja geralmente razoavelmente claro.
Resposta
A origem profundamente escura e antiga da palavra Atômico em programação refere-se a uma instrução em linguagem assembly ATOMIC. Da mesma forma que um grupo de partículas individuais (próton, nêutron, elétron) forma uma única unidade inquebrável chamada átomo, na programação ATOMIC se refere a um grupo de instruções de montagem que formam uma única instrução de unidade ininterrupta . A primeira instrução de montagem é ATOMIC, que suspende todas as interrupções até que sejam reiniciadas com algo como UNATOMIC.
Desde então, a palavra ATOMIC tem sido grosseiramente mal utilizada pelo marketing. Chamar uma única instrução ATOMIC é bobagem.
ATOMIC era originalmente um acrônimo, acho que pode ter sido “A seT? Of Multiple Instruction Clusters” – desculpe, não tenho certeza sobre o T, tem sido muitos anos.
Comentários
-
Calling a single instruction ATOMIC is just silly
bem, tem havido atômico transferências de memória envolvendo mais de um ciclo de barramento, bem como instruções como Testar e definir .