next up previous contents
Next: Status de retour Up: UTILISATION DE LA LIBRAIRIE Previous: Partage de donnéesMatrice

Modes de synchronisations

Les modes des synchronisation sont les suivants. Pour plus de clarté les status de retours ne sont pas testés.

Communication synchrone sans attente

Ce mode permet de lancer une commande au serveur sans attendre la fin de son exécution. Les étapes sont les suivantes:

Le client se met en attente sur la ressource

dec_sem_zero(semid, block, timeout);

il remplis le bloc de communication

ini_shm_block_kw(block);

put_shm_block_kw(block, "COMMAND", cmd);

put_shm_block_kw(block, key, content);

il signale qu'il ne reste pas en attente sur la fin de l'exécution mais que le serveur devra rendra la main

block->ackno = 0;

il ordonne au serveur d'exécuter la commande "cmd"

setval_sem(semid, 2, 1);

inc_sem(semid, 1);

Appel équivalent simplifié

L'appel équivalent simplifié pour une commande sans paramètre est:

send_command(semid, block, cmd, NO_FORK_PROCESS,

NO_WAIT_FOR_ANSWER, timeout);

Communication synchrone avec attente

Ce mode permet de lancer une commande au serveur puis attendre la fin de son exécution et pouvoir récupérer des résultats facultatifs. Les étapes sont les suivantes:

Le client se met en attente sur la ressource

dec_sem_zero(semid, block, timeout);

il remplis le bloc de communication

ini_shm_block_kw(block);

put_shm_block_kw(block, "COMMAND", cmd);

put_shm_block_kw(block, key, content);

il signale qu'il reste en attente sur la fin de l'exécution, donc le serveur ne devra pas rendre la main

block->ackno = 1;

il ordonne au serveur d'exécuter la commande "cmd"

setval_sem(semid, 2, 1);

inc_sem(semid, 1);

il se met en attente sur la fin de l'exécution

wait_for_sem(semid, 2, timeout);

il récupère (facultativement) des paramètres en retour

get_shm_block_kw(block, key, content);

il libère la ressource

inc_sem(semid, 0);

Appel équivalent simplifié

L'appel équivalent simplifié pour une commande sans paramètre est:

send_command(semid, block, cmd, NO_FORK_PROCESS,

WAIT_FOR_ANSWER, timeout);

puis le client se met en attente sur la fin de l'exécution

wait_for_sem(semid, 2, timeout);

il récupère (facultativement) des paramètres en retour

get_shm_block_kw(block, key, content);

il libère la ressource

inc_sem(semid,0);

Communication asynchrone

Ce mode est à utilisé avec la plus grande prudence. Il consiste à envoyer des paramètres à un serveur exécutant une tache en arrière plan sans utiliser les sémaphores.

Par exemple, on peut imaginer un serveur recevant un ordre sans attente qui va le faire exécuter une boucle illimitée. Un contrôle de sa tache peut être fait si le serveur lit le bloc de communication durant son processus. Ainsi un ou plusieurs clients (attention, cela se passe sans synchronisation) peut écrire des valeurs dans le bloc de communication permettant d'influencer le comportement du serveur.

Dans l'exemple qui suit, on voit l'initialisation du processus, où on lance la commande "do_for_ever" avec le flag "OK". Le serveur recevant cette commande partira et l'exécutera tant que flag sera égal à "OK"

          dec_sem_zero(semid,block,timeout);	
          ini_shm_block_kw(block);	
          put_shm_block_kw(block,"COMMAND","do_for_ever");	
          put_shm_block_kw(block,"FLAG","OK");	
          block->ackno = 0;		
          setval_sem(semid, 2, 1);	
          inc_sem(semid, 1);
plus tard, pour terminer le processus bouclant, le client, ou un autre client, exécute par exemple:
          ini_shm_block_kw(block);	
          put_shm_block_kw(block,"FLAG","STOP");


next up previous contents
Next: Status de retour Up: UTILISATION DE LA LIBRAIRIE Previous: Partage de donnéesMatrice

WEBER Luc
Mon May 10 13:41:34 MET DST 1999