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.

Vous ne travaillez pas sur un poste Linux ? Cliquez sur le bandeau ci-dessous.

Connexion au serveur en ssh

Vous pouvez utiliser un terminal sur une machine Linux distante.

Connectez-vous au serveur distant de l'enseignant en entrant, dans un terminal (sous MacOS), dans Putty ou Powershell (sous Windows), la commande :

ssh identifiant@A.B.C.D
en remplaçant identifiant par l'identifiant et A.B.C.D par l'adresse IP communiqués par l'enseignant.

Votre mot de passe vous sera alors demandé : lui aussi vous a été communiqué par l'enseignant.
La communication avec le serveur distant s'établit alors et vous propose une invite de commande :

identifiant@vpsXXXXXX:~$ 

Vous êtes prêt à démarrer !

  1. Ouvrez un terminal dans votre répertoire utilisateur (c'est déjà le cas si vous utilisez le serveru distant).

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

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

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

  5. Ouvrez un second terminal dans le même répertoire (si vous utilisez le serveur distant, établissez une seconde connexion avec ce serveur).

    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.