11
votes

Mise en œuvre et signalisation mutex

Lorsqu'un mutex est déjà verrouillé par T1 et T2 tente de le verrouiller, quel est le processus pour T2?

Je pense que ça va quelque chose comme ça:

-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 ...

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)?


1 commentaires

Je pense 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 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).


3 Réponses :


6
votes

Cela dépend de votre système d'exploitation. J'ai vu simplement tourner, tourner avec rendement , 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.

La filature et la filature avec le rendement 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 sous Linux comme meilleur exemple de ce dernier.

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 Futex pourraient mettre en œuvre des optimisations telles que ceci, quelque chose que les variables de condition générale ne peuvent normalement pas.


3 commentaires

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.



3
votes

4 commentaires

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 , et il a l'air assez différent et est une fonctionnalité beaucoup plus grande dans le noyau ...



1
votes

dire que nous avons suivi scénario: xxx

* L'appel système, déverrouiller , doit notifier à tous les tâches bloquées / Processus / threads bloqués sur l'appel de verrouillage de mutex . Ils sont alors programmés à exécuter. Cela ne signifie pas qu'ils sont exécutés car il pourrait y avoir déjà une personne dans l'exécution. Comme d'autres l'indiquent, cela dépend de la mise en œuvre de la manière dont cela est-ce fait. Si vous voulez vraiment apprendre cela, je recommanderais ce book


0 commentaires