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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    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 Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Soit dit en passant.. si tu codes en C++ oublies malloc et utilise new.

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    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
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    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 : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    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

+ 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