Ecrire un conteneur STL dans une mémoire partagée

Ecrire un conteneur STL dans une mémoire partagée - C++ - Programmation

Marsh Posté le 25-01-2005 à 15:57:58    

Bonjour,
 
Je souhaite implémenter le conteneur map dans une mémoire partagée, de manière à ce que le contenu du conteneur puisse etre exploité par plusieurs processus en lecture / écriture.
 
Mon pb: comment dois-je copier le conteneur dans la mémoire partagée ? J'ai un pb de lecture et d'écriture pour cet objet.
 
Note: je peux copier sans pb un tableau d'entiers, de structures, sans doute parce que les données sont stockées de manière contigue et sans référence à des adresses de mémoire. Mais pour un conteneur de la STL, problème !  :(  
 
Je suis sous Linux Red Hat 7.2. J'utilise le c++ standard.  :jap:  
 
kason  :hello:

Reply

Marsh Posté le 25-01-2005 à 15:57:58   

Reply

Marsh Posté le 25-01-2005 à 16:02:22    

Il te faut créer ton propre allocateur et le filer en dernier paramètre template à ton map.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 25-01-2005 à 16:07:26    

Que devra contenir ce nouveau allocateur par rapport à l'allocateur par défaut ? En fait, je ne vois pas ce que je dois modifier dans la classe Allocator de base...

Reply

Marsh Posté le 25-01-2005 à 16:11:04    

HelloWorld a écrit :

Il te faut créer ton propre allocateur et le filer en dernier paramètre template à ton map.


nan, enfin pas obligatoirement/seulement.
 
il faut utiliser l'opérateur new "in place", dont la syntaxe est la suivante:

MonType* = new (addr_shm) MonType();


avec ça new ne fait pas l'allocation mémoire, et se contente d'apeller le constructeur sur l'addresse mémoire qu'on lui donne.


Message édité par schnapsmann le 25-01-2005 à 16:14:24

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 25-01-2005 à 16:33:31    

Je voudrais en savoir plus sur la classe Allocator de la librairie STL.  
 
Permet-elle d'organiser la position et la structure des éléments du conteneur dans la mémoire (itérateurs, données, etc) ?

Reply

Marsh Posté le 25-01-2005 à 16:34:53    

kason a écrit :

Je voudrais en savoir plus sur la classe Allocator de la librairie STL.  
 
Permet-elle d'organiser la position et la structure des éléments du conteneur dans la mémoire (itérateurs, données, etc) ?


as tu seulement pipé un mot de mon post déjà? [:petrus75]


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 25-01-2005 à 16:40:59    

schnapsmann a écrit :

as tu seulement pipé un mot de mon post déjà? [:petrus75]


Ceci dit schnapsmann, la difficulté, c'est pas tant d'allouer l'objet map, que de lui dire comment ensuite allouer les noeuds de son arbre red-black. Donc un allocateur pour shared-memory s'impose...
 
Mais je crois bien qu'il y a un outil qui s'appelle google qui pourrait nous en apprendre un peu plus sur les allocateurs de la STL...


Message édité par Lam's le 25-01-2005 à 16:41:32
Reply

Marsh Posté le 25-01-2005 à 16:45:59    

Lam's a écrit :

Ceci dit schnapsmann, la difficulté, c'est pas tant d'allouer l'objet map, que de lui dire comment ensuite allouer les noeuds de son arbre red-black. Donc un allocateur pour shared-memory s'impose...


oui bien sur, ceci dit le commencement c'est bien le new in place, et effectivement un allocateur redéfini est obligatoire


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 25-01-2005 à 16:46:36    

schnapsmann> vu qu'en interne std::map va faire des allocs, ça me parrait obligatoire.  
 
Y'a pas de classe Allocator utilisable comme tu sembles le penser, c'est juste une interface de manipulation pour la STL. Tu dois en implémenter une autre que celle fournie par défaut (std::allocator), donc tu le fais comme tu veux. Tu peux faire des allocations dans un fichier, sur un ordi distant via tcp/ip si ça te dit.
http://www.roguewave.com/support/d [...] /12-6.html


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 25-01-2005 à 16:49:57    

mmmmm.... et au niveau adressage ne risque-t-il pas y avoir de problème lorsque l'arbre sera parcouru ? (question pour moi)
 
mais si tu prends deux process différents (pas issu d'un fork), ça risque de pêter les plombs au niveau adressage (ou il alors il faudrait un adressage relatif au début de la mémoire partagée) ?

Reply

Marsh Posté le 25-01-2005 à 16:49:57   

Reply

Marsh Posté le 25-01-2005 à 16:53:16    

bjone a écrit :

mmmmm.... et au niveau adressage ne risque-t-il pas y avoir de problème lorsque l'arbre sera parcouru ? (question pour moi)
 
mais si tu prends deux process différents (pas issu d'un fork), ça risque de pêter les plombs au niveau adressage (ou il alors il faudrait un adressage relatif au début de la mémoire partagée) ?


 
la cohérence des addresses dans la shm est assurée par le système, et les pointeurs restent valables d'un process à l'autre (sauf si tu t'amuses à stoquer un pointeur vers l'espace privé d'un process dans la shm)


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 25-01-2005 à 16:53:45    

Oui y'a d'autres contraintes liées au multitache et aux accès concurrents...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 25-01-2005 à 17:19:42    

ça existe à cette adresse :
http://allocator.sourceforge.net/

Reply

Marsh Posté le 25-01-2005 à 17:59:25    

schnapsmann a écrit :

la cohérence des addresses dans la shm est assurée par le système, et les pointeurs restent valables d'un process à l'autre


 
Non. Rien ne vous garantit que n'importe quel os va toujours mapper le segment à la même adresse virtuelle dans chaque processus. En d'autres termes, la seule manière d'être à la fois safe et portable, c'est d'utiliser, d'une manière ou d'une autre, des adresses relatives à l'adresse du début du segment.
 


NOTES
       Using shmat with shmaddr equal to NULL is the preferred,  portable  way
       of  attaching a shared memory segment.  Be aware that the shared memory
       segment attached in this way may be attached at different addresses  in
       different  processes.   Therefore,  any  pointers maintained within the
       shared memory must be made relative (typically to the starting  address
       of the segment), rather than absolute.

Reply

Marsh Posté le 25-01-2005 à 18:24:33    

DocMaboul a écrit :

Non. Rien ne vous garantit que n'importe quel os va toujours mapper le segment à la même adresse virtuelle dans chaque processus. En d'autres termes, la seule manière d'être à la fois safe et portable, c'est d'utiliser, d'une manière ou d'une autre, des adresses relatives à l'adresse du début du segment.
 


NOTES
       Using shmat with shmaddr equal to NULL is the preferred,  portable  way
       of  attaching a shared memory segment.  Be aware that the shared memory
       segment attached in this way may be attached at different addresses  in
       different  processes.   Therefore,  any  pointers maintained within the
       shared memory must be made relative (typically to the starting  address
       of the segment), rather than absolute.



 
oui, au temps pour moi, c'est vrai uniquement avec des process clonés par fork qui s'attacheraient à la shm avant de forker comme le disait bjone; mais de toutes façons il vaut mieux utiliser des pointeurs relatifs.


Message édité par schnapsmann le 25-01-2005 à 18:24:55

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 25-01-2005 à 19:14:09    

schnapsmann a écrit :

oui, au temps pour moi, c'est vrai uniquement avec des process clonés par fork qui s'attacheraient à la shm avant de forker comme le disait bjone; mais de toutes façons il vaut mieux utiliser des pointeurs relatifs.


 
Oui. D'ailleurs, dans la même veine, il faut faire plutôt attention à la shared en C++ pour les classes ayant une vtable car rien ne garantit non plus que l'adresse sera la même dans tous les processus.

Reply

Marsh Posté le 25-01-2005 à 23:34:24    

Y'avait eu un topic là dessus.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed