Aller au contenu

TP - Interblocage

La bande-dessinée ci-dessous résume cette notion. Merci à L. Petit qui est le concepteur de cette planche :

interblocage

Visualisation d'un interblocage

Ce TP a pour but de mettre en pratique un cas d'interblocage sur système Linux.

  1. Ouvrez un terminal dans votre répertoire utilisateur.
  1. Exécutez les commandes suivantes pour télécharger et copier deux fichiers Python dans ce répertoire utilisateur :

    wget http://www.mathinfo.ovh/Terminale_NSI/C01_Gestion_Processus/fichiers/ouvre_fichier1.py
    
    wget http://www.mathinfo.ovh/Terminale_NSI/C01_Gestion_Processus/fichiers/ouvre_fichier2.py
    

  2. Exécutez la commande ls et vérifiez que les fichiers ouvre_fichier1.py et ouvre_fichier2.py sont présents.

  3. En lisant le code de ces programmes, conjecturez ce qu'ils font.

    Contenu de ces fichiers

    Le code du fichier ouvre_fichier1.py est :

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    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()
    
    f1 = ouvrir_fichier(fichier1)
    print(f"Attente de {temps_attente} secondes")
    time.sleep(temps_attente)
    f2 = ouvrir_fichier(fichier2)
    
    time.sleep(temps_ouvert)
    
    fermer_fichier(f1)
    fermer_fichier(f2)
    
    Réponse

    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.

  4. Ouvrez un second terminal dans le même répertoire.

    1. Dans le terminal A, préparez la commande suivante (sans l'exécuter) :

      python3 ouvre_fichier1.py
      

    2. Dans le terminal B, préparez la commande suivante (sans l'exécuter)

      python3 ouvre_fichier2.py
      
    3. Exécutez ces commandes à moins de 10 secondes d'intervalle.
      Que se passe-t-il ?

      Réponse

      Un des programmes plante car le système a détecté un cas d'interblocage.