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

Linux Discussion :

surpasser les limites de valeurs de sémaphores en C


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 45
    Par défaut surpasser les limites de valeurs de sémaphores en C
    Bonjour,

    Mon problème est le suivant : J'ai implémenté une file de messages via mémoire partagée. Il n'y a qu'un seul lecteur et qu'un seul écrivain.
    La taille de la file est définie par une constante MAX_SIZE. Je veux que l'écrivain bloque si la file est pleine, et que le lecteur bloque si la file est vide.

    Pour cela j'ai défini un sémaphore available_size initialisé à MAX_SIZE, et un sémaphore used_size initialisé à 0.

    Lorsque l'écrivain veut écrire n objets, il fait un p(-n) sur le sémaphore available_size, de manière à bloquer si la file est pleine. Une fois l'écriture effectuée, il fait un v(n) sur used_size.

    Lorsque le lecteur veut lire n objets, c'est tout simplement l'inverse.

    Le problème, c'est que les sémaphores ont une valeur maximum relativement faible (16384 sur mon OS), et mon logiciel doit tourner avec une taille de file beaucoup plus grande que ça.

    Je cherche donc un algorithme ou une méthode qui puisse faire l'équivalent de ce comportement.

    J'avais pensé à faire la chose suivante :

    Dans le cas de l'écrivain :
    un sémaphore lock
    une variable used_size initialisée à 0
    une variable available_size initialisée à MAX_SIZE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    entrée : n
    ok = false
    while not ok
       p(lock)
       if available_size > n
          available_size -= n
          ok = true
       endif
       v(lock)
    endwhile
    Mais avec cette méthode, on boucle inutilement et on passe son temps à bloquer et débloquer un sémaphore, ce qui, je suppose, n'est pas gratuit.

    Auriez-vous une solution ?

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 859
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sunmat Voir le message
    Bonjour,

    Mon problème est le suivant : J'ai implémenté une file de messages via mémoire partagée. Il n'y a qu'un seul lecteur et qu'un seul écrivain.
    La taille de la file est définie par une constante MAX_SIZE. Je veux que l'écrivain bloque si la file est pleine, et que le lecteur bloque si la file est vide.
    ...
    Auriez-vous une solution ?
    Pas besoin de sémaphores. Tu crées une shm et tu y mets la taille de ta file.
    L'écrivain décrémente la valeur et le lecteur la réincrémente.

    Ou alors tu crées une fonction qui compte le nombre de messages (je suppose que tu utilises une msq). Quand ton écrivain doit écrire, il fait d'abord appel à cette fonction et si le nb est égal au nb max, ben il n'écrit pas. Quand au lecteur il n'a rien à faire puisqu'un message lu est enlevé de la msq (sauf si le nb est déjà à 0 auquel cas ben il ne lit pas...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 45
    Par défaut
    Le problème est surtout le fait de pouvoir bloquer l'un ou l'autre respectivement en cas de file vide ou de file pleine, et ce sans faire un "faux blocage" consistant à boucler sur un test.

    En fait j'ai pu résoudre mon problème en rajoutant un sémaphore dont la valeur indique s'il y a eu une récente modification. Avec ce procédé la boucle bloque s'il n'y a pas eu de modification et refait le test uniquement s'il y a eu modification de la taille.

    (J'en ai marre de poster un message et de trouver la solution 10min plus tard alors que ça fait 3h que je cherche... )

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/04/2010, 13h54
  2. Réponses: 4
    Dernier message: 15/03/2010, 16h28
  3. Réponses: 5
    Dernier message: 23/10/2009, 16h09
  4. [Débutant] Modifier les axes : noms, valeurs limites et couleur
    Par niepoc dans le forum MATLAB
    Réponses: 11
    Dernier message: 14/05/2008, 13h35
  5. select avec un nombre limité de valeurs retournées
    Par felix79 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/12/2004, 15h16

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