Maison >développement back-end >C++ >Synchronisation des processus en C/C++
La synchronisation des processus est une technologie qui résout le problème de l'accès simultané aux données partagées, ce qui peut entraîner une incohérence des données. Les processus de collaboration font référence à des processus qui peuvent affecter d'autres processus ou être affectés par d'autres processus, ce qui entraîne des données de processus incohérentes. Par conséquent, la synchronisation des processus est nécessaire pour garantir la cohérence des données.
Vous trouverez ci-dessous la structure de la section critique d'un processus spécifique P1
a les trois exigences suivantes : La section critique doit être satisfaite
Il existe deux méthodes couramment utilisées dans les systèmes d'exploitation pour gérer les parties critiques.
Noyau préemptif - Un noyau préemptif permet de préempter un processus pendant que le processus est préempté. Fonctionne en mode noyau.
Noyau non préemptif - Un noyau non préemptif ne permet pas de préempter les processus exécutés en mode noyau.
La solution de Peterson est une solution logicielle classique au problème des sections critiques. Il est limité à deux processus qui alternent entre leurs parties critiques et restantes. La partie de Peterson nécessite de partager deux éléments de données entre les deux processus, à savoir
Ici, la variable turn indique à qui revient le tour d'entrer dans la section critique, et le tableau de drapeaux indique si le processus Soyez prêt à entrer dans la zone critique.
Si turn == i, cela signifie que le processus Pi est autorisé à entrer dans sa section critique.
Si flag[j] est VRAI, cela signifie que le processus j est prêt à entrer dans sa section critique
Voici la structure du processus P dans la solution Peterson
La solution Peterson conserve les trois conditions -
a été implémenté à l'aide de deux types d'instructions -
Test et Set () sont des solutions matérielles au problème de synchronisation. Parmi eux, il existe une variable partagée par plusieurs processus appelée Lock, qui peut avoir une valeur de 0 et 1, où 1 signifie acquérir le verrou et 0 signifie libérer le verrou.
Chaque fois qu'un processus tente d'entrer dans la section critique, il doit interroger la valeur du verrou. Si la valeur de lock est 1, alors ils doivent attendre que la valeur de lock ne passe pas à 0.
Vous trouverez ci-dessous l'implémentation mutuellement exclusive de TestAndSet()
Semaphore est un outil de synchronisation utilisé pour surmonter les problèmes causés par les instructions TestAndSet() et Swap(). Le sémaphore S est une variable entière accessible via les deux opérations atomiques standards de wait() et signal()
wait() fonction :
wait(S) { While S <= 0 ; // no operation S--; }
Signal() fonction fonction :
signal(S) { S++; }
Lorsqu'un Le processus modifie la valeur d'un sémaphore, d'autres processus ne peuvent pas opérer sur la même valeur de sémaphore en même temps.
La mise en œuvre de l'exclusion mutuelle à l'aide du sémaphore est donnée ci-dessous
Le système d'exploitation utilise deux types de sémaphores, à savoir :
Sémaphore de comptage - Ce type de sémaphore La valeur peut varier dans un domaine illimité
Sémaphore binaire - La valeur de ce type de sémaphore peut varier entre 0 et 1. Ils sont également appelés verrous mutex. Il est utilisé par le système d'exploitation pour résoudre les problèmes de section critiques dans plusieurs processus.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!