Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème mémoire partagée.

1 réponse
Avatar
mpe-d3l
Je suis actuellement confronté à un problème de mémoire partagée entre
plusieurs processus s'exécutant dans un environnement windows NT.
L'application a recours au dispositif microsoft de mappage de
fichiers,
fonctions CreateFileMapping, MapViewOfFile, et UnmapViewOfFile.
Par contre, il n'y a aucun mécanisme de synchronisation entre les
différents processus pour accéder à cette mémoire partagée.
Cette synchronisation est-elle déjà intégrée dans les fonctions
ci-dessus OU doit-on la prévoir en recourant par exemple aux
sémaphores ?
Merci d'avance pour vos réponses.
A bientôt.
Louis.

1 réponse

Avatar
Patrick 'Zener' Brunet
Bonjour.

"mpe-d3l" a écrit dans le message de news:

Je suis actuellement confronté à un problème de mémoire partagée entre
plusieurs processus s'exécutant dans un environnement windows NT.
L'application a recours au dispositif microsoft de mappage de
fichiers,
fonctions CreateFileMapping, MapViewOfFile, et UnmapViewOfFile.
Par contre, il n'y a aucun mécanisme de synchronisation entre les
différents processus pour accéder à cette mémoire partagée.
Cette synchronisation est-elle déjà intégrée dans les fonctions
ci-dessus OU doit-on la prévoir en recourant par exemple aux
sémaphores ?
Merci d'avance pour vos réponses.



Pour autant que je me souvienne, par défaut la gestion du partage est faite
au niveau du fichier entier.
CreateFileMapping() prend un argument hFile rendu par un CreateFile()
préalable, et c'est là que vous pouvez spécifier un flag FILE_SHARE_XXX.

Evidemment pour de la mémoire partagée, ça n'est pas applicable et à mon
avis ça se comprend parce qu'il faut de toute manière implémenter un
protocole d'échange, le polling d'un pseudo-booléen dans la zone de mémoire
étant une technique très imprévisible et donc très mauvaise.

A priori donc vous avez fonctionnellement besoin au minimum d'un Mutex à
l'entrée du segment de code d'échange, et d'un Signal à la sortie pour
forcer le process client à attendre que le serveur ait bien pris livraison
du paquet avant de rendre le Mutex. Et éventuellement, selon vos protocoles,
d'une signalétique plus complexe. Donc la synchro inter-process doit reposer
là-dessus. Vous pouvez d'ailleurs créer plusieurs zones d'échange distinctes
dans le même fichier.

La gestion du partage du fichier d'échange est encore autre chose, il
devrait être initié par le process maître (serveur), les autres venant s'y
connecter ensuite. Qui lance les processes, comment se négocie la
terminaison de l'ensemble, tout ça dépend de vos choix de conception.

Et si vous pouvez avoir plusieurs instances de votre process serveur et de
son jeu de clients, c'est encore plus compliqué, d'autant que COM ne vous
permet pas vraiment de choisir une instance de serveur ;-)

Au fait, n'oubliez pas de faire des flush quand vous modifiez la mémoire
partagée, ça ne se fait pas tout seul et vous pourriez avoir des surprises
que vous attribueriez à tort à la synchro =<:-[=8
Mais quand ça marche bien on se sent si heureux :-}}}}}}}}

Cordialement,

--

/**************************************************************
* Patrick BRUNET @ ZenerTopia
* E-mail: lien sur http://zener131.free.fr/ContactMe
**************************************************************/
<8#--X--< filtré par Avast! 4 Home