Selon la terminologie du système d'exploitation, les mutex et les sémaphores sont des ressources du noyau qui fournissent des services de synchronisation, également appelés primitives de synchronisation . La synchronisation des processus joue un rôle important dans le maintien de la cohérence des données partagées. Les solutions logicielles et matérielles sont présentes pour gérer les problèmes de section critiques. Mais les solutions matérielles aux problèmes de sections critiques sont assez difficiles à mettre en œuvre. Mutex et sémaphore fournissent tous deux des services de synchronisation, mais ils ne sont pas identiques.
Qu’est-ce que Mutex ?
Mutex est un objet d'exclusion mutuelle qui synchronise l'accès à une ressource. Il est créé avec un nom unique au début d'un programme. Le mécanisme de verrouillage du mutex garantit qu'un seul thread peut acquérir le mutex et accéder à la section critique. Ce thread ne libère le mutex que lorsqu'il sort dans la section critique.
Il s'agit d'un type spécial de sémaphore binaire utilisé pour contrôler l'accès à la ressource partagée. Il comprend un mécanisme d'héritage de priorité pour éviter les problèmes étendus d'inversion de priorité. Il permet aux tâches actuelles de priorité plus élevée de rester bloquées pendant la durée la plus courte possible. Cependant, l’héritage des priorités ne corrige pas l’inversion des priorités mais minimise seulement son effet.
Exemple
Ceci est illustré à l’aide de l’exemple suivant,
wait (mutex); ..... Critical Section ..... signal (mutex);
Utilisation de Mutex
Un mutex assure une exclusion mutuelle, soit producteur soit consommateur qui peut avoir la clé (mutex) et poursuivre son travail. Tant que le producteur remplit le tampon, l'utilisateur doit attendre, et vice versa. Dans le verrouillage Mutex, à tout moment, un seul thread peut fonctionner avec l'intégralité du tampon.
Lorsqu'un programme démarre, il demande au système de créer un objet mutex pour une ressource donnée. Le système crée l'objet mutex avec un nom ou un ID unique. Chaque fois que le thread du programme souhaite utiliser la ressource, il occupe le verrou sur l'objet mutex, utilise la ressource et après utilisation, il libère le verrou sur l'objet mutex. Ensuite, le processus suivant est autorisé à acquérir le verrou sur l'objet mutex.
Pendant ce temps, un processus a acquis le verrou sur l'objet mutex et aucun autre thread ou processus ne peut accéder à cette ressource. Si l'objet mutex est déjà verrouillé, le processus souhaitant acquérir le verrou sur l'objet mutex doit attendre et est mis en file d'attente par le système jusqu'à ce que l'objet mutex soit déverrouillé.
Avantages de Mutex
Voici les avantages suivants du mutex, tels que :
- Mutex n'est que de simples verrous obtenus avant d'entrer dans sa section critique puis de la relâcher.
- Puisqu'un seul thread se trouve dans sa section critique à un moment donné, il n'y a pas de conditions de concurrence et les données restent toujours cohérentes.
Inconvénients du Mutex
Mutex présente également certains inconvénients, tels que :
- Si un thread obtient un verrou et se met en veille ou est préempté, l'autre thread ne peut pas avancer. Cela peut conduire à la famine.
- Il ne peut pas être verrouillé ou déverrouillé depuis un contexte différent de celui qui l'a acquis.
- Un seul thread à la fois doit être autorisé dans la section critique.
- L'implémentation normale peut conduire à un état d'attente occupé, ce qui gaspille du temps CPU.
Qu’est-ce que le Sémaphore ?
Le sémaphore est simplement une variable non négative et partagée entre les threads. Un sémaphore est un mécanisme de signalisation, et un autre thread peut signaler un thread qui attend un sémaphore.
Un sémaphore utilise deux opérations atomiques,
1. Attendez : L'opération wait décrémente la valeur de son argument S s'il est positif. Si S est négatif ou nul, alors aucune opération n’est effectuée.
wait(S) { while (S<=0); s--; } < pre> <p> <strong>2. Signal for the process synchronization:</strong> The signal operation increments the value of its argument S.</p> <pre> signal(S) { S++; } </pre> <p>A semaphore either allows or reject access to the resource, depending on how it is set up.</p> <h3>Use of Semaphore</h3> <p>In the case of a single buffer, we can separate the 4 KB buffer into four buffers of 1 KB. Semaphore can be associated with these four buffers, allowing users and producers to work on different buffers simultaneously.</p> <h3>Types of Semaphore</h3> <p>Semaphore is distinguished by the operating system in two categories <strong>Counting semaphore</strong> and <strong>Binary semaphore</strong> .</p> <p> <strong>1. Counting Semaphore:</strong> The semaphore S value is initialized to the <strong>number of resources</strong> present in the system. Whenever a process wants to access the resource, it performs <strong>the wait()</strong> operation on the semaphore and <strong>decrements</strong> the semaphore value by one. When it releases the resource, it performs <strong>the signal()</strong> operation on the semaphore and <strong>increments</strong> the semaphore value by one.</p> <p>When the semaphore count goes to 0, it means the processes occupy all resources. A process needs to use a resource when the semaphore count is 0. It executes the <strong>wait()</strong> operation and gets <strong>blocked</strong> until the semaphore value becomes greater than 0.</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-3.webp" alt="Mutex vs Semaphore"> <p> <strong>2. Binary semaphore:</strong> The value of a semaphore ranges between <strong>0</strong> and <strong>1</strong> . It is similar to mutex lock, but mutex is a locking mechanism, whereas the semaphore is a signaling mechanism. In binary semaphore, if a process wants to access the resource, it performs <strong>the wait()</strong> operation on the semaphore and decrements the value of the semaphore from 1 to 0. When it releases the resource, it performs a <strong>signal</strong> <strong>()</strong> operation on the semaphore and increments its value to 1. Suppose the value of the semaphore is 0 and a process wants to access the resource. In that case, it performs <strong>wait()</strong> operation and block itself till the current process utilizing the resources releases the resource.</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-4.webp" alt="Mutex vs Semaphore"> <h3>Advantages of Semaphore</h3> <p>Here are the following advantages of semaphore, such as:</p> <ul> <li>It allows more than one thread to access the critical section.</li> <li>Semaphores are machine-independent.</li> <li>Semaphores are implemented in the machine-independent code of the microkernel.</li> <li>They do not allow multiple processes to enter the critical section.</li> <li>As there is busy and waiting in semaphore, there is never wastage of process time and resources.</li> <li>They are machine-independent, which should be run in the machine-independent code of the microkernel.</li> <li>They allow flexible management of resources.</li> </ul> <h3>Disadvantage of Semaphores</h3> <p>Semaphores also have some disadvantages, such as:</p> <ul> <li>One of the biggest limitations of a semaphore is priority inversion.</li> <li>The operating system has to keep track of all calls to wait and signal semaphore.</li> <li>Their use is never enforced, but it is by convention only.</li> <li>The Wait and Signal operations require to be executed in the correct order to avoid deadlocks in semaphore.</li> <li>Semaphore programming is a complex method, so there are chances of not achieving mutual exclusion.</li> <li>It is also not a practical method for large scale use as their use leads to loss of modularity.</li> <li>Semaphore is more prone to programmer error</li> <li>, and it may cause deadlock or violation of mutual exclusion due to programmer error.</li> </ul> <h3>Difference between Mutex and Semaphore</h3> <p>The basic difference between semaphore and mutex is that semaphore is a signalling mechanism, i.e. processes perform wait() and signal() operation to indicate whether they are acquiring or releasing the resource. In contrast, a mutex is a locking mechanism, and the process has to acquire the lock on a mutex object if it wants to acquire the resource. Here are some more differences between semaphore and mutex, such as:</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-5.webp" alt="Mutex vs Semaphore"> <br> <table class="table"> <tr> <th>Terms</th> <th>Mutex</th> <th>Semaphore</th> </tr> <tr> <td>Definition</td> <td>The mutex is a locking mechanism, as to acquire a resource, a process needs to lock the mutex object, and while releasing a resource process has to unlock the mutex object.</td> <td>Semaphore is a signalling mechanism as wait() and signal() operations performed on the semaphore variable indicate whether a process is acquiring or releasing the resource.</td> </tr> <tr> <td>Existence</td> <td>A mutex is an object.</td> <td>Semaphore is an integer variable.</td> </tr> <tr> <td>Function</td> <td>Mutex allows multiple program threads to access a single resource but not simultaneously.</td> <td>Semaphore allows multiple program threads to access a finite instance of resources.</td> </tr> <tr> <td>Ownership</td> <td>Mutex object lock is released only by the process that has acquired the lock on the mutex object.</td> <td>Semaphore value can be changed by any process acquiring or releasing the resource by performing wait() and signal() operation.</td> </tr> <tr> <td>Categorize</td> <td>Mutex is not categorized further.</td> <td>The semaphore can be categorized into counting semaphore and binary semaphore.</td> </tr> <tr> <td>Operation</td> <td>The mutex object is locked or unlocked by the process of requesting or releasing the resource.</td> <td>Semaphore value is modified using wait() and signal() operation apart from initialization.</td> </tr> <tr> <td>Resources Occupied</td> <td>If a mutex object is already locked, then the process desiring to acquire resource waits and get queued by the system till the resource is released and the mutex object gets unlocked.</td> <td>Suppose the process acquires all the resources, and no resource is free. In that case, the process desiring to acquire resource performs wait() operation on semaphore variable and blocks itself till the count of semaphore become greater than 0.</td> </tr> </table> <hr></=0);>
Un sémaphore autorise ou refuse l'accès à la ressource, selon la manière dont il est configuré.
Utilisation du sémaphore
Dans le cas d'un seul buffer, on peut séparer le buffer de 4 Ko en quatre buffers de 1 Ko. Le sémaphore peut être associé à ces quatre tampons, permettant aux utilisateurs et aux producteurs de travailler simultanément sur différents tampons.
Types de sémaphore
Le sémaphore se distingue par le système d'exploitation en deux catégories Sémaphore de comptage et Sémaphore binaire .
1. Compter le sémaphore : La valeur du sémaphore S est initialisée à la valeur nombre de ressources présents dans le système. Chaque fois qu'un processus souhaite accéder à la ressource, il effectue L'attente() opération sur le sémaphore et décréments la valeur du sémaphore par un. Lorsqu'il libère la ressource, il effectue le signal() opération sur le sémaphore et incréments la valeur du sémaphore par un.
Lorsque le nombre de sémaphores passe à 0, cela signifie que les processus occupent toutes les ressources. Un processus doit utiliser une ressource lorsque le nombre de sémaphores est égal à 0. Il exécute le attendez() opération et obtient bloqué jusqu'à ce que la valeur du sémaphore devienne supérieure à 0.
2. Sémaphore binaire : La valeur d'un sémaphore est comprise entre 0 et 1 . Il est similaire au verrouillage mutex, mais le mutex est un mécanisme de verrouillage, tandis que le sémaphore est un mécanisme de signalisation. Dans le sémaphore binaire, si un processus souhaite accéder à la ressource, il effectue L'attente() opération sur le sémaphore et décrémente la valeur du sémaphore de 1 à 0. Lorsqu'il libère la ressource, il effectue une signal () opération sur le sémaphore et incrémente sa valeur à 1. Supposons que la valeur du sémaphore soit 0 et qu'un processus souhaite accéder à la ressource. Dans ce cas, il effectue attendez() opération et se bloque jusqu'à ce que le processus actuel utilisant les ressources libère la ressource.
Avantages du sémaphore
Voici les avantages suivants du sémaphore, tels que :
- Il permet à plusieurs threads d'accéder à la section critique.
- Les sémaphores sont indépendants de la machine.
- Les sémaphores sont implémentés dans le code indépendant de la machine du micronoyau.
- Ils ne permettent pas à plusieurs processus d'entrer dans la section critique.
- Comme le sémaphore est occupé et en attente, il n'y a jamais de perte de temps et de ressources.
- Ils sont indépendants de la machine et doivent être exécutés dans le code indépendant de la machine du micro-noyau.
- Ils permettent une gestion flexible des ressources.
Inconvénient des sémaphores
Les sémaphores présentent également certains inconvénients, tels que :
- L'une des plus grandes limitations d'un sémaphore est l'inversion des priorités.
- Le système d'exploitation doit garder une trace de tous les appels à attendre et signaler le sémaphore.
- Leur utilisation n’est jamais imposée, mais uniquement par convention.
- Les opérations Wait et Signal doivent être exécutées dans le bon ordre pour éviter les blocages dans le sémaphore.
- La programmation des sémaphores est une méthode complexe, il y a donc des chances de ne pas parvenir à une exclusion mutuelle.
- Ce n’est pas non plus une méthode pratique pour une utilisation à grande échelle car son utilisation entraîne une perte de modularité.
- Le sémaphore est plus sujet aux erreurs du programmeur
- , et cela peut provoquer un blocage ou une violation de l'exclusion mutuelle en raison d'une erreur du programmeur.
Différence entre Mutex et Sémaphore
La différence fondamentale entre le sémaphore et le mutex est que le sémaphore est un mécanisme de signalisation, c'est-à-dire que les processus effectuent les opérations wait() et signal() pour indiquer s'ils acquièrent ou libèrent la ressource. En revanche, un mutex est un mécanisme de verrouillage et le processus doit acquérir le verrou sur un objet mutex s'il souhaite acquérir la ressource. Voici quelques différences supplémentaires entre le sémaphore et le mutex, telles que :
Termes | Mutex | Sémaphore |
---|---|---|
Définition | Le mutex est un mécanisme de verrouillage, car pour acquérir une ressource, un processus doit verrouiller l'objet mutex, et lors de la libération d'une ressource, le processus doit déverrouiller l'objet mutex. | Le sémaphore est un mécanisme de signalisation car les opérations wait() et signal() effectuées sur la variable sémaphore indiquent si un processus acquiert ou libère la ressource. |
Existence | Un mutex est un objet. | Le sémaphore est une variable entière. |
Fonction | Mutex permet à plusieurs threads de programme d'accéder à une seule ressource mais pas simultanément. | Le sémaphore permet à plusieurs threads de programme d'accéder à une instance finie de ressources. |
La possession | Le verrouillage de l'objet mutex est libéré uniquement par le processus qui a acquis le verrou sur l'objet mutex. | La valeur du sémaphore peut être modifiée par n'importe quel processus acquérant ou libérant la ressource en effectuant les opérations wait() et signal(). |
Classer par catégories | Mutex n'est pas catégorisé davantage. | Le sémaphore peut être classé en sémaphore de comptage et sémaphore binaire. |
Opération | L'objet mutex est verrouillé ou déverrouillé par le processus de demande ou de libération de la ressource. | La valeur du sémaphore est modifiée à l'aide des opérations wait() et signal() en dehors de l'initialisation. |
Ressources occupées | Si un objet mutex est déjà verrouillé, le processus désirant acquérir la ressource attend et est mis en file d'attente par le système jusqu'à ce que la ressource soit libérée et que l'objet mutex soit déverrouillé. | Supposons que le processus acquière toutes les ressources et qu’aucune ressource ne soit gratuite. Dans ce cas, le processus désirant acquérir la ressource effectue une opération wait() sur la variable de sémaphore et se bloque jusqu'à ce que le nombre de sémaphores devienne supérieur à 0. |
=0);>