Page préc.
Echanges de données entre processus
Fin de page Page suiv.
Les modèles de coopération entre processus

Exemple de coopération entre processus

    Les entrées-sorties tamponnées sur disque sont un excellent exemple de mécanisme de coopération entre plusieurs processus. Nous avons vu dans le chapitre "Introduction", que les unités centrales des ordinateurs sont, en cas de sortie directe, fortement ralenties par les périphériques d'entrées/sorties qui représentent de véritables goulots d'étranglement :


Entrées/Sorties : goulots d'étranglement

    Pour remédier à cet inconvénient ont été inventées les entrées/sorties tamponnées. Le principe consiste à charger (si possible) par anticipation les données à lire, et à stocker provisoirement les résultats sur un support mémoire d'accès rapide, dans un tampon (buffer). Le support mémoire le plus rapide est la mémoire principale, dont le coût limite cependant la taille. Le support disque, moins rapide, est aussi beaucoup moins onéreux, et permet l'utilisation de tampons de très grandes tailles. Nous allons analyser ici le principe d'une sortie tamponnée sur disque :


Entrées/Sorties tamponnées

     Elle met en œuvre différentes activités parallèles et indépendantes, qui doivent cependant être synchronisées. Supposons que l'utilisateur dispose dans son langage de programmation d'une procédure Imprimer permettant d'envoyer UneLigne (suite de caractères soit de longueur fixe, soit terminée par un "drapeau") sur une imprimante. En fait, cette procédure appelle une fonction du système d'exploitation (SVC) qui stocke provisoirement le contenu de la mémoire à partir de l'adresse UneLigne dans un tampon en mémoire principale, que nous appellerons TamponEcrit. Dès que possible (les transferts entre la mémoire et le disque sont plus lents que les écritures en mémoire), l'activité 1 transfère les données sur disque, dans le tampon. A l'autre extrémité de la chaîne, l'activité 3 transfère les données du tampon TamponImprim vers l'imprimante, au rythme de celle-ci. Dès que de la place a été libérée dans ce tampon, l'activité 2 le recharge à partir du disque. Les trois activités 1, 2 et 3 transfèrent en parallèle des données entre la mémoire, le disque et l'imprimante au moyen de canaux de commande. Un canal de commande est un processeur indépendant piloté par un programme de canal situé en mémoire principale. Le système d'exploitation initialise une opération d'entrée/sortie en envoyant une commande spéciale au canal de commande qui lui indique où se trouve le programme de canal et qui en lance l'exécution. La suite du transfert des données est effectuée par le canal, indépendamment du processeur central qui peut reprendre une autre activité. La fin d'un transfert est signalée par le canal au moyen d'une interruption, qui provoque le déclenchement du traitant d'interruption. Les trois activités sont appelées respectivement EcritureDisque, LectureDisque et EcritureImprimante. Le prédicat Actif(Activite) indique l'état de l'Activite passée en paramètre. Les prédicats Plein(UnTampon) et Vide(UnTampon) indiquent l'état de UnTampon passé en paramètre. On peut donner de la fonction système Imprimer(UneLigne) la description suivante :
 
procedure Imprimer (UneLigne);

debut
    si Plein (TamponEcrit)
    alors
        si non Actif (EcritureDisque) et non Plein (TamponDisque)
        alors
            PreparerEcritureDisque;  //   relancer (1)
        finsi;
        Attendre;
    finsi;

    Copier (UneLigne, TamponEcrit);

    si non Actif (EcritureDisque)
    alors
        PreparerEcritureDisque;      //   relancer (1)
    finsi;

fin Imprimer;

    Cet algorithme mérite plusieurs commentaires :

    Lorsque la procédure TraiterInterruptionEcritureDisque ci-dessous s'effectue, cela signifie qu'un transfert de TamponEcrit vers TamponDisque est achevé. Trois actions doivent être envisagées :
 
procedure TraiterInterruptionEcritureDisque; // signale fin de(1)
debut
    si non Vide (TamponEcrit) et non Plein (TamponDisque)
    alors
        PreparerEcritureDisque;                 // relancer (1)
    finsi;
    si non Plein (TamponImprim) et non Actif (LectureDisque)
    alors
        PreparerLectureDisque;                 // relancer (2)
    finsi;

    si Attente
    alors
        Reprendre (Imprimer);                 // relancer (0) !!!
    finsi;
fin TraiterInterruptionEcritureDisque;

    Comme précédemment, une interruption de fin de lecture sur disque entraîne l'exécution de la procédure TraiterInterruptionLectureDisque ci-dessous, qui provoque le déclenchement de trois actions. La première consiste évidemment à relancer une impression, si aucune n'est en cours. L'ordre des deux autres n'est pas impératif, mais correspond à la propagation de l'événement de l'aval vers l'amont de la chaîne des activités.
 
procedure TraiterInterruptionLectureDisque; // signale fin de (2)
debut
    si non Actif (EcritureImprimante)
    alors
        LancerImpressionLigne;              // relancer (3)
    finsi;

    si non Plein (TamponImprim) et non Vide (TamponDisque)
    alors
        PreparerLectureDisque;              // relancer (2)
    finsi;

    si non Vide (TamponEcrit) et non Actif (EcritureDisque)
    alors
        PreparerEcritureDisque;             // relancer (1)
    finsi;

fin TraiterInterruptionLectureDisque;

    Enfin, la procédure TraiterInterruptionEcritureImprimante ci-dessous, correspond au traitement d'une interruption en provenance du pilote de l'imprimante, lorsque le buffer TamponImprim a été vidé.
 
procedure TraiterInterruptionEcritureImprimante // fin de (3)
debut
    si non Actif (LectureDisque) et non Vide (TamponDisque)
    alors
        PreparerLectureDisque;                  // relancer (2)
    finsi;

    si non Vide (TamponImprim)
    alors
        LancerImpressionLigne):                 // relancer (3)
    finsi;

fin TraiterInterruptionEcritureImprimante;


Page préc.
Echanges de données entre processus
Début de page Page suiv.
Les modèles de coopération entre processus
Dernière mise à jour : 10/10/2001