----- Original Message ----- From: "Delaunay Christophe" <christophe.delau...@thomson.net> To: "Carrefour BLinux francophone, pour les non- et mal-voyants." <carrefourblinux@lists.freearchive.org>
Sent: Thursday, December 18, 2008 10:00 AM
Subject: RE: [CBLX] Question de programmation système



Bonjour Guillaume,

Tu as écrit:

Cela fait donc beaucoup de moyens de communiquer, mais je ne vois pas
quel moyen est le plus approprié pour écrire telle ou telle application.

C'est parce que deux choses interviennent dans le choix de tel ou tel moyen. Le plus important est le fait que le programmeur choisira toujours le moyen avec lequel il se sentira le plus à l'aise. De ce fait, vu qu'on peut se sentir plus à l'aise avec tel moyen plutôt que tel autre, on aura moins de souci à déboguer. Ensuite, mais seulement ensuite, vient le fait qu'on trouvera tel ou tel moyen plus efficace que tel ou tel autre.

Par exemple, pouvez vous me dire quels types d'applications utilisent :
- les tubes

Comme le disait Tarik, ce sont principalement des systèmes de type producteur(s)/consommateur(s). Le tube étant monodirectionnel, à l'entrée, tu mets un ou plusieurs producteurs, et à la sortie, tu mets un ou plusieurs consommateurs.

Dans le cas où chaque producteur écrit des données par paquets et où l'intégrité de chaque paquet doit être respectée, tu mettras un mutex à l'entrée du tube, de sorte que chaque producteur y aille à son tour. Le problème du tube est qu'il est généralement de petite taille et que cette taille n'est pas ajustable. Il se peut donc que ledit tube ne permette pas de tenir la cadence de producteurs/consommateurs trop rapides pour lui. Exemple typique: l'entrée du tube est alimenté par un driver qui, comme c'est un driver, ne peut se permettre d'avoir des tampons trop grands et qui, de ce fait, doit pouvoir fournir ses données très rapidement. Si à la sortie du tube, tu as un consommateur qui consomme à une vitesse irrégulière, il se peut fort bien que le tube s'engorge et que tu perdes des paquets à la sortie.

- les sockets locaux (parce que les sockets internet je connais)

C'est un moyen plus simple que de mettre deux tubes: l'un dans un sens et l'autre dans l'autre parce qu'un socket, c'est bidirectionnel. Cependant, comme le dit justement Tarik, il faut un processus qui commande, (le serveur), et ceux qui suivent, (les clients).

Avantage du socket local par rapport au tube: La taille de ses tampons d'émission et réception est ajustable. Pour de la transmission vidéo, j'ai même vu des sockets, (locaux ou même ethernet) avec des tampons d'émission/réception de 2 mo.

- les segments de mémoire partagée et les sémaphores

C'est dans le cas où tu as un assemblage de processus qui sont tellement interdépendants les uns des autres que le classique schéma de producteur/consommateur ne peut s'appliquer. Je n'ai pas d'exemple en tête mais d'une manière générale, quand la production d'une grosse quantité de données peut servir à un autre processus qui lui-même va produire autre chose dont on aura besoin plus tard. Du coup, on utilisera des sémaphores ou de simples mutex pour protéger l'espace de mémoire.

- les messages

Ils peuvent être pratiques pour gérer des événements en provenance de l'utilisateur mais ils sont généralement assez lourds. Ce moyen de communication fait penser à la manière dont des applications win32 communiquent avec leur utilisateur: chaque bouton appuyé, déplacement de souris, pression ou relâchement d'une touche du clavier, correspond à un message qui est envoyé à l'application.

Mais j'avoue ne pas avoir encore utilisé ce mécanisme sous linux. C'est seulement sous win32 que je m'en suis servi. Et encore, je l'ai fait uniquement parce que dès que tu te connectes à une interface utilisateur, tu sais qu'elle fonctionnera comme ça donc, tu t'y calques.

Mais globalement, bien faire attention à l'approche qui consisterait à être trop catégorique en se disant "J'ai tel type d'application à écrire donc j'utiliserai tel moyen plutôt que tel autre". Parce qu'en réalité, dans beaucoup de cas, (pas tous quand même), les moyens de communication sont interchangeables. Ne pas non plus confondre les moyens de communications: tubes, sockets, mémoire partagée, messages, avec les moyens de synchronisation: signaux, mutexes, sémaphores, ...

C'est pas faux :), j'ai un peu mélangé.
Mais en fait, si j'ai posé ces questions, c'est parce que notre enseignante, nous a fait coder des exercices qui parfois avaient les mêmes fonctionnalités mais n'utilisaient pas les même type de communication / synchronisation.
Par exemple, un programme qui devait exécuter deux commandes en paramètre.
J'ai fais un exercice où je devais le coder en utilisant les tubes et un autre exercice où j'ai utilisé les sockets.

Mais voila, grâce à vos réponses je vois un peu mieux quel type d'approche on peut avoir.

Bonne journée. @+ ChD
_______________________________________________
Liste de diffusion CarrefourBLinuX
   CarrefourBLinuX@lists.freearchive.org
   http://lists.freearchive.org/mailman/listinfo/carrefourblinux
Pour s'inscrire par courriel :
   'mailto:carrefourblinux-requ...@lists.freearchive.org?subject=bscribe'
Pour se retirer de la liste par courriel :
   'mailto:carrefourblinux-requ...@lists.freearchive.org?subject=subscribe'

Archives : http://lists.freearchive.org/pipermail//carrefourblinux
Anciennes archives (Yahoogroupes) :
   http://fr.groups.yahoo.com/group/carrefourblinux/messages
Rechercher : http://lists.freearchive.org/cgi-bin/search.cgi

Signets : http://fr.groups.yahoo.com/group/carrefourblinux/links/
Fiches EDU : http://blinuxwiki.pbwiki.com/FichesEdu

_______________________________________________
Liste de diffusion CarrefourBLinuX CarrefourBLinuX@lists.freearchive.org
   http://lists.freearchive.org/mailman/listinfo/carrefourblinux
Pour s'inscrire par courriel : 'mailto:carrefourblinux-requ...@lists.freearchive.org?subject=subscribe' Pour se retirer de la liste par courriel : 'mailto:carrefourblinux-requ...@lists.freearchive.org?subject=unsubscribe'

Archives : http://lists.freearchive.org/pipermail//carrefourblinux
Anciennes archives (Yahoogroupes) :
   http://fr.groups.yahoo.com/group/carrefourblinux/messages
Rechercher : http://lists.freearchive.org/cgi-bin/search.cgi

Signets : http://fr.groups.yahoo.com/group/carrefourblinux/links/
Fiches EDU : http://blinuxwiki.pbwiki.com/FichesEdu

Répondre à