Applications sur l'interblocage
Exercice 1 sur l'interblocage
On suppose maintenant que les trois processus manipulés en page précédente s’exécutent et utilisent une ou plusieurs ressources parmi R1, R2 et R3.
Question
Exercice 2 : Extrait du sujet 2021 - Amérique du Nord
Un constructeur automobile utilise des ordinateurs pour la conception de ses véhicules. Ceux-ci sont munis d'un système d'exploitation ainsi que de nombreuses applications parmi lesquelles on peut citer :
un logiciel de traitement de texte ;
un tableur ;
un logiciel de Conception Assistée par Ordinateur (CAO) ;
un système de gestion de base de données (SGBD)
Chaque ordinateur est équipé des périphériques classiques : clavier, souris, écran et est relié à une imprimante réseau.
(question System On Chip)
Un ingénieur travaille sur son ordinateur et utilise les quatre applications citées au début de l'énoncé.
Pendant l'exécution de ces applications, des processus mobilisent des données et sont en attente d'autres données mobilisées par d'autres processus.
On donne ci-dessous un tableau indiquant à un instant précis l'état des processus en cours d'exécution et dans lequel D1, D2, D3, D4 et D5 sont des données.
La lettre M signifie que la donnée est mobilisée par l'application ; la lettre A signifie que l'application est en attente de cette donnée.
Lecture du tableau : le logiciel de traitement de texte mobilise (M) la donnée D1 et est en attente (A) de la donnée D2.
D1 | D2 | D3 | D4 | D5 | |
|---|---|---|---|---|---|
Traitement de texte | M | A | - | - | - |
Tableur | A | - | - | - | M |
SGBD | - | M | A | A | - |
CAO | - | - | A | M | A |
Question
Exercice 3 : Visualisation d'un interblocage
Cette petite activité va vous permettre de visualiser un cas d'interblocage avec la gestion des fichiers avec Python.
Créer 2 fichiers ouvre_fichier1.py et ouvre_fichier2.py contenant ce code :
import time
import fcntl
fichier1 = "fichierA.txt"
fichier2 = "fichierB.txt"
temps_attente = 10
temps_ouvert = 5
def ouvrir_fichier(nom_fichier):
""" Ouvre le fichier 'nom_fichier' en écriture avec verrouillage et renvoie le descripteur de fichier. """print(f"Tente d'ouvrir {nom_fichier} en écriture")
f = open(nom_fichier, "w")
fcntl.lockf(f, fcntl.LOCK_EX)
print(f"{nom_fichier} ouvert")
return f
def fermer_fichier(f):
""" Déverrouille et ferme le descripteur de fichier 'f' """fcntl.lockf(f, fcntl.LOCK_UN)
f.close()
print("Fichier fermé")
f1 = ouvrir_fichier(fichier1)
print(f"Attente de {temps_attente} secondes")
time.sleep(temps_attente)
f2 = ouvrir_fichier(fichier2)
print(f"Attente de {temps_ouvert} secondes avant fermeture des fichiers")
time.sleep(temps_ouvert)
fermer_fichier(f1)
fermer_fichier(f2)
Le 2ème fichier Python est le même à part les lignes 3 et 4 :
fichier1 = "fichierB.txt"
fichier2 = "fichierA.txt"
Question
En lisant le code de ces programmes, prédire ce qu'ils réalisent.
Solution
Ils ouvrent en écriture les deux mêmes fichiers, chacun dans un ordre différent, en attendant 10 secondes entre l'ouverture du premier et l'ouverture du second.
Question
Ouvrir 2 terminaux et préparer les commandes suivantes.
Dans le terminal A :
python3 ouvre_fichier1.py
Dans le terminal B :
python3 ouvre_fichier2.py
Exécutez ces commandes à moins de 10 secondes d'intervalle. Que se passe-t-il ?
Solution
Un des programmes plante car le système a détecté un cas d'interblocage.
OSError: [Errno 35] Resource deadlock avoided
