Question

Je l'extension de la fonctionnalité d'un sémaphores. Je suis tombé sur un barrage routier quand je me suis aperçu que je ne connais pas la mise en œuvre d'une réelle sémaphores et pour vous assurer que mon code était bien déroulé, je devais savoir.

Je connais des œuvres sémaphores en bloquant les discussions qui sont en attente sur quand ils appellent sem_wait () et un autre fil est actuellement verrouillé. Le fil est alors bloqué et mis dans une liste d'attente pour que sémaphores.

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

Merci!

Était-ce utile?

La solution

sémaphores 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)

sémaphores ont également un nombre entier associé à eux, ce qui est le nombre de threads simultanés autorisé à passer P () sans blocage. D'autres appels à P () bloqueront jusqu'à ce que V () est appelée à libérer des taches.

Telle est la définition classique d'un sémaphores.

Edit: sémaphores ne font aucune garantie de l'ordre. Ils ne doivent pas utiliser en fait une file d'attente ou d'une autre structure FIFO. Quand un seul thread est autorisé à un moment, quand il appelle V (), un autre (peut-être au hasard) fil retourne alors de son P () appeler et continuer.

Autres conseils

Le prochain thread à débloquer sur c'est ce que sera sem_wait() fil de l'OS décide est la suivante pour changer de contexte dans. Personne ne fait aucune garantie de la commande; cela dépend de la stratégie de planification de votre système d'exploitation. Il pourrait être le fil qui a été au large de la CPU pour la plus longue, ou celui qui a été attribué la plus haute « priorité », ou celui qui a toujours eu certaines statistiques d'utilisation des ressources, ou autre chose.

Très probablement, votre thread courant (celui qui a appelé sem_post()) continuera à fonctionner pendant un certain temps, jusqu'à ce qu'il soit commence en attente pour l'entrée de l'utilisateur, des blocs sur un autre sémaphores, ou à court de sa tranche de temps alloué os. Ensuite, le système d'exploitation passe dans un processus totalement sans rapport avec la gestion d'une fraction de seconde (probablement Firefox ou quelque chose), puis partir et gérer une partie du trafic réseau, obtenir lui-même une tasse de thé, et, enfin, quand il se déplace à elle, choisissez selon vos autres fils, il se sent comme, basé sur quelque chose comme si elle se sent basée sur l'histoire passée que le fil particulier est plus CPU ou d'E / S lié.

Dans de nombreux systèmes d'exploitation, la priorité est donnée à I / O-processus liés qui n'ont pas été autour depuis très longtemps. La théorie est que les nouveaux processus pourraient être de courte durée (si elle a été autour pendant cinq heures déjà, les chances sont qu'il ne sera pas de finir dans les prochains 1ms) afin que nous puissions aussi bien les obtenir au plus vite. E / S lié Les processus sont susceptibles de continuer à être lié par E / S, ce qui signifie que les chances sont qu'ils vont éteindre le CPU peu en attendant d'autres ressources. Fondamentalement, le système d'exploitation veut trouver le processus qu'il va pouvoir faire avec le plus tôt possible, afin qu'il puisse revenir à son sirotant du thé et l'exécution de votre programme malveillant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top