La meilleure pratique est de ne pas interroger… mais l'interrogation ne se produit-elle pas de toute façon lorsqu'un thread appelle wait ()?

13

Disons que nous avons un thread qui veut vérifier quand un autre thread a terminé sa tâche. J'ai lu que nous devrions appeler une fonction de type wait () qui fera attendre ce thread jusqu'à ce qu'il reçoive une notification indiquant que l'autre thread est terminé. Et que c'est bien parce que cela signifie que nous n'effectuons pas de sondages coûteux.

Mais le sondage ne se produit-il pas en interne à un niveau inférieur de toute façon? C'est-à-dire que si nous faisons attendre le thread (), le noyau n'exécute-t-il pas de toute façon une interrogation pour vérifier quand l'autre thread est terminé afin qu'il puisse alors notifier le premier thread?

Je suppose que je manque quelque chose ici, quelqu'un peut-il m'éclairer?

csss
la source

Réponses:

28

Le système d'exploitation fournit certaines primitives pour ce type de communication interprocessus qui ne nécessitent pas d'interrogation.

Si le processus A attend sur mutex M, le système d'exploitation sait que A ne peut pas être exécuté et le met de côté dans un ensemble de processus attendant que quelque chose se produise. Lorsque le processus contenant M le libère, le système d'exploitation examine la liste des processus qui l'attendent. Le premier processus de la liste, peut-être A, est supprimé du compartiment inactif et placé dans la file d'attente d'exécution . La prochaine fois que A obtient une tranche de temps, l'attente () qu'il a appelée revient et le programme continue.

Blrfl
la source
donc en quelque sorte, c'est un sondage mais au niveau du système d'exploitation?
tgkprog
7
Non @tgkprog, ce n'est pas une interrogation, car le processus en attente n'est pas planifié pour s'exécuter jusqu'à ce que le système d'exploitation ou un autre processus libère le mutex. Un processus d'interrogation continuerait de rivaliser dans la planification des processeurs afin de vérifier s'il devait cesser d'attendre. Un processus d'interrogation de ce type peut graver une partie substantielle du temps processeur pendant qu'il attend.
joshp
je voulais dire le processus OS interroger le statut mutex. mais je suis sûr que son optimisé et mieux que tout ce que nous pourrions faire. s'exécute probablement dans le cadre du planificateur.
tgkprog
4
@tgkprog: Le système d'exploitation ne prête pas un peu d'attention à ce qui se passe avec un mutex jusqu'à ce que le processus qui le maintient le libère ou se termine. L'un ou l'autre de ces événements amènera le système d'exploitation à remettre le verrou mutex à tout processus se trouvant en premier sur la liste d'attente et à marquer ce processus comme exécutable. Il n'y a pas de sondage impliqué, juste une réponse à un événement. Tout ce que joshp a dit est inclus par référence. :-)
Blrfl
2
@csss: À peu près. Les processus peuvent se terminer volontairement (par exemple, appeler _exit(2)sur des systèmes POSIX-y) ou involontairement (par exemple, une erreur comme une division par zéro génère une interruption ou quelque chose d'autre appelle kill(2)). Dans les deux cas, le contrôle est explicitement restitué au système d'exploitation, qui sait quel processus était en cours d'exécution ou doit être tué. La fin d'un processus comprend la libération de ses ressources, mutex inclus. Si un mutex était détenu par le processus maintenant mort, le système d'exploitation le libérera. Si le processus était sur la liste d'attente du mutex, il sera supprimé.
Blrfl