Testează și setează

Instrucțiunea de testare și setare este o instrucțiune atomică utilizată în calcul în sisteme multiprocesor sau multi-core folosind memorie partajată, este utilizată pentru a scrie o valoare predeterminată într-o locație de memorie și a returna valoarea originală din acea locație. Are numărul doi de consens .

Acesta funcționează pe un singur memorie cuvânt (un octet sau octet ) poate fi revendicat adevărat ( true ) sau fals ( false ), uneori notată cu 0 și 1 , în unele limbi , cum ar fi C . Când este apelat, înlocuiește atomic valoarea stocată cu noua valoare dată ca argument și returnează valoarea stocată anterior.

Este folosit pentru a proteja o adresă de memorie în caz de acces simultan: dacă mai multe procese încearcă să acceseze aceeași adresă de memorie și un proces execută o instrucțiune de testare și setare pe aceeași adresă de memorie, atunci niciun alt proces nu poate executa o altă testează și setează instrucțiunile până când primul proces a terminat executarea instrucțiunii sale.

Codificat

int test_and_set (int *verrou){ // -- Début de la partie atomique -- // Ceci est du pseudocode, montré ici juste pour illustrer le principe. // S'il était utilisé normalement dans un compilateur, // les garanties nécessaires d'atomicité, non-usage de cache, non-réorganisation par l'optimiseur etc. // ne seraient pas fournies. int old = *verrou; *verrou = 1; // positionne le verrou à 1 pour dire qu'on veut occuper la SC (nb: ne change pas sa valeur si *verrou vaut déjà 1 car un autre processus est en SC) // -- Fin de la partie atomique -- return old; // renvoie l'ancienne valeur (c'est-à-dire 1 (vrai) si et seulement si il y avait déjà un processus en SC à l'entrée dans test_and_set) }

utilizare

Instrucțiunea de testare și setare este utilizată în special pentru a scrie Spinlock (transl: Blocare prin rotație). Blocarea este gratuită atunci când valoarea cuvântului este falsă și este ocupată când este adevărată . Într-o posibilă implementare, o metodă lock()(transl. Lock) încearcă în mod repetat să execute instrucțiunea test-and-set pe cuvânt până când se întoarce fals , adică până când blocarea este eliberată. Pentru al elibera, metoda unlock()(transl. Deblocare) schimbă valoarea cuvântului în fals .

Exemple de utilizare
  • În C (folosind pseudo-codul prezentat anterior)
int lock(int *lock) { while (test_and_set(lock) == 1); }
  • În Java , folosind clasa AtomicBoolean din pachet java.util.concurrent :
public class TestAndSetLock implements Lock { AtomicBoolean etat = new AtomicBoolean(false); public void lock() { while (etat.getAndSet(true)) {} } public void unlock() { etat.set(false); } }

Notă: instrucțiunea getAndSet(true)în Java funcționează la fel ca instrucțiunea test-and-set(true).

Vezi și tu

Note și referințe

  1. (în) Maurice Herlihy , Nir Shavit , Victor Luchangco și Michael Spear , The art of multiprocessor programming , Morgan Kaufmann, a 2- a  ed. ( ISBN  978-0-12-415950-1 ) , p.  150