2009-03-24 6 views
1

J'étend la fonctionnalité d'un sémaphore. J'ai rencontré un barrage routier quand j'ai réalisé que je ne connaissais pas l'implémentation d'un véritable sémaphore et que pour m'assurer que mon code fonctionnait correctement, j'avais besoin de le savoir.Files d'attente de semaphores

Je sais qu'un sémaphore fonctionne en bloquant les threads qui l'attendent lorsqu'ils appellent sem_wait() et qu'un autre thread l'a verrouillé. Le thread est ensuite bloqué puis placé dans une liste d'attente pour ce sémaphore.

Ma question concerne ce qui se passe sur un sem_post(). Le fil suivant est-il retiré de la liste d'attente, défini comme fil de verrouillage et autorisé à être débloqué? Ou le système d'affichage est-il complètement différent?

Merci!

Répondre

7

Semaphores ont deux opérations:

  1. P() Pour acquérir les sémaphores (vous semblez appeler cette sem_wait)
  2. V() Pour libérer le sémaphores (vous semblez appeler cette sem_post)

Les sémaphores ont aussi un entier qui leur est associé, qui est le nombre de threads concurrents autorisés à passer P() sans blocage. Les autres appels à P() bloquent jusqu'à ce que V() soit appelé pour libérer des points.

C'est la définition classique d'un sémaphore.

Editer: Les sémaphores ne font aucune garantie de commande. Ils n'ont pas besoin d'utiliser réellement une file d'attente ou une autre structure FIFO. Quand un seul thread est autorisé à la fois, quand il appelle V(), un autre thread (éventuellement aléatoire) retourne alors de son appel P() et continue.

+0

Droit, mais est-il possible de savoir exactement comment la file d'attente fonctionne pour un sémaphore quand seulement 1 thread est autorisé à passer à la fois? – user82229

+0

Les sémaphores ne font aucune garantie de commande. Ils n'ont pas besoin d'utiliser réellement une file d'attente ou une autre structure FIFO. Quand un seul thread est autorisé à la fois, quand il appelle V(), un autre thread (éventuellement aléatoire) retourne alors de son appel P() et continue. –

+0

@Ben S: Pourquoi ne faites-vous pas la promotion de ce commentaire pour une partie de votre réponse? Je pense que c'est ce que voulait dire l'heluimwhippet en premier lieu, et c'est bien dit. – dmckee

8

Le prochain thread à débloquer sur son sem_wait() sera le thread que le système d'exploitation décide est le prochain à basculer dans le contexte. Personne ne fait aucune garantie de commande; Cela dépend de la stratégie de planification de votre système d'exploitation. Il peut s'agir du thread qui a été désactivé le plus longtemps par le CPU, ou de celui qui a reçu la plus haute "priorité", ou de celui qui a historiquement eu certaines statistiques sur l'utilisation des ressources, ou autre. Il est probable que votre thread actuel (celui qui a appelé sem_post()) continue de fonctionner pendant un certain temps, jusqu'à ce qu'il commence à attendre l'entrée de l'utilisateur, se bloque sur un autre sémaphore ou court en dehors de sa tranche horaire. Ensuite, le système d'exploitation va basculer dans un processus totalement indépendant pour fonctionner pendant une fraction de seconde (probablement Firefox ou quelque chose), puis aller gérer un peu de trafic réseau, se procurer une tasse de thé, et, enfin, quand il se déplace Pour cela, choisissez celui de vos autres threads, basé sur quelque chose comme si vous vous sentez basé sur l'histoire passée que le thread particulier est plus CPU ou I/O-bound.

Dans de nombreux systèmes d'exploitation, la priorité est donnée aux processus liés aux E/S qui ne sont pas présents depuis très longtemps. La théorie est que les nouveaux processus pourraient être de courte durée (si ça fait déjà cinq heures, il y a de fortes chances que ça ne finisse pas dans les prochaines 1ms), alors on pourrait aussi en finir avec eux. Les processus liés aux E/S sont susceptibles de continuer à être liés aux E/S, ce qui signifie qu'ils risquent d'éteindre la CPU sous peu en attendant d'autres ressources. Fondamentalement, le système d'exploitation veut trouver le processus qui va pouvoir être fait avec ASAP, donc il peut revenir à siroter son thé et exécuter votre malware.

Questions connexes