Applications sur l'interblocage
Exercice 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
Parmi les scénarios suivants, lequel provoque un interblocage ? Justifier.

Indice
Intéressez-vous aux ressources...
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