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 :

Compréhension sémaphores et mutex


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 238
    Par défaut Compréhension sémaphores et mutex
    Bonjour

    Si mon sujet n'est pas dans la bonne rubrique je comprendrais aisément qu'on le déplace
    pour autant il parle de sémaphore et de mutex codé en C sur eclipse dans le cadre d'un cours

    je précise que je débute dans la compréhension du système de gestion de processus sous unix et linux et en général

    or il y a des choses après avoir implémenté en c les algos des sémaphores et mutex que je pense ou pensais avoir compris
    voici le problème :

    j'ai 3 programmes ou projet sous eclipse (je met les codes des fichiers .c en pièces jointes)
    sy.c =>synchro.c // ou phase d'initialisation des sémaphores et execution des Fils lecteurs et redacteur
    l.c =>lecteur.c
    red.c =>redacteur.c

    Pour essayer de comprendre j'ai affiché l’adresse d’attachement retour de shmat contenu dans *mem mais ça ne m'aide pas beaucoup plus pour comprendre les résultats
    (parfois avec difficulté printf ayant des comportements bizarres (que je ne comprend pas!) avec l'execution des programmes surtout si il y'a \t ou \n à l'intérieur du message donc je met le \n au dernier printf)

    J'ai étudié les différentes primitives utilisées dans les programmes sur www.man-linux-magique.net/ avec difficultés mais ça m'aide pas vraiment en plus de m'embrouiller à ce stade même si c'est intéressant.
    De plus je pense c'est plus un déroulement du code ou des notions que je ne comprend pas.

    Quand j'execute plusieurs fois synchro.o j'ai parfois ce genre de résultat que je ne comprend pas :

    pour moi après qu'un rédacteur est écrit dans la zone mémoire partagée le lecteur d'après devrait lire la dernière valeur écrite par un rédacteur.
    ex:
    redacteur:valeur mem 2 valeur memoire 2
    lecteur:valeur mem 2 valeur memoire 2


    lecteur:valeur mem 1 valeur memoire 0
    redacteur:valeur mem 2 valeur memoire 1
    redacteur:valeur mem 2 valeur memoire 2
    lecteur:valeur mem 2 valeur memoire 0
    lecteur:valeur mem 3 valeur memoire 0
    redacteur:valeur mem 2 valeur memoire 3

    lecteur:valeur mem 1 valeur memoire 0
    lecteur:valeur mem 2 valeur memoire 0
    redacteur:valeur mem 2 valeur memoire 1
    lecteur:valeur mem 3 valeur memoire 0
    redacteur:valeur mem 2 valeur memoire 2
    redacteur:valeur mem 2 valeur memoire 3

    lecteur:valeur mem 1 valeur memoire 0
    lecteur:valeur mem 2 valeur memoire 0
    redacteur:valeur mem 1 valeur memoire 2
    lecteur:valeur mem 3 valeur memoire 0
    redacteur:valeur mem 1 valeur memoire 2
    redacteur:valeur mem 0 valeur memoire 3

    J'ai vraiment besoin de comprendre ce qui se passe car je pensais avoir compris un peu les algos semaphores et mutex.
    Et là je suis assez perdu au vu des résultats.
    Comme les cours continus sur les threads, toutes les primitives et que ça risque de devenir de plus en plus bloquant(non je ne suis pas un processus ) pour comprendre si je ne pige pas ces résultats.

    En vous remerciant par avance de vos réponses et votre aide

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Quand tu ne maitrises plus du tout ce que produit un programme, alors il te faut "détricoter" le fonctionnement et revenir étape par étape au code actuel.
    Commence par retirer les fork dans le programme principal ainsi que la suppression de la SHM. Le programme principal va donc créer la SHM et les sémaphores. Tu pourrais même ajouter un argument au programme : "on" pour créer la SHM et les sémaphores et "off" pour supprimer la SHM et les sémaphores. Ce sera plus facile à manier pour tester.
    Ensuite, tu lances uniquement le rédacteur et tu vérifies qu'il se bloque correctement en attendant qu'un lecteur se lance.
    Puis tu arrêtes le rédacteur et tu lances le lecteur et tu vérifies qu'il lit une seul valeur et se bloque en attendant une nouvelle valeur du rédacteur.
    Tu vides tout, supprime SHM et sémaphore puis tu recommences en créant tout, puis tu lances le lecteur qui doit rester bloqué. Puis tu lances le rédacteur qui doit débloquer le lecteur.
    Lorsque tout fonctionne correctement, tu peux replacer les choses au fur et à mesure en faisant des tests à chaque fois.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 238
    Par défaut
    J'avoue ne pas tout comprendre je suis vraiment néophyte je découvre encore les primitives

    qu'entend tu par SHM ?
    toutes les primitives qui appartiennent à la bibliotheque shm.h
    je les retires : shmget, shmat,shmctl,shmdt, voir la structure shmid_ds ???

    je comprend le principe de retirer les fork pour pouvoir exécuter rédacteur et leceur mais j'ai pas compris tout ton principe du test désolé

    peux tu m'expliquer un peu plus merci

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Le bloc de mémoire partagée (shared memory).

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    La SHM, c'est la mémoire partagée. Puisque tu utilises deux "gros" trucs dans ton code : le fork et la mémoire partagée. Je te propose de laisser tomber le fork pour le moment et te concentrer sur la mémoire partagée. Donc tu conserves dans ton code toutes les fonctions relatives à la SHM.
    L'échange d'information entre le rédacteur le lecteur se fait via une mémoire partagée. C'est une zone en mémoire qui peut être lue et écrite autant par le rédacteur que le lecteur. Mais il n'y a aucun mécanisme de verrouillage contre la corruption des données. Par exemple, le rédacteur peut être en pleine écriture, octet par octet, et le lecteur arrive et lit la zone mémoire contenant de nouveaux octets et d'anciens octets. C'est ce qu'on appelle une lecture corrompue.
    Pour empêcher ça, on utilise des sémaphores. Le système d'exploitation gère les sémaphores et est le chef d'orchestre des programmes qui incrémentent ou décrémentent les sémaphores.
    Pour empêcher toute corruption, il y a une entente tacite entre le rédacteur et le lecteur. Cette entente, c'est toi qui la code, bien sûr, il n'y a rien de magique
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 238
    Par défaut
    oui j'avais compris l’intérêt des sémaphores et son codage

    j'avais mal lu : retirer les primitives de suppression (ou la fin ) relative à la mémoire partagée
    évidemment sinon lecteur et redacteur ne pourront pas communiquer entre eux sur les données
    par contre je vais retirer aussi les primitives excelc de synchro pour éviter un conflit quelconque avant de tester

    je vais voir comme faire avant de revenir
    mais j'ai eu un cours sur toutes les primitives (tête farcie) en plus de ne pas avoir ou peu de pratique de linux et de commandes linux c'est donc pour moi un cours dense

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 23/05/2007, 10h14
  2. Réponses: 12
    Dernier message: 18/05/2007, 11h34
  3. onclipevent (problème de compréhension)
    Par stephane eyskens dans le forum Flash
    Réponses: 8
    Dernier message: 24/09/2003, 15h09
  4. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07

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