Lorsqu'un mutex est déjà verrouillé par T1 et T2 tente de le verrouiller, quel est le processus pour T2? P>
Je pense que ça va quelque chose comme ça: P>
-T2 essaie de verrouiller, échoue, peut-être des spinlocks un peu, puis appelle leur rendement ...
-T2 est prévu pour l'exécution plusieurs fois, tente de verrouiller l'échec, des rendements ...
-Les avenuement T1 déverrouillent, T2 est prévu pour l'exécution et parvient à verrouiller le mutex ... p> blockQuote>Le déverrouillage t1 signalera-t-il explicitement le planificateur ou d'autres threads que le mutex est déverrouillé? Ou fait-il simplement un déverrouillage et laissez le planificateur pour planifier des threads bloqués lorsqu'il se sent approprié de le faire (le planificateur AKA n'a aucune notion de threads bloqués et ne les traite pas comme spécial)? P>
3 Réponses :
Cela dépend de votre système d'exploitation. J'ai vu simplement tourner, tourner avec La filature et la filature avec le rendement Il existe des situations où la filature peut avoir une meilleure performance. En Solaris, une primitive de verrouillage dans le noyau a un mode adaptatif dans lequel la serrure tourne aussi longtemps que le processus de maintien de la serrure fonctionne sur un processeur différent. Si le propriétaire de verrouillage dort ou se fait préempté, le serveur de verrouillage s'endormit également. Dans d'autres noyaux, il y a des cours de serrures où le propriétaire de la serrure ne peut pas être préempté ou dormir lors de la tenue de la serrure. Par conséquent, dans ces cas, la filature fonctionne bien aussi. En général, en particulier dans Userland, Spinning a de tels cas dégénèrent horribles (le processus de filage tourne jusqu'à ce qu'il soit préempté à laisser le propriétaire de verrouillage) que c'est très mauvais pour la performance. Notez que les primitives de verrouillage spécialisées telles que rendement code>, variables de condition générale dans le noyau, planification contrôlée par Userland et primitives de verrouillage spécialisées avec support de noyau. P>
code> ont une terrible performance. Théorétiquement Userland contrôlée planification (voir Les activations du planificateur ) devraient avoir la meilleure performance, mais autant que je sache Personne n'a jamais fait fonctionner correctement dans tous les cas. Les variables d'état à usage général dans le noyau et les primitives de verrouillage spécialisées avec support de noyau doivent fonctionner plus ou moins la même chose avec Futex a> sous Linux comme meilleur exemple de ce dernier. p>
Futex CODE> pourraient mettre en œuvre des optimisations telles que ceci, quelque chose que les variables de condition générale ne peuvent normalement pas. P>
Nice A, mais "Spinning and Spinning avec rendement a des performances terribles" devrait être qualifié ... Je peux imaginer des scénarios de faible avancement et une faible quantité de travail sous serrure où les spinlocks sont rapides.
Tous les serrures sont (tout à fait) efficaces lorsqu'il n'y a pas de contention. Des méthodes de verrouillage bien conçues sont également efficaces lorsqu'il y a une hauteur de contenu. Cela dépend également du nombre de processeurs disponibles - une attente "filage" est terrible sur un système de processeur unique, car l'autre thread qui maintient actuellement le verrouillage ne sera pas exécuté et T2 utilise tout le processeur pour vérifier si T1 Qui ne passe pas à courir a libéré le verrou - c'est une utilisation assez inutile du processeur.
@Mats je pensais au système multicœuvre, mais de l'OFC, je suis d'accord avec vous pour un seul noyau.
En bref: oui, peut-être ... p>
Ce sont des détails de mise en œuvre, et il est assez difficile de dire sans au moins savoir quel système d'exploitation que vous parlez. En règle générale, le déverrouillage d'un mutex ne marquera le thread en attente comme « runnable », mais pas (nécessairement) Invoke le planificateur à ce moment-là - et même si le planificateur est appelé, cela ne signifie pas que T2 sera le prochain fil courir. p>
Dans Linux, le code entre mutex_unlock () code> qui vérifie s'il y a une tâche d'attente (en vérifiant si le verrou de comptage est inférieur à zéro - il commence à 1 pour déverrouiller, un seul lock-demande, il obtient à zéro, une nouvelle tentative de verrouillage, il sera négatif). S'il y a un autre processus d'attente, il appelle un « déverrouillage lent chemin », qui, via deux fonctions de redirection afin de permettre les détails de mise en œuvre, se termine dans
__ mutex_unlock_common_slowpath code>
- quelques lignes plus bas, il y a un appel à wake_up_process code> qui a finalement extrémités en
try_to_wake_up code>
- qui essentiellement juste en file d'attente la tâche comme « prêt à fonctionner », puis appelle le planificateur (via plusieurs couches de fonctions!) p>
Donc, vous dites que sur le fil Linux qui bloque est marqué un non-exécutable (afin que SPARY ne soit pas programmer avant qu'il soit marqué comme échéant)
Oui c'est correct. Cela suppose que vous utilisez le noyau Mutex Tho ', ce qui peut ne pas être quoi, par exemple, des outils Pthread_Mutex.
Très bonne réponse ... BTW sans moi vous dérange beaucoup ... Pouvez-vous dire rapidement si Futex diffère de cela de manière significative.
J'ai examiné rapidement le code futex code>, et il a l'air assez différent et est une fonctionnalité beaucoup plus grande dans le noyau ...
dire que nous avons suivi scénario: * L'appel système, déverrouiller strong>, doit notifier à tous les tâches fortes> bloquées / Processus / threads forts> bloqués sur l'appel de verrouillage fort> de mutex fort>. Ils sont alors
Je pense CODE> Le principe d'exclusion mutuelle garantit que NO 2 ou plus de threads entrent dans la section critique en même temps. Maintenant, si vous avez une file d'attente pour les threads qui tentent de verrouiller le mutex ou que vous venez de faire une attente bien occupé jusqu'à ce que le mutex soit gratuit dépend de la manière dont vous les implémentez et quels sont vos besoins en mutex. Par exemple,
mutex code> dans le protocole de plafond de la priorité de VXWorks Mettre en œuvre, que vous n'avez peut-être pas besoin dans un système d'exploitation général (GPOS).