|
|
|
L'objectif de ce TP est la découverte de l'interface de programmation offerte par POSIX.4; et plus particulièrement les threads et les outils de communication/synchronisation associés.
Pour illustrer l'utilisation des threads, nous allons paralléliser un algorithme de calcul des plus courts chemins d'un graphe. L'algorithme en question (algorithme de Bellman et Ford) calcule tous les plus courts chemins pour tous les sommets du graphe.
Le code séquentiel de cet algorithme, appliqué au graphe ci-dessus, est donné dans le fichier ford.c. La matrice à droite de la figure est la matrice d'adjacence du graphe pour lequel, l'absence d'arc entre deux sommets est matérialisée par le signe + infini. L'algorithme fonctionne de la façon suivante :
Au final, les calculs effectués
par cet algorithme sont équivalents à des multiplications de matrices.
Compilez le programme précédent
et exécutez le.
Dans un premier temps, on exécute l'algorithme à l'aide de plusieurs processus. Un processus effectue la boucle for de plus haut niveau. Puis, NB_SOMMETS processus effectuent les calculs sur les lignes de la matrice d'adjacence : chaque processus est chargé d'effectuer les calculs d'une ligne donnée.
gcc -D_REENTRANT pgm.c -o pgm -lpthread -lrt
Modifiez le programme précédent de
sorte que le thread principal soit synchronisé avec les threads qui exécutent
calcul_une_ligne() grâce à une variable conditionnelle.
L'objectif de cet exercice est d'implanter le paradigme de coopération lecteurs/rédacteurs. Ce dernier permet l'accès à une ressource partagée entre plusieurs tâches/threads dans les conditions suivantes :
On vous demande de :
En guise de conclusion pour ce TP, on allons voir qu'une certaine forme
de parallélisme est possible sans les threads, et ce grâce aux timers et
aux E/S asynchrones de POSIX.4. Le programme text.c
en est un exemple.
Ce programme lit et affiche à l'écran un texte périodiquement (extrait de l'avare de Molière). Les lectures sont réalisées de façon asynchrones. Affichages et lectures s'effectuent grâce à un timer qui délivre un signal UNIX temps réel toutes les 2 secondes. Pour chaque occurrence de signal, on teste la terminaison de la lecture du texte, on affiche le texte et on lance la lecture suivante : cette méthode permet de recouvrir le temps de lecture du fichier : en effet, le processus n'est pas bloqué durant la phase de lecture et peut donc effectuer un traitement quelconque et ce jusqu'à l'occurrence du signal suivant où là, la lecture a toute les chances d'être terminée.
On vous demande de :
NB: les zones à compléter sont signalées par des étoiles.