Précédent   Forum des professionnels en informatique > Général Développement > Conception
Conception Forum sur le cycle de développement : conception, modélisation, méthodes, tests, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/02/2012, 11h40   #1
Invité de passage
 
Homme
Ingénieur développement logiciels
Inscription : juillet 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2011
Messages : 7
Points : 0
Points : 0
Par défaut Mémoire partagée entre deux processus

Bonjour,

J'aimerais faire un serveur multi-processus.
La contrainte que j'ai c'est que les deux processus doivent communiquer.

Je connais la mémoire mappée (déjà utilisée pour un autre projet), mais je crois qu'il est nécessaire de définir la taille maximum de la mémoire mappée (pas dynamique donc).
Or la mémoire que je dois partager entre les deux processus n'est pas fixe.

J'ai lu sur ce dit forum qu'on pouvait utiliser pipe() sur un FD, mais je ne sais pas si c'est indiqué pour des traitements volumineux (je dois avoir des temps de réponses courts).

Est-ce que vous avez des retours d'expérience à partager sur ce sujet ?
De la documentation à me donner ?
Est-ce que les pipes sont performants ? (Ca passe par la mémoire directement ou par le disque dur ?).

--

Résumé :

J'aimerais communiquer entre deux processus par des variables en RAM, avec autant de rapidité que dans un seul processus et sans avoir à définir la taille de cette mémoire partagée.

--

Merci beaucoup
Sutat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 11h29   #2
Invité de passage
 
Homme
Ingénieur développement logiciels
Inscription : juillet 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2011
Messages : 7
Points : 0
Points : 0
Bon j'ai essayé les pipe.
Ca fonctionne bien, par contre niveau design de mon serveur je me dis que finalement ça ne va pas être tip top d'utiliser des pipes, je m'explique :
1. Je voulais faire un serveur dont le métier était détaché de la couche de persistance. L'idée c'était que si mon métier plante, je peux toujours sauvegarder mes données.

2. En partant de ça, je voulais en profiter pour faire une sorte de cache niveau deux à la hibernate sur le gestionnaire de données. Comme ça à chaque appel de mon métier si j'avais déjà les données en RAM je lui donné un pointeur sur cette donnée et je n'avais pas à ouvrir tout le temps des transactions, faire des flush etc.

Le problème avec les pipes c'est que je ne vais pas pouvoir faire tout ça, je vais dupliquer les données si je passe par un pipe.
Du coup je suis en train de me dire que faire deux processus distinct pour cette gestion de données ne va pas être possible non plus (a moins que je map une quantite folle de mémoire à l'initialisation, parfois pour rien).

Bref, je pense que le design du serveur n'est pas bonne et je vais être obligé de ne faire qu'un processus entre le métier et le gestionnaire de données. Au risque que le metier crash (et en conséquence, que je perde des données).
Sutat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 13h50   #3
Modérateur
 
Avatar de gangsoleil
 
R&D en systemes informatiques bas niveau Unix/Linux
Inscription : mai 2004
Messages : 5 497
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : R&D en systemes informatiques bas niveau Unix/Linux

Informations forums :
Inscription : mai 2004
Messages : 5 497
Points : 9 672
Points : 9 672
Bonjour,

C'est un probleme de conception, pas de langage.

Maintenant que tu as explique le probleme, on peut commencer a reflechir a des solutions qui seraient bonnes, ou tout du moins meilleures que celle que tu as imagine pour le moment.
__________________
Modérateur "C", "Informatique Générale & Hardware" et "Unix"
Les règles du forum
gangsoleil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 14h31   #4
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 8 740
Détails du profil
Informations personnelles :
Âge : 54

Informations forums :
Inscription : janvier 2007
Messages : 8 740
Points : 9 974
Points : 9 974
Citation:
Envoyé par Sutat Voir le message
Bref, je pense que le design du serveur n'est pas bonne et je vais être obligé de ne faire qu'un processus entre le métier et le gestionnaire de données. Au risque que le metier crash (et en conséquence, que je perde des données).
Tu pourrais faire 2 serveurs .. Pourquoi un seul ??

Un "métier" qui appelle un "données"

le "données" peut avoir soit une "base" mappée ou non en mémoire qui concerne ce qu'il est en train de traiter, et qui est soit sauvegardée lors d'un crash soit récupérée lors de la reprise suivante...
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java

Je ne réponds pas aux MP techniques
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 21h15   #5
Invité de passage
 
Homme
Ingénieur développement logiciels
Inscription : juillet 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2011
Messages : 7
Points : 0
Points : 0
Salut souviron34,

En fait c'est un peu ce que je voulais faire au début.
Mais le problème c'est qu'avec ces deux serveurs, je vais dupliquer la mémoire de ma base de données.
Il y a aurait :
- les données de ma base de données (avec un cache j'imagine)
- les données mappée dans des instances DTO sur mon serveur de données
- les données traitées (aussi mappée) dans des instances DTO sur mon serveur métier (jeu)

Le must, ce serait que mon serveur de données puisse donner un pointeur vers un DTO déjà mappé (ou non) et que l'autre serveur (donc un autre processus) ait les autorisations pour y accéder.
Sutat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 21h38   #6
Modérateur
 
Inscription : juin 2008
Messages : 2 674
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 2 674
Points : 3 169
Points : 3 169
Par défaut Question idiote?

Salut,

Citation:
Envoyé par Sutat Voir le message
Résumé :
J'aimerais communiquer entre deux processus par des variables en RAM, avec autant de rapidité que dans un seul processus et sans avoir à définir la taille de cette mémoire partagée.
Pourquoi ne pas utiliser des threads, i.e. 2 process qui partagent le même espace virtuel?
- W
__________________
Architectures Post-Modernes
wiztricks est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 00h54   #7
Invité de passage
 
Homme
Ingénieur développement logiciels
Inscription : juillet 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2011
Messages : 7
Points : 0
Points : 0
Parce que l'idée de base c'est que si mon programme plante (pour une quelconque raison), je voudrais que l'autre continue à fonctionner pour sauvegarder mes données.

Avec deux processus c'est gérable, dans des threads je ne sais pas.

edit : Mais si je ne trouve pas comment faire avec deux processus (ou client/serveur) sans dupliquer la RAM je vais effectivement passer par des threads.
Sutat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 10h26   #8
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 8 740
Détails du profil
Informations personnelles :
Âge : 54

Informations forums :
Inscription : janvier 2007
Messages : 8 740
Points : 9 974
Points : 9 974
Citation:
Envoyé par Sutat Voir le message
Salut souviron34,

En fait c'est un peu ce que je voulais faire au début.
Mais le problème c'est qu'avec ces deux serveurs, je vais dupliquer la mémoire de ma base de données.
Il y a aurait :
- les données de ma base de données (avec un cache j'imagine)
- les données mappée dans des instances DTO sur mon serveur de données
- les données traitées (aussi mappée) dans des instances DTO sur mon serveur métier (jeu)

Le must, ce serait que mon serveur de données puisse donner un pointeur vers un DTO déjà mappé (ou non) et que l'autre serveur (donc un autre processus) ait les autorisations pour y accéder.
l'avantage d'avoir 2 serveurs c'est qu'ils ne sont pas forcément sur la même machine....

Secondo, je ne sais pas ce que c'est que DTO

quand je disais "mappé", cela pouvait être en mémoire ou en cache disque.

Enfin, j'avoue avoir un peu de mal à voir le distinguo que tu fais entre données traitées et non traitées. Tes données "traitées" vont-elles être stockées quelque part ou c'est juste "au vol" ?

Enfin, la "duplication", qu'elle soit physique (disque) ou "mémoire") (mémoire partagée) n'est absolument pas obligatoire si justement ce "mappage" est bien conçu (sauf si c'est sur des machines différentes, et même mà on peut s'arranger)
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java

Je ne réponds pas aux MP techniques
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 13h35   #9
Invité de passage
 
Homme
Ingénieur développement logiciels
Inscription : juillet 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2011
Messages : 7
Points : 0
Points : 0
DTO : http://en.wikipedia.org/wiki/Data_Transfer_Object
Une instance d'un DTO A c'est en fait une ligne (tuple) de la table A.

Oui avoir deux serveur c'est bien pour la répartition de la charge.
Mais tu es d'accord que pour un programme a faible latence (ici pour un jeu), je ne vais pas appeler mon serveur à chaque fois que j'ai besoin d'une donnée ?

Serveurs
Alors si je continue sur ton idée de serveur, et pour avoir une faible latence. Je vais avoir :
sur le serveur D (données) :
- 1 cache de données avec des DTO (la représentation objet de mes tables) [1]
- Des sockets d'envoie de ces données.

sur le serveur J (Jeu) :
- 1 cache de données avec des DTO. [2]
- Le métier.

[1] : Il me sert a accéder moins souvent à la base
[2] : Il me sert à ne pas tout le temps accéder à mon serveur de cache

On voit bien que je suis obligé de dupliquer le comportement de cache. C'est contre productif.

Théorie
Le meilleurs schéma en théorie serait pour moi :
sur le serveur D (données) :
- 1 cache de données avec des DTO (la représentation objet de mes tables)
- Interface imaginaire (c'est là que je n'ai aucune idée de ce que je peux faire)

sur le serveur J (Jeu) :
- Des pointeurs sur les données du serveur D.
- Le métier.

La je ne duplique pas la mémoire, j'accède à mes données du serveur D directement quand j'en ai besoin par les pointeurs.
Si mon serveur J plante, mon serveur D peut le détecter et sauvegarder son cache en base de données (flush).

Conclusion :
Est-ce que la section "théorie" est réalisable avec :
  • Des serveur ?
    • Duplication de données
    • Duplication du système de cache
    • Répartition de la charge
    • Système de secours des données
  • Des processus ?
    • Duplication de données (pipe)
    • Pas de répartition de la charge possible
    • Système de cache centralisé
    • Système de secours des données
  • Des threads ?
    • Pas de système de secours des données
    • Pas de répartition de la charge possible
    • Données centralisées
    • Système de cache centralisé

Je crois que la réponse est non. A moins que vous avez quelque chose sous la main que je ne connais pas.

Je vais surement aller sur les threads, et faire plus souvent des flush BDD que si j'étais sur un serveur de cache. C'est la solution qui me donnera le moins de latence je pense.
Sutat est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h23.


 
 
 
 
Partenaires

Hébergement Web