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

C Discussion :

Synchronisation accès mémoire en mémoire partagée


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur à ses heures perdues
    Inscrit en
    Août 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur à ses heures perdues

    Informations forums :
    Inscription : Août 2011
    Messages : 36
    Points : 27
    Points
    27
    Par défaut Synchronisation accès mémoire en mémoire partagée
    Bonjour à tous,

    J'ai crée une mémoire partagée entre deux applications. La variable partagée est une structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct
    {
        unsigned char img[NB_ELEMENTS]; //NB_ELEMENTS est une macro
        int statusAPP1ToAPP2, statusAPP2ToAPP1;
     
    } dataShm;
    Au lieu d'utiliser les sémaphores, j'ai pensé à une autre méthode qui consiste à utiliser deux variables (statusAPP1ToAPP2, statusAPP2ToAPP1) qui notifie l'autre application que les données peuvent être lu/écrites.

    Dans la suite je vais désigner mes deux applications par APP1 et APP2.
    Ainsi, à un endroit du code de APP2 j'ai les lignes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    .... // Initialisation et allocation de la mémoire partagée
    // On attend que des données arrivent
    while(1){
     
            while(data->statusAPP1ToAPP2 != READY); // Tant que APP1 n'a pas mis à jour cette variable on reste coincé dans la boucle
     
    // La variable data->statusAPP1ToAPP2 a été mise à jour:  les données sont prêtes à être traitées...
    .....
    }
    Dès que mon application 1 (APP1) a mis la variable à READY APP2 doit pouvoir traiter les données. Or, APP2 ne sort jamais de la deuxième boucle... En revanche en mettant une instruction usleep(1) juste avant la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(data->statusAPP1ToAPP2 != READY);
    , le programme arrive à voir que la variable a été modifié à READY et commence à traiter les données. Ce choix de synchronisation est très critiquable cependant j'aimerais bien comprendre ce qui se passe.

    Quelqu'un a-t-il une idée de la raison pour laquelle la variable n'est pas mise à jour sans l'instruction usleep... ? J'ai l'impression que la condition data->statusAPP1ToAPP2 != READY n'est pas évalué ... Des suggestions ?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    À moins d'être prévenu, le compilo suppose qu'une variable ne change pas tant que ton programme ne la change pas lui-même. Et il fait ses optimisations en conséquence.

  3. #3
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 528
    Points
    3 528
    Par défaut
    Comment sont créées tes 2 applications ?
    fork ? pthread ?... (je suppose pthread)

    C'est une mauvaise idée de ne pas utiliser de sémaphore ou de lock, car ton while fera de l'attente active (et consommera 100% de ton CPU).
    Les sémaphores et locks agissent comme des interruptions : dès que la condition est fausse, le processus est délaissé, tant que la condition n'est pas devenue vraie (ce qui est plus efficace déjà ).

    Es-tu sûr en effet que APP2 arrive à atteindre ton instruction ?
    Pas de dead lock possibles à tout hasard ?

    EDIT : Je pense que Médinoc a ta réponse sur le "pourquoi" !

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur à ses heures perdues
    Inscrit en
    Août 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur à ses heures perdues

    Informations forums :
    Inscription : Août 2011
    Messages : 36
    Points : 27
    Points
    27
    Par défaut
    L'idée était de créer une interface simple pour faire communiquer les deux applications (en utilisant la librairie shm) sans utiliser les sémaphores, mutex etc... J'avais pensé à l'explication de Médinoc mais je n'étais pas sûr si le compilateur pouvait faire de telles optimisations.

    Je vous remercie de votre aide.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Si tu veux faire ce genre de choses, il te faudra au moins un test-and-set atomique pour tout ce qui concerne l'exclusion mutuelle (sous gcc sur x86, ce doit être possible avec un peu d'assembleur inline, si tu n'as pas déjà les fonctions qu'il faut).

    PS: Une attente active n'est pas "légère". Ce n'est pas pour rien qu'on utilise les attentes passives fournies par l'OS...

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur à ses heures perdues
    Inscrit en
    Août 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur à ses heures perdues

    Informations forums :
    Inscription : Août 2011
    Messages : 36
    Points : 27
    Points
    27
    Par défaut
    Si jamais ça peut en intéresser d'autres, il suffit de mettre le mot clé devant le type d'une variable afin que le compilateur n'apporte aucune optimisations sur celle-ci --> elle sera donc évaluée à chaque fois qu'on l'invoque et mon problème aurait été résolu. Cependant, l'idée d'utiliser des mécanismes reposant sur les sémaphores/mutex est meilleure en terme de conso CPU.

  7. #7
    Membre actif Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Points : 222
    Points
    222
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    À moins d'être prévenu, le compilo suppose qu'une variable ne change pas tant que ton programme ne la change pas lui-même. Et il fait ses optimisations en conséquence.
    On peut éviter les optimisations d'une variable en utilisant volatile si je ne m'abuse.



    EDIT: Désolé j'ai manqué ton dernier message degodskitchen

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

Discussions similaires

  1. Accès concurrent à la mémoire
    Par -Chuck- dans le forum CUDA
    Réponses: 0
    Dernier message: 07/06/2013, 17h57
  2. Accès écriture/lecture mémoire partagée
    Par ggwtf dans le forum Linux
    Réponses: 6
    Dernier message: 08/05/2009, 21h21
  3. problème d'accés sur des fichiers partagés
    Par prefna dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 06/08/2006, 17h05
  4. Acces refusé sur un partage depuis php
    Par needles94000 dans le forum Windows
    Réponses: 2
    Dernier message: 06/04/2006, 14h59
  5. Réponses: 4
    Dernier message: 09/11/2005, 14h32

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