Dans le contexte d'exécution d'un système d'exploitation multitâche, plusieurs processus sont amenés à travailler simultanément, et parfois même sur des données communes.
Nous verrons dans la partie suivante, que les accès concurrents à des données partagées, ou même plus généralement à des ressources uniques, peuvent produire des incohérence de données.
Ensuite, nous discuterons des divers mécanismes qui assurent
dans ce cas, une exécution ordonnée de processus
coopératifs, de telle sorte que la cohérence des
données soit maintenue.
Considérons deux processus (ou plus) qui s'exécutent concurremment dans un environnement multitâche, et qui sont chargés de la réservation de places d'avion. Le système d'exploitation leur accorde à tour de rôle un temps d'exécution.
Imaginons que le processus P1, soit interrompu juste après avoir testé qu'une place donnée est libre et avant d'avoir pu la marquer comme occupée. Dans ce cas, le système peut alors passer la main au processus P2 qui désire réserver la même place et le fait intégralement. Lorsque P1 peut à nouveau s'exécuter, il n'est pas informé que P2 à occuper cette même place, et finit de la réserver lui aussi. Au final, la même place est réservée deux fois !
Le problème est que lorsque le processus P2 entre en action, les variables communes ne reflètent pas exactement la valeur qu'elle devrait avoir, car P1 n'a pu finir son traitement correctement.
D'une manière générale, on ne peut déterminer le temps d'exécution accordé à un processus. En effet, la vitesse relative de deux processus est imprévisible puisque cela dépend de la fréquence des interruptions de chaque processus, ainsi que de la durée de travail et de la fréquence d'attribution en temps d'exécution aux processus. Nous disons que les processus se déroulent de manière asynchrone les uns par rapport aux autres.
Cependant, il est nécessaire de pouvoir trouver un moyen
de synchroniser les processus afin d'éviter
les accès concurrents aux données partagées.
Une séquence d'instructions manipulant des données partagées par plusieurs processus est appelée Section Critique, car l'entrelacement des exécutions de ces instructions par différents processus peut conduire à des incohérences telles que celle que nous venons de voir.
La caractéristique importante du système est que, quand un processus exécute sa section critique, aucun autre processus n'est autorisé à exécuter la sienne. Ainsi, l'exécution de sections critiques par les processus est dite mutuellement exclusive dans le temps, et permet de s'assurer que les ressources non partageables ne sont accessibles que par un seul processus à la fois.
Il y a donc une nécessité de protéger les sections critiques de code par un mécanisme qui permette de synchroniser les processus en les empêchant d'être plusieurs à exécuter ces sections .