IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Threads & Processus C++ Discussion :

protection par semaphore de données partagées?


Sujet :

Threads & Processus C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Points : 33
    Points
    33
    Par défaut protection par semaphore de données partagées?
    Bonjour,

    Je voudrais partager une zone mémoire que j'ai allouer (via un malloc) en RAM entre plusieurs process.
    Cette zone n'est accessibles qu'en lecture donc je me demande s'il y a la neccesité de protéger cette zone par sémaphore.

    Qu'en dites vous?

    Je vous remercie.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    À ma connaissance, la mémoire allouée par malloc() n'est pas partageable.
    Il faut utiliser les fonctions de gestion de mémoire partagée pour allouer/ouvrir un segment partagé.

    Quant à ton problème, ben ça dépend: S'il y a UN process (ou plus) qui écrit, tu dois protéger (le mieux ici est un verrou lecteurs/écrivain, mais ça n'est pratiquement jamais disponible nativement).
    Si ta mémoire n'est accessible qu'en lecture après partage, et que RIEN n'écrit dessus, il n'est pas nécessaire de la protéger.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    OK,

    Je suis d'accord qu'il existe avec toi, la memoire alloué via un malloc n'est pas partageable avec tout mes process (il vaut mieux utiliser les dataseg).
    Je te remercie. Je ne savais plus trop si c'était necessaire.

  4. #4
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Soit dit en passant.. si tu codes en C++ oublies malloc et utilise new.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par totoscill Voir le message
    Je suis d'accord qu'il existe avec toi, la memoire alloué via un malloc n'est pas partageable avec tout mes process (il vaut mieux utiliser les dataseg).
    Non, il vaut mieux utiliser les fonctions de l'OS pour ça...

    A savoir :
    • Windows : CreateFileMapping, MapViewOfFile, UnmapViewOfFile, CloseHandle.
    • Unix : shmget, shmctrl, shmat, shmdt

    Ensuite, MSDN ou man seront tes amis.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Non, il vaut mieux utiliser les fonctions de l'OS pour ça...

    A savoir :
    • Windows : CreateFileMapping, MapViewOfFile, UnmapViewOfFile, CloseHandle.
    • Unix : shmget, shmctrl, shmat, shmdt

    Ensuite, MSDN ou man seront tes amis.
    Je suis d'accord aussi et une ZMP est bien créée avec ces fonctions. Mais le problème avec ces fonction est qu'il font appelle à chaque fois à un fichier "SBR" auquelle il faut accéder lors de chaque "mapping mémoire" et cela prend un peu de temps (dans mon cas puisque l'architecture de l'application que j'ai récupéré n'est pas très bien faîtes).
    De plus lors de l'utilisation d'une ZMP comme tu propose, il me semble qu'il faut utiliser des mutex pour protéger la mémoire partagée (peut être pas en lecture). Ce que je veux donc c'est garder en RAM une copie de la ZMP créer pour y avoir accès quand je le veux (c'est ce qui est fait actuellement mais cette zone RAM est créée à chaques accès à une fonction d'où une perte de temps inutile).

  7. #7
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par totoscill Voir le message
    Je suis d'accord aussi et une ZMP est bien créée avec ces fonctions. Mais le problème avec ces fonction est qu'il font appelle à chaque fois à un fichier "SBR" auquelle il faut accéder lors de chaque "mapping mémoire" et cela prend un peu de temps (dans mon cas puisque l'architecture de l'application que j'ai récupéré n'est pas très bien faîtes).
    Mouais... Bizarre, ton truc, j'ai jamais eu de fichiers "réels" sur une mémoire partagée, sauf via des librairies d'abstraction très mal foutues.

    Citation Envoyé par totoscill Voir le message
    De plus lors de l'utilisation d'une ZMP comme tu propose, il me semble qu'il faut utiliser des mutex pour protéger la mémoire partagée (peut être pas en lecture). Ce que je veux donc c'est garder en RAM une copie de la ZMP créer pour y avoir accès quand je le veux (c'est ce qui est fait actuellement mais cette zone RAM est créée à chaques accès à une fonction d'où une perte de temps inutile).
    ???

    Non, la mémoire partagée est crée par le premier processus lancé l'utilisant, et détruite lorsque l'on ferme le dernier handle dessus... Tant qu'un processus maintient un handle ouvert, elle reste active, en RAM, et accessible par tout le monde avec un overhead ridicule...
    Si elle est déjà mappée dans le contexte du processus (MapViewOfFile ou shmat), l'accès est exactement aussi rapide qu'avec n'importe quelle variable allouée, locale ou globale de ton processus. Au pire, tu interdis le swap de cette zone et c'est tout...

    Tu n'as besoin d'aucun mutex si tout le monde ne fait que lire dedans, et elle ne doit être verrouillée que s'il y a écriture de façon concurrente.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Mouais... Bizarre, ton truc, j'ai jamais eu de fichiers "réels" sur une mémoire partagée, sauf via des librairies d'abstraction très mal foutues.
    "CreateFileMapping: Creates or opens a named or unnamed file mapping object for a specified file. (MSDN)".

    Donc il te faut bien un fichier pour mapper ta ZMP. Pour moi c'est un fichier SBR.
    Tu est d'accord?

    ???

    Non, la mémoire partagée est crée par le premier processus lancé l'utilisant, et détruite lorsque l'on ferme le dernier handle dessus... Tant qu'un processus maintient un handle ouvert, elle reste active, en RAM, et accessible par tout le monde avec un overhead ridicule...
    Si elle est déjà mappée dans le contexte du processus (MapViewOfFile ou shmat), l'accès est exactement aussi rapide qu'avec n'importe quelle variable allouée, locale ou globale de ton processus. Au pire, tu interdis le swap de cette zone et c'est tout...

    Tu n'as besoin d'aucun mutex si tout le monde ne fait que lire dedans, et elle ne doit être verrouillée que s'il y a écriture de façon concurrente.
    J'aurais été l'homme le plus heureux du monde si la personne qui à créer l'architecture aurait pensé comme toi.
    Mais ce n'est pas le cas. C'est pour celà que je suis obligé de "bidouiller" un peu pour gagner du temps process.

  9. #9
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par totoscill Voir le message
    Donc il te faut bien un fichier pour mapper ta ZMP. Pour moi c'est un fichier SBR.
    Tu est d'accord?
    Le nom est trompeur, parce que la fonction fait d'autres choses que ça... Et non, il n'y a AUCUN fichier "réel" créé. Cela prend à peu près le même temps qu'une allocation globale.
    Le "secret" est dans le premier paramètre, INVALID_HANDLE_VALUE, qui permet justement de ne PAS s'associer avec un fichier, tout en conservant les mêmes mécanismes sous-jacents... Et donc, d'avoir de la mémoire partagée.

    Ce qui te "trompe", c'est que contrairement à Posix qui possède des fonctions "dédiées" à la mémoire partagée, Windows utilise des effets de bords de fonctions existantes pour permettre la création d'une telle mémoire. Et donc, les noms des fonctions ne sont pas très ... parlants, on va dire.

    Citation Envoyé par totoscill Voir le message
    J'aurais été l'homme le plus heureux du monde si la personne qui à créer l'architecture aurait pensé comme toi.
    Mais ce n'est pas le cas. C'est pour celà que je suis obligé de "bidouiller" un peu pour gagner du temps process.
    Sauf que le type qui a "conçu" l'archi ne peut rien faire contre les mécanismes de l'OS : la mémoire partagée n'est détruite qu'à la fermeture du dernier handle !

    Donc, si tu veux empêcher qu'elle soit systématiquement détruite / reconstruite, tu n'as qu'à lancer un micro-processus qui va simplement la maintenir active en l'ouvrant, c'est aussi simple que ça...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pardonnez mon ignorance, mais... Que signifie SBR, en fait?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Le nom est trompeur, parce que la fonction fait d'autres choses que ça... Et non, il n'y a AUCUN fichier "réel" créé. Cela prend à peu près le même temps qu'une allocation globale.
    Le "secret" est dans le premier paramètre, INVALID_HANDLE_VALUE, qui permet justement de ne PAS s'associer avec un fichier, tout en conservant les mêmes mécanismes sous-jacents... Et donc, d'avoir de la mémoire partagée.

    Ce qui te "trompe", c'est que contrairement à Posix qui possède des fonctions "dédiées" à la mémoire partagée, Windows utilise des effets de bords de fonctions existantes pour permettre la création d'une telle mémoire. Et donc, les noms des fonctions ne sont pas très ... parlants, on va dire.
    D'accord, c'est vrai que ce n'est pas très explicite. Merci

    Sauf que le type qui a "conçu" l'archi ne peut rien faire contre les mécanismes de l'OS : la mémoire partagée n'est détruite qu'à la fermeture du dernier handle !

    Donc, si tu veux empêcher qu'elle soit systématiquement détruite / reconstruite, tu n'as qu'à lancer un micro-processus qui va simplement la maintenir active en l'ouvrant, c'est aussi simple que ça...
    C'est vrai, je vais voir ce que je peux faire. Je te remercie.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pardonnez mon ignorance, mais... Que signifie SBR, en fait?
    AUcune idée. J'ai essayer de trouver la signification mais en vain.

  13. #13
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pardonnez mon ignorance, mais... Que signifie SBR, en fait?
    C'est "Shared Block Record", je crois.

    Le noyau NT interdit strictement à deux processus de se partager de la mémoire, d'où l'absence d'API "parlante" à ce sujet. On ne peut accéder à la mémoire d'un autre processus que via OpenProcess (et il faut les droits adéquats pour ça, en plus de savoir dans quoi on tape), ou via le file mapping.

    Officiellement, et pour les processus l'utilisant, cette mémoire partagée est créée sur le swap de l'OS, au travers de mécanismes d'indirection comme n'importe quelle mémoire swappable.
    En pratique, cette page n'est jamais swappée vers le fichier d'échange, elle reste en RAM. Il n'y a pas de fichier visible, car le fichier de swap est considéré comme de la mémoire pour l'OS : la mémoire partagée ne fait qu'exploiter ce mécanisme d'indirection. C'est la fonction "MapViewOfFile" qui permet de la rendre visible pour le processus, et qui assure également sa conservation en RAM (vu qu'elle est officiellement utilisée, donc elle n'est plus swappable...).

    C'est un peu plus clair ?


    Pour les curieux / courageux : Petite explication détaillée sur MSDN.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ça me parait bizarre qu'elle ne soit plus swappable: À mon avis, si les N processus qui l'utilisent sont tous "idle", je ne vois pas pourquoi les pages mappées ne seraient pas swappées comme toute autre page mémoire s'il faut de la place.

    PS: Personnellement, je considère le fichier de swap comme un fichier visible (le pagefile.sys). Mais il reste clair que ce fichier n'est pas créé par CreateFileMapping().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ça me parait bizarre qu'elle ne soit plus swappable: À mon avis, si les N processus qui l'utilisent sont tous "idle", je ne vois pas pourquoi les pages mappées ne seraient pas swappées comme toute autre page mémoire s'il faut de la place.
    Elle ne l'est pas pourtant : c'est exactement comme de la mémoire allouée par VirtualAlloc, puis verrouillée par VirtualLock. Sauf que là, c'est le MapViewOfFile qui va effectuer ce "lock"...
    Ou, pour être plus précis : en général, on mappe l'intégralité de la mémoire partagée, et non pas seulement une partie. Les parties non-mappées, elles, peuvent bien sûr être swappée sans avertissement.

    Citation Envoyé par Médinoc Voir le message
    PS: Personnellement, je considère le fichier de swap comme un fichier visible (le pagefile.sys). Mais il reste clair que ce fichier n'est pas créé par CreateFileMapping().
    En pratique, il n'y a même pas un seul "commit" vers le fichier de swap lorsque l'on crée de la mémoire partagée... Sauf, bien sûr, à volontairement fermer tous les mappings sans détruire pour autant la mémoire partagée, mais cela reste un cas plutôt rare d'utilisation. Et même là, c'est "limite" : encore faut-il que l'OS soit un peu à court de mémoire pour qu'il déclenche le swap !
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 30
    Dernier message: 17/11/2012, 16h42
  2. [Sécurité] Protection par .htaccess et .htpasswr
    Par agencep dans le forum Langage
    Réponses: 9
    Dernier message: 23/02/2006, 13h10
  3. Protection par blocage de répertoire?
    Par Madmac dans le forum Windows XP
    Réponses: 15
    Dernier message: 09/02/2006, 00h41
  4. Réponses: 1
    Dernier message: 25/01/2006, 21h44
  5. [base de données]partage d'une base de données
    Par Scrusher dans le forum JDBC
    Réponses: 4
    Dernier message: 02/06/2004, 13h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo