Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2016/ecrire/inc/distant.php on line 699
1. Signaux arborescents, thread unique et couple de tubes (Master 2016 2017)

PR : Contrôles des connaissances
1. Signaux arborescents, thread unique et couple de tubes
partiel 03/11/2016

Vous créerez dans votre répertoire personnel, s'il n'est pas déjà là, le sous-répertoire "public_html" dans lequel vous placerez toutes vos réponses, qui y seront automatiquement ramassées. Seuls les fichiers demandés le seront, aussi il est impératif de bien contrôler leur création: nom exact (sans confondre minuscules et majuscules, tiret et souligné etc, ni placer des espaces autour du nom) et droit d'accès 640 pour un fichier non exécutable et droit d'accès 750 pour ses répertoires parents ou un fichier exécutable. Dans le cas où une réponse nécessite les fonctions écrites dans une réponse précédente, celles-ci ne doivent pas être recopiées, le recours au mécanisme d'inclusion des langages de programmation étant plus fiable et plus lisible.

Le présent examen est constitué de trois problèmes indépendants, présentés par ordre chronologique des notions exposées dans l’enseignement, ordre pas forcément le meilleur pour réussir l’examen au mieux.

Vous utiliserez le Makefile fourni en annexe, ce qui garantira que vous avez nommé correctement les fichiers demandés, et vous fera gagner du temps pour les tests. Le cas échéant, vous aurez à lui ajouter l’option -lpthread.

Notes sur 20.

1. Arborescence de processus et signaux

On considère le programme fork_arborescence.c donné en annexe devant recevoir en argument un entier N (2 ≤N≤ 4) :


Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2016/ecrire/inc/distant.php on line 699

Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2016/ecrire/inc/distant.php on line 699

1.1 Compter les processus (2  point(s))

Répondez au questions suivantes :

  1. Quel est le nombre de processus créés par le programme ?
  2. Combien y-a-t-il de processus par niveau de l’arborescence ?
  3. Quels sont les processus qui ont des fils ?
  4. Combien ont-ils de fils ?
Barème
  1. Q1 & Q2
  2. Q3 & Q4

1.2 Synchroniser les affichages (6  point(s))

Donnez une nouvelle version de ce programme, sans changer l’arborescence créée, de sorte que le premier processus créé par le processus principal ne fasse son affichage qu’après que le dernier processus créé dans le programme a fait le sien. Pour une telle synchronisation vous devrez utiliser le signal SIGUSR1 et les fonctions concernant les signaux.

Exemple d'appel :
$PWD/bin/fork_signaux 4
Barème
  1. choix des processus pour SIGUSR1
  2. connaissance du Pid 1.1 par le processus 3.3
  3. utilisation de kill par le bon processus
  4. utilisation de sigprocmask
  5. utilisation de sigaction
  6. utilisation de sigsuspend par le bon processus

2. Utilisation et implémentation de pthread_once

L’objectif de cet exercice est d’utiliser (question 1), d’étendre (question 2) puis ré-utiliser (question 3) la fonction pthread_once proposée par la bibliothèque pthread.

Celle-ci permet d’assurer qu’une fonction donnée en paramètre ne soit exécutée qu’une seule fois même si plusieurs threads du même processus font appel à pthread_once avec la même fonction en paramètre. Cela est particulièrement intéressant pour une fonction d’initialisation qui ne doit être exécutée qu’une fois par un thread quelconque du processus. Pensez à consulter man pour plus d’informations.


Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2016/ecrire/inc/distant.php on line 699

Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2016/ecrire/inc/distant.php on line 699

Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2016/ecrire/inc/distant.php on line 699

2.1 Utilisation de pthread_once (4  point(s))

Écrivez un programme ayant le comportement suivant. Un thread principal va créer successivement NB_THREAD (déclaré comme macro) threads. Pour chacun d’entre eux, il va tirer un entier aléatoire entre 1 et 5. Chaque thread fera un premier affichage, attendra durant le nombre de secondes tiré pour lui par le thread principal puis tentera de faire un second affichage. La contrainte à respecter ici est qu’exactement un thread réalise ce second affichage sur l’ensemble des threads créés.

Exemple d'appel :
$PWD/bin/test_once_1
Barème
  1. création de threads
  2. passage de paramètre au thread (malloc/free/gestion pointeurs)
  3. utilisation pthread_once (passage du pointeur de fonction en paramètre)
  4. utilisation de pthread_once_t

2.2 Extension de pthread_once (3  point(s))

Une des restrictions de pthread_once est que la fonction appelée ne peut pas prendre de paramètre ni avoir de retour, car le pointeur de fonction en paramètre est de type

void (*init_routine)(void)

Pour pallier ce défaut, nous souhaitons proposer une fonction my_pthread_once ayant le même comportement mais prenant en paramètre un pointeur de fonction de type

void *(*to_execute) (void *)

de façon à assurer la généricité.

Le fichier my_pthread_once.h donné en annexe donne la signature complète de cette fonction, ainsi qu’un type de données nommé my_pthread_once_t. Dans cette question il vous est demandé de définir la fonction my_pthread_once, à l’aide de la fonction auxiliaire suivante :

void my_pthread_once_t_init(my_pthread_once_t *once){
        once->flag=0;
        pthread_mutex_init(&(once->mutex_flag),NULL);
}
Barème
  1. gestion du done en mutex
  2. exécution de la fonction en mutex
  3. appel de la fonction passée en paramètre

2.3 Ré-utilisation (1  point(s))

Donner une nouvelle version de votre réponse à la question 1 de sorte que le deuxième affichage comporte la durée attendue par le thread réalisant l’affichage.

Exemple d'appel :
$PWD/bin/test_once_2 5
Barème
  1. utilisation de my_pthread_once

3. Deux tubes à assembler


Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2016/ecrire/inc/distant.php on line 699

3.1 Deux tubes à assembler (bis) (4  point(s))

Ecrire un programme créant deux tubes anonymes et 2 processus fils. Chaque processus fils tire un nombre entier aléatoire inférieur à 10, qu’on nommera L et D respectivement. Le premier processus fils écrit alors dans un des deux tubes L fois une lettre majuscule. Le deuxième écrit dans l’autre tube D fois un chiffre compris entre 0 et 9. Le programme principal lit les deux tubes et envoie sur le flux de sortie la première lettre reçue, puis le signe "=", puis le premier chiffre reçu, puis un saut de ligne, et ainsi de suite jusqu’à ce que l’un des deux processus cesse d’émettre un caractère. Le processus principal attend pour finir la terminaison des deux.

Précisions : le processus principal n’a pas accès aux valeurs L et D, car elles sont produites après création des processus fils, et il ne doit pas écrire plus de lettres que de chiffres et inversement.

Pour produire les lettres et les chiffres, on pourra utiliser la macro C suivante, sachant que le code ASCII des majuscules commence à 65 et celui des chiffres à 48 :

#define gen_alea(base, card) (base + (int) (card*(float)(rand())/ RAND_MAX))
Exemple d'appel :
$PWD/bin/couple
Barème
  1. création des tubes et des processus
  2. émission des valeurs aléatoires
  3. réception des valeurs aléatoires
  4. écriture et attente de terminaison

1 Annexes


fork_arborescence.c

makefile

lib_my_pthread_once.h