Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2383 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Communication inter-processus

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Communication inter-processus

n°465083
Giz
Posté le 22-07-2003 à 17:39:09  profilanswer
 

Je dois programmer une sorte de "passerelle" (un pc intermediaire sollicite dans les 2 sens de communications).
En gros voila le fonctionnement de la chose :
3 Unites (1, 2, 3) connectees entre elles de la facon suivante :
-1 communique vers 2 via une carte I/O
-2 communique vers 3 via l'ethernet 100Mbits (UDP)
-3 communique vers 2 via l'ethernet 100Mbits (meme cable physique que la comm de 2 vers 3) (TCP)
-2 communique vers 1 via la carte I/O (la meme que la comm de 1 vers 2)
 
1 envoie une masse de donnee. 2 se doit de la traiter puis de l'envoyer direct a 3...TOUT EN RESTANT a l'ecoute de 1. Dans l'autre sens, 3 envoie des donnees a 2. 2 traite les donnes et les envoient a 1...TOUT EN RESTANT a l'ecoute de 3.
 
Vous comprenez que la machine 2 est dc sans cesse sollicitee. Cette "passerelle" recoit des donnees d'une part en provenance de la carte I/O (venant de 1), d'autre part en provenance de l'ethernet (venant de 3) tout en restant a l'ecoute de chacune (1 et 3). Bref tout ca, vous avez compris ;) , ca sent la communication inter-processus : 1 envoie les donnees dans un tube (lecture de la carte I/O), 3 lit la sortie du tube (par ecoute du port ethernet via UDP).De meme dans l'autre sens, 3 envoie des donnees (par remplissage du tube via TCP) et 2 lit la sortie puis ecrit les donnes sur la carte I/O.
 
But primordiale : vitesse maximale du reseau
J'ai choisi UDP de 2 vers 3 car connexion non necessairement securisee or, 3 vers 2 doit etre securise (d'ou TCP).
Je sais qu'il existe plusieurs methode de comm inter-processus, je pensais au "pipe", est ce le meilleur choix ?
 
PS : c du C++ sous W98 avec VC++6


Message édité par Giz le 30-07-2003 à 13:31:46
mood
Publicité
Posté le 22-07-2003 à 17:39:09  profilanswer
 

n°465117
western
AJMM
Posté le 22-07-2003 à 17:56:44  profilanswer
 

quel OS?
sous GNU/Linux, il y a des 'named pipes' mais
pas besoin de pipe, deux threads (a et b) sur le 2:
a ecoute(read bloquant) la carte et envoi(write non-bloquant) tout à 3 en UDP (ou TCP, car en UDP peut y avoir des pertes de datagrammes ou des datagrammes qui se doublent, etc.)
b ecoute(read bloquant) le 3 (socket) et envoi le tout sur la carte I/O (write non-bloquant)
 
Donc pas de pipes ...

n°465135
Giz
Posté le 22-07-2003 à 18:12:08  profilanswer
 

C du VC++6 sous win98.
Hum mouai, les threads (je connais sans plus et jviens de jeter un oeil) ont l'air pas mal ;) ... c koi l'avantage par rapport au pipe ?

n°465147
HelloWorld
Salut tout le monde!
Posté le 22-07-2003 à 18:31:33  profilanswer
 

Ben justement de pas avoir à te faire chier pour communiquer vu que chaque thread a accès à l'espace mémoire des autres.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°465609
Giz
Posté le 23-07-2003 à 11:32:24  profilanswer
 

HelloWorld a écrit :

Ben justement de pas avoir à te faire chier pour communiquer vu que chaque thread a accès à l'espace mémoire des autres.


 
OK, merci bien  :jap:

n°471876
Giz
Posté le 30-07-2003 à 13:30:05  profilanswer
 

Peut on acceder a la zone memoire d'un thread ? Si oui, comment ?
 
En fait j'aurais un thread qui executera la fonction de lecture de la carte I/O. Dans cette fonction, il y a un buffer qui stockera les donnees lues sur la carte I/O.
Un autre thread executera une autre fonction qui se contentera de faire des calculs a partir des donnees lues sur la I/O card. Donc il faudra que ce thread puisse acceder a la variable buffer de l'autre thread.
En fait j'aurai 5 threads en execution sur la machine 2. 1 pour chaque fonction (lecture de la carte I/O, calculs etablis sur la machine, envoie par UDP, recois par TCP, ecriture sur la carte I/O)

n°471879
western
AJMM
Posté le 30-07-2003 à 13:31:17  profilanswer
 

giz a écrit :

Peut on acceder a la zone memoire d'un thread ? Si oui, comment ?
 
En fait j'aurais un thread qui executera la fonction de lecture de la carte I/O. Dans cette fonction, il y a un buffer qui stockera les donnees lues sur la carte I/O.
Un autre thread executera une autre fonction qui se contentera de faire des calculs a partir des donnees lues sur la I/O card. Donc il faudra que ce thread puisse acceder a la variable buffer de l'autre thread.
En fait j'aurai 5 threads en execution sur la machine 2. 1 pour chaque fonction (lecture de la carte I/O, calculs etablis sur la machine, envoie par UDP, recois par TCP, ecriture sur la carte I/O)


Declarer ton buffer static
 
EDIT: par contre, il faut mettre en place des mutex


Message édité par western le 30-07-2003 à 13:32:23
n°471884
Giz
Posté le 30-07-2003 à 13:32:57  profilanswer
 

western a écrit :


Declarer ton buffer static


 
Tu veux que ce soit une variable globale alors ? (pour que chaque fonction la voit)

n°471896
Giz
Posté le 30-07-2003 à 13:39:35  profilanswer
 

et en plus il me faut tous ca dans l'ordre ; cad qu'il ne faut pas faire des calculs AVT d'avoir lu dans le buffer les nouvelles donnees qui viennent d'arrivee :/

n°471982
HelloWorld
Salut tout le monde!
Posté le 30-07-2003 à 14:23:53  profilanswer
 

Ben c'est le but du mutex.
Le lecteur fait :
WaitForSignleObject( hMutex, 0 );
et il restera bloqué à cet endroit tant que le rédacteur n'aura pas déverouiller le Mutex. Cherche de la doc sur la accès concurrent et le problème lecteur / redacteur.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
mood
Publicité
Posté le 30-07-2003 à 14:23:53  profilanswer
 

n°472011
Giz
Posté le 30-07-2003 à 14:43:39  profilanswer
 

HelloWorld a écrit :

Ben c'est le but du mutex.
Le lecteur fait :
WaitForSignleObject( hMutex, 0 );
et il restera bloqué à cet endroit tant que le rédacteur n'aura pas déverouiller le Mutex. Cherche de la doc sur la accès concurrent et le problème lecteur / redacteur.


 
 
C ce que je suis en train de faire  :jap: ... c du partage de ressources en simultanee en fait. Les semaphores ne feraient pas ? (1 vers 2 puis 2 vers 3 puis 3 vers 2 puis 2 vers 1)...c un passage de jetons non ?
Cependant a la fin de la "boucle" (de 2 vers 1) je ne pourrais pas recevoir les donnees de la carte I/O. Ceci dit le tps de faire une "boucle" est peut etre insignifiant non (ce qui revient a du quasi simultanne)?


Message édité par Giz le 30-07-2003 à 14:44:23
n°472096
Giz
Posté le 30-07-2003 à 15:40:28  profilanswer
 

En fait, pour la "1ere boucle", je dois utiliser un systeme de jeton : chaque thread commencera apres que son thread anterieur ait commence. Mais a partir du moment ou un thread a commencer, il ne doit plus s'arreter :/

n°472332
HelloWorld
Salut tout le monde!
Posté le 30-07-2003 à 17:52:39  profilanswer
 

Un Mutex c'est un verrou => semaphore initialisé à 1, sémaphore "binaire" ou "booléen".


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°472340
Giz
Posté le 30-07-2003 à 17:58:56  profilanswer
 

HelloWorld a écrit :

Un Mutex c'est un verrou => semaphore initialisé à 1, sémaphore "binaire" ou "booléen".


 
Voui merci  :jap: je vais utilisez les mutex. deux fonctions consecutives qui fonctionneront de la fonction suivante :
la fonction precedente libere le mutex, la fonction suivante peut alors s'executer. Les fonctions s'enchaineront sans pb, et tout se fera simultanement c bon  ;)

n°477056
Giz
Posté le 04-08-2003 à 15:34:49  profilanswer
 

Citation :

En fait j'aurai 5 threads en execution sur la machine 2. 1 pour chaque fonction (lecture de la carte I/O, calculs etablis sur la machine, envoie par UDP, recois par TCP, ecriture sur la carte I/O)


 
-fonction 1 : ecriture dans le buffer
-fonction 2: lecture du buffer - puis mis a jour du buffer
-fonction 3: lecture du buffer
-fonction 4: lecture du buffer (les donnees recues par TCP seront stockees dans ce buffer)
-fonction 5: ecriture dans le buffer (pour envoyer a l'io card)
 
Problemes :/ :
 
Les 5 fonctions requiert d'etre executees avant que la fonction 1 reinterroge la io card pour y lire les donnees.
En gros, ce seront 5 threads a la "queuleuleu" qui attendront chaque fois le jeton du precedent threads. Moi je voudrais faire qqch de facon a ce qu'aucun threads attends (du style la fonction 1 s'execute tout le tps, je dois lire tout le tps la io card, pas seulement toutes les 1 sec (tps de la boucle peut etre) ).
Bref eclaircicez moi sur vos idees parce que la jvois pas trop  :/
 
Bref, je voudrais que la machine 2 puissent vraiment tout faire en meme tps (recevoir, envoyer, faire ses calculs)


Message édité par Giz le 04-08-2003 à 16:05:20
n°477190
Giz
Posté le 04-08-2003 à 16:28:24  profilanswer
 

:bounce:

n°477340
Giz
Posté le 04-08-2003 à 18:19:54  profilanswer
 

personne ?

n°477378
R3g
fonctionnaire certifié ITIL
Posté le 04-08-2003 à 19:06:28  profilanswer
 

giz a écrit :

Citation :

En fait j'aurai 5 threads en execution sur la machine 2. 1 pour chaque fonction (lecture de la carte I/O, calculs etablis sur la machine, envoie par UDP, recois par TCP, ecriture sur la carte I/O)


 
-fonction 1 : ecriture dans le buffer
-fonction 2: lecture du buffer - puis mis a jour du buffer
-fonction 3: lecture du buffer
-fonction 4: lecture du buffer (les donnees recues par TCP seront stockees dans ce buffer)
-fonction 5: ecriture dans le buffer (pour envoyer a l'io card)
 
Problemes :/ :
 
Les 5 fonctions requiert d'etre executees avant que la fonction 1 reinterroge la io card pour y lire les donnees.
En gros, ce seront 5 threads a la "queuleuleu" qui attendront chaque fois le jeton du precedent threads. Moi je voudrais faire qqch de facon a ce qu'aucun threads attends (du style la fonction 1 s'execute tout le tps, je dois lire tout le tps la io card, pas seulement toutes les 1 sec (tps de la boucle peut etre) ).
Bref eclaircicez moi sur vos idees parce que la jvois pas trop  :/
 
Bref, je voudrais que la machine 2 puissent vraiment tout faire en meme tps (recevoir, envoyer, faire ses calculs)


Tu dois reflechir differemment : les 5 threads vivent leur vie indépendamment des autres, il n'y a pas d'ordre défini d'éxécution des différentes fontions. Ce sont les mutex qui garantissent que les données dans le buffer ne seront pas perdues. Donx dans chaque fonction, chaque accès au buffer doit être protégé par un mutex. Ensuite c'est l'OS qui décidera tout seul de l'ordre dans lequel les threads travailleront. Il faut donc prévoir, dans la fonction qui li dans le buffer, le cas où celui-ci est vide.
Maintenant dis-toi bien que si ta machine est monoprocesseur, elle ne peux faire qu'une chose à la fois, il est impossible de faire tout en même temps.

n°477788
Giz
Posté le 05-08-2003 à 10:37:34  profilanswer
 

R3g a écrit :


Tu dois reflechir differemment : les 5 threads vivent leur vie indépendamment des autres, il n'y a pas d'ordre défini d'éxécution des différentes fontions. Ce sont les mutex qui garantissent que les données dans le buffer ne seront pas perdues. Donx dans chaque fonction, chaque accès au buffer doit être protégé par un mutex. Ensuite c'est l'OS qui décidera tout seul de l'ordre dans lequel les threads travailleront. Il faut donc prévoir, dans la fonction qui li dans le buffer, le cas où celui-ci est vide.
Maintenant dis-toi bien que si ta machine est monoprocesseur, elle ne peux faire qu'une chose à la fois, il est impossible de faire tout en même temps.


 
super. Merci, j'ai mieux compris  :jap: ... bon j'embraye sur les threads ! ;)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Communication inter-processus

 

Sujets relatifs
Communication avec port usb[C/C++] Synchroniser efficacement deux processus.
rediriger la sortie standard d'un processuscommunication sonde thermique carte mère
communication par port comCommunication port parallèle
Communication Inter Processus[Socket/Tubes] Communication inter-processus : le plus performant ?
[C++/Linux] Communication inter-processusCommunication inter processus sous linux
Plus de sujets relatifs à : Communication inter-processus


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR