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.

Différents scénarios

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 :

1
import time
2
import fcntl
3
fichier1 = "fichierA.txt"
4
fichier2 = "fichierB.txt"
5
temps_attente = 10
6
temps_ouvert = 5
7
8
def ouvrir_fichier(nom_fichier):
9
    """
10
    Ouvre le fichier 'nom_fichier' en écriture avec verrouillage
11
    et renvoie le descripteur de fichier.
12
    """
13
    print(f"Tente d'ouvrir {nom_fichier} en écriture")
14
    f = open(nom_fichier, "w")
15
    fcntl.lockf(f, fcntl.LOCK_EX)
16
    print(f"{nom_fichier} ouvert")
17
    return f
18
19
def fermer_fichier(f):
20
    """
21
    Déverrouille et ferme le descripteur de fichier 'f'
22
    """
23
    fcntl.lockf(f, fcntl.LOCK_UN)
24
    f.close()
25
    print("Fichier fermé")
26
27
28
f1 = ouvrir_fichier(fichier1)
29
print(f"Attente de {temps_attente} secondes")
30
time.sleep(temps_attente)
31
f2 = ouvrir_fichier(fichier2)
32
33
print(f"Attente de {temps_ouvert} secondes avant fermeture des fichiers")
34
time.sleep(temps_ouvert)
35
36
fermer_fichier(f1)
37
fermer_fichier(f2)
38

Le 2ème fichier Python est le même à part les lignes 3 et 4 :

1
fichier1 = "fichierB.txt"
2
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 :

1
python3 ouvre_fichier1.py

Dans le terminal B :

1
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.

1
OSError: [Errno 35] Resource deadlock avoided