Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
15 décembre 2009
http ://www.linuxhq.com/guides/LPG/node47.html
Samia Bouzefrane, Applications concurrentes : concepts et
outils Applications concurrentes : concepts et outils, CNAM,
http ://cedric.cnam.fr/ bouzefra
http ://mathieu147.11vm-
serv.net/cmsmadesimple/index.php ?page=programmation-
concurrente
Sommaire
1 Introduction
3 Appels systèmes
4 Problèmes classiques
1 Introduction
3 Appels systèmes
4 Problèmes classiques
Introduction
Si tous les cinq (5) sémaphores ont chacun une valeur égale à zéro
(0), cela signifie que les cinq (5) imprimantes sont toutes occupées
et qu’aucune n’est disponible. Aucune autre requête ne sera
envoyée à cette imprimante tant que la valeur du sémaphore sera
inférieure ou égale à 0. Après l’exécution de la tâche d’impression
de Djibril, le gestionnaire d’impression incrémentera la valeur du
sémaphore concerné à un (1), ce qui signifie qu’il a une ressource
disponible et en attente d’utilisation.
Définition (suite)
Structure semid ds
struct semid_ds
{
struct ipc_perm sem_perm; /* (1) */
struct __sem *sem_base; /* (2) */
time_t sem_otime; /* (3) */
time_t sem_ctime; /* (4) */
unsigned short sem_nsems; /* (5) */
};
Avec :
(1) : structure décrivant les droits - voir ipc.h
(2) : pointeur sur le premier sémaphore
(3) : date de la dernière opération PVZ
(4) : date de la dernière opération semctl
(5) : nombre de sémaphores de l’ens
Structure sem
Le système stocke des informations pour chaque sémaphore dans
une structure sem :
struct sem
{
ushort semval; /* (1) */
pid_t sempid; /* (2) */
ushort semncnt; /* (3) */
ushort semzcnt; /* (4) */
kcondvar_t semncnt_cv;
kcondvar_t semzcnt_cv;
};
Avec :
(1) : valeur du sémaphore
(2) : pid de la dernière opération
(3) : awaiting semval ¿ cval
(4) : awaiting semval = 0
Appels systèmes
Valeurs retournées :
entier positif en cas de succès ;
-1 en cas d’erreur. Les codes d’erreurs retournés sont :
EACCES : le processus appelant n’a pas les privilèges
nécessaires pour exécuter la commande cmd ;
EFAULT : arg.buf ou arg.array pointent en dehors de l’espace
d’adressage accessible ;
EIDRM : l’ensemble de sémaphores a été supprimé ;
EINVAL : cmd ou semid a une valeur illégale ;
Exemple 1
Un évènement peut être définit comme une action qui requière une
réponse d’un programme : un exemple d’évènement peut être par
exemple la pression d’une touche de clavier ou un mouvement de la
souris, provoquant l’envoi d’un block de données depuis le disque
dur ou alors l’envoi d’un paquet à travers le réseau.
Dans tous les cas, dans le cadre d’un évènement, un processus
producteur crée un objet évènement et le stocke dans la mémoire
des évènements ; les processus consommateur, appelés
gestionnaires d’évènements, retirent de cette mémoire les
évènements qui y sont stockés et les traitent.
Problèmes
Les problèmes surviennent lorsque :
Le producteur veut mettre des informations alors que la
mémoire tampon est déjà pleine et lorsque
Le consommateur tente de retirer une information alors que la
mémoire tampon est vide.
Conséquences
1 Exclusion mutuelle d’accès aux messages (le message peut
être lu ou écrit en plusieurs opérations) ;
2 Le producteur s’arrête s’il veut déposer alors que le tampon
est plein. Il est réveillé quand cette condition n’est plus vraie ;
3 Le consommateur s’arrête s’il veut retirer alors que le tampon
est vide. Il est réveillé quand cette condition n’est plus vraie.
Exemples
Exemple2
Un processus d’un site émetteur dans un réseau envoie des
messages à destination d’un processus d’un site récepteur ; celui-ci
doit être prêt à recevoir ces messages ; toutefois l’émetteur ne doit
pas les envoyer plus vite que le récepteur ne peut les recevoir. Il
faut assurer un contrôle de flux entre sites.
Exemple3
Un service de messagerie permet aux abonnés d’un réseau
d’envoyer du courrier électronique ; un abonné édite son courrier et
le dépose dans la boite aux lettres du destinataire, que celui-ci soit
en session ou non ; un abonné lit son courrier, que l’émetteur soit
ou non en session.
//Producteurs //Consommateurs
Debut true → Debut true →
"Produire un élément"; wait(ed);
wait(pd); wait(mt);
wait(mt); "Retirer un élément";
"Déposer l’élément dans le tampon";
signal(mt);
signal(mt); signal(pd);
signal(ed) "Consommer l’élément"
Fin Fin
//Ecrivain //Lecteur
Début Début
Répéter Répéter
Début_écriture; Début_lecture;
Ecriture; Lecture;
Fin_écriture; Fin_lecture;
Fin Fin
Exemples
Exemple1
Une entreprise veut gérer en temps réel une base d’informations ;
certains processus modifient cette base ou y font des adjonctions ;
d’autres processus ne font que la lire, sans modifications. On
souhaite avoir le maximum de concurrence pendant ces lectures.
Exemples (suite)
Exemple2
Dans tout système informatique, on maintient de nombreux
catalogues pour répertorier les clients, les abonnés, les groupes
d’usagers, les utilisateurs en session, les autorisations diverses, les
processus, les ressources disponibles, les ressources en
maintenance,.... ; des processus mettent ces catalogues à jour, en
général à fréquence faible ; d’autres processus les lisent, en général
assez fréquemment ; pour une meilleure efficacité, il est souhaitable
de faire les lectures en parallèle.