Chercher-et-ajouter

Dans le de l'informatique, le chercher-et-ajoutent l'instruction de l'unité centrale de traitement de est une instruction spéciale que le atomique modifie le contenu d'un endroit de mémoire. Il est employé pour mettre en application l'exclusion mutuelle et les algorithmes concourants dans des systèmes de multiprocesseur.

Dans des systèmes du monoprocesseur , il est suffisant de désactiver les interruptions avant d'accéder à une région critique . Cependant, dans des systèmes de multiprocesseur, c'est impossible et undesirable pour désactiver les interruptions sur tous les processeurs en même temps ; et même avec des interruptions a désactivé deux processeurs ou plus pourrait essayer d'accéder à la même mémoire en même temps. L'instruction de chercher-et-ajouter, permet à n'importe quel processeur d'incrémenter atomique une valeur dans l'endroit de mémoire, empêchant de telles collisions multiples de processeur.

Le Maurice Herlihy (1993) s'est avéré que qui chercher-et-s'ajoutent est inférieur au Comparer-et-permutent .

Exécution

L'effort standard et s'ajoutent - l'instruction se comporte comme la fonction suivante. Crucialement la fonction entière est le exécuté atomique : aucun processus ne peut interrompre la mi-exécution de fonction et par conséquent pour voir un déclarer qui existe seulement pendant l'exécution de la fonction. Ce code sert seulement à aider à expliquer le comportement de chercher-et-s'ajoutent ; l'atomicité exige l'appui explicite de matériel et par conséquent ne peut pas être mise en application comme fonction à niveau élevé simple.

<< atomique >> fonction FetchAndAdd (endroit de d'adresse de ) { valeur du international : = *location *location : = valeur + 1 valeur de retour du }

Avec chercher-et-ajouter le primitif qu'une serrure d'exclusion mutuelle peut être mise en application comme :

locktype record du { ticketnumber du international tour du international } procédé LockInit (locktype * serrure de de ) { lock.ticketnumber : = 0 lock.turn : = 0 } serrure du procédé (locktype * serrure de ) { myturn du international : = FetchAndAdd (&lock.ticketnumber) tandis que myturn de ≠ de lock.turn la rotation de du saut // de jusqu'à la serrure est acquis } le procédé ouvrent (locktype * la serrure de ) { FetchAndAdd (&lock.turn) }

Ces routines fournissent une serrure de mutuel-exclusion quand des conditions suivantes sont remplies :
La structure de données de Locktype est initialisée avec la fonction LockInit avant emploi
Le nombre de tâches attendant la serrure ne dépasse pas INT_MAX à tout moment
Le datatype de nombre entier utilisé en valeurs de serrure mettent en boîte le « enrouler autour de » une fois sans interruption incrémenté

exécution x86

Dans l'architecture x86, l'instruction S'AJOUTENT avec le premier opérande spécifiant un endroit de mémoire est une instruction de chercher-et-ajouter qui a été là puisque les 8086 (elle juste ne s'est pas appelée qui puis), et avec le préfixe de SERRURE, est atomique à travers les processeurs multiples. Cependant, elle ne pourrait pas renvoyer la valeur originale de l'endroit de mémoire (bien qu'elle a renvoyé quelques drapeaux) jusqu'à ce que les 486 aient présenté l'instruction de XADD.

Voir également

le Essai-et-a placé
L'essai de et Essai-et-a placé
le Comparer-et-permutent
Charge-Lien de / Stocker-Conditionnel

perating-système-moignon

.

Random links:Joe Sakic | Stade de Pitt | Empire MacAndrew de système mv | La Nouvelle Angleterre a bouilli le dîner | Traer-y-agregar