Quelle est la définition exacte de ' atomicité ' en programmation?

la définition de « atomicité » dit quune transaction devrait pouvoir être terminée sans être touchée ou manipulée par des actions éventuellement simultanées pendant son processus. Mais cela signifie-t-il aussi quun programme ne doit pas sexécuter simultanément alors quil est supposé être atomique?

disons que nous avons 2 programmes comme exemple:

example_program1:

compte int i = 1 à 100 chaque seconde

chaque nombre est imprimé dans une nouvelle ligne

exemple_programme2:

imprime simplement  » salut  »

et un programme parent qui inclut ces deux programmes et les exécuter une fois en recevant un signal pour démarrer un programme spécifique (par exemple via sigaction sous linux) avec 2 version:

version 1:

exécute le programme (même simultané) à tout moment une fois le signal reçu

ce qui signifie que programme2 peut imprimer  » hi  » pendant que programme1 est toujours en train dimprimer les nombres

version 2:

uniquement exécuter un programme à la fois

le signal pour un autre programme est bloqué jusquà ce que le programme en cours se termine

dans cet exemple, ne peut la version 2 est-elle considérée comme atomique ou les deux? Ce programme serait-il non atomique seulement si par exemple program2 incrémenterait i de 1 pendant son processus?

Commentaires

  • Le terme  » atomic  » est utilisé de (plusieurs) manières différentes dans différents contextes. Parfois de manière très similaire mais toujours différente. Il est également souvent utilisé de manière informelle. Votre question commence par une définition qui semble être basée sur la théorie des bases de données, mais parle ensuite de programmes. Votre définition parle de  » transactions  » mais il ny a aucune transaction dans votre programme. Il ‘ est probable que vous utilisiez par inadvertance une mauvaise définition de  » atomic « . (Votre définition de latomicité ne correspond pas ‘ vraiment à sa signification à la ACID.)

Réponse

Si une opération X est atomique, cela signifie que toute personne observant lopération la verra soit comme pas encore commencée, soit comme terminée, et pas dans un état qui est partiellement terminé. Cest tout.

Évidemment, si vous écrivez du code pour effectuer une opération X, et que dautres codes peuvent la voir à moitié exécutée, ou interférer avec elle, alors votre implémentation de lopération X nest pas atomique.

Dans certains contextes, une opération «atomique» peut réussir ou échouer; si une telle opération atomique échoue, leffet doit être exactement le même que si lopération navait jamais été lancée.

Commentaires

  • Pour rappel, voici ce que signifie Isolation dans ACID, pas ce que signifie Atomicité. ‘ nest pas clair si votre La définition est censée coïncider / couvrir la notion datomicité ACID (qui nest ‘ t terriblement pertinente pour le code arbitraire).

Réponse

Je ne suis pas sûr de connaître une définition simple, formelle et abstraite de « atomic » pour un langage de programmation. Jen connais beaucoup à différents niveaux dabstraction et en ce qui concerne divers sujets. Jen connais également qui semblent assez abstraites mais qui ont des prérequis assez sophistiqués (par exemple des modèles de concurrence pré-percés). Une partie du problème est quil existe de nombreuses façons différentes de dire que deux programmes «se comportent» «de manière équivalente» et que certaines définitions peuvent respecter différentes notions d «équivalent».

Une esquisse (que je fais up right now) dune approche par rapport à un modèle entrelacé de concurrence est: Étant donné une sémantique opérationnelle, une séquence dinstructions est exécutée atomiquement si toutes les transitions (de la sémantique opérationnelle) impliquant ces instructions se produisent dans lordre. Une séquence dinstructions est atomic if toutes les séquences de transitions possibles exécutent la séquence dinstructions de manière atomique. Nous pourrions assouplir cela à un «  comme si elles étaient exécutées de manière atomique » que nous pourrions commencer à formaliser en disant que toutes les séquences de transitions possibles sont équivalentes ( vraisemblablement équivalent sur le plan dobservation) à une séquence de transitions qui exécute les instructions de manière atomique.

B asically, exécuté atomiquement signifie quune fois que nous commençons à exécuter une séquence dinstructions, nous nentrelacerons aucune autre instruction dans lexécution de la séquence.En ce qui concerne limplémentation, cela pourrait signifier que nous nexécutons quun seul thread à la fois, comme dans une implémentation temporelle de threads, et une séquence dinstructions exécutées de manière atomique signifie quil ny a pas eu de changement de contexte pendant leur exécution. La définition ci-dessus a un problème en ce quelle ne gère pas vraiment bien la coordination entre les threads. Cela naurait pas vraiment de sens de dire que la communication le long dun canal entre deux threads, par exemple, a toujours été atomique. (Souvent, nous parlons des opérations sur une structure de données comme étant atomiques, ce qui serait probablement plus approprié pour cet exemple. La définition serait spécifique à la structure de données.)

Pour votre exemple de programme et en supposant un sémantique opérationnelle où une instruction print pourrait être gérée en une seule transition, alors le programme 2 serait toujours exécuté de manière atomique et serait (assez trivialement) atomique. Votre deuxième exécution décrit un scénario dans lequel le programme 1 est exécuté de manière atomique alors que la première ne lest pas. Sil y avait un mécanisme qui garantissait que votre deuxième exécution se produisait toujours, alors vous pourriez dire que le programme 1 (avec ce mécanisme) était atomique, mais sinon, il ne serait probablement pas atomique en soi.

Comme mentionné dans mon commentaire, «atomique» est souvent utilisé dans un sens informel et / ou orienté vers limplémentation. Par conséquent, ce que lon entend exactement nest souvent pas clair, même si lesprit de ce qui est prévu est généralement assez clair.

Réponse

Lorigine ancienne et sombre du mot Atomic en programmation fait référence à une instruction de langage dassemblage ATOMIC. De la même manière quun groupe de particules individuelles (proton, neutron, électron) forme une seule unité incassable appelée atome, en programmation ATOMIC fait référence à un groupe dinstructions dassemblage qui forment une seule instruction unitaire ininterrompue . La première instruction dassemblage est ATOMIC qui suspend toutes les interruptions jusquà ce que les interruptions soient relancées avec quelque chose comme UNATOMIC.

Depuis lors, le mot ATOMIC a été largement abusé par le marketing. Appeler une seule instruction ATOMIC est tout simplement idiot.

ATOMIC était à lorigine un acronyme, je pense que cela aurait pu être « A seT? Of Multiple Instruction Clusters » – désolé, pas sûr du T, ça a été de nombreuses années.

Commentaires

  • Calling a single instruction ATOMIC is just silly eh bien, il y a eu atomique les transferts de mémoire impliquant plus dun cycle de bus, ainsi que des instructions comme Test And Set .

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *