186 votes

quelle est l'efficacité du verrouillage d'un mutex déverrouillé? combien coute un mutex?

Dans un langage de bas niveau (C, C++ ou autre): j'ai le choix entre soit avoir un paquet de mutex (comme ce que pthread me donne ou quel que soit le système natif de la bibliothèque) ou un seul pour un objet.

Quelle est l'efficacité pour verrouiller un mutex? I. e. combien d'instructions en assembleur sont-elles probables et combien de temps prennent-ils (dans le cas que le mutex est déverrouillé)?

Combien coûte un mutex coût? Est-ce un problème d'avoir vraiment beaucoup de mutex? Ou puis-je simplement jeter autant de mutex variables dans mon code que j'ai int variables et il n'a pas vraiment d'importance?

(Je ne suis pas sûr combien il ya des différences entre les différents matériels. Si c'est possible je voudrais aussi savoir à leur sujet. Mais surtout, je me suis intéressé à ce sujet commun de matériel.)

Le point est, en utilisant de nombreux mutex qui couvrent chacun une partie seulement de l'objet au lieu d'un seul mutex, pour l'ensemble de l'objet, je pourrais sûr de nombreux blocs. Et je me demandais comment beaucoup je dois aller à ce sujet. I. e. devrais-je essayer de l'abri tout possible de bloquer vraiment autant que possible, peu importe la façon dont beaucoup plus compliqué et comment beaucoup plus mutex cela signifie?

Merci, Albert

139voto

Dummy00001 Points 6088

J'ai le choix entre soit avoir un paquet de mutex ou un seul pour un objet.

Si vous avez de nombreux fils et l'accès à l'objet qui se passe souvent, de multiples verrous permettrait d'augmenter le parallélisme. Le coût de la maintenance, depuis plus de blocage des moyens plus débogage de verrouillage.

Quelle est l'efficacité pour verrouiller un mutex? I. e. combien d'instructions en assembleur sont-elles probables et combien de temps prennent-ils (dans le cas que le mutex est déverrouillé)?

La précision des instructions en assembleur sont le moins de frais généraux d' un mutex - la mémoire/de cohérence de cache garanties sont les principaux généraux. Et moins souvent un verrou est pris en mieux.

Mutex est composé de deux grandes parties (le raccourci): (1) un drapeau indiquant si le mutex est verrouillé ou non et (2) de la file d'attente.

Changement de l'indicateur est à seulement quelques instructions et fait normalement sans appel système. Si le mutex est verrouillé, syscall qui va arriver à ajouter le thread d'appel dans la file d'attente et commencer à l'attente. Le déverrouillage, si la file d'attente est vide, n'est pas cher mais sinon a besoin d'un syscall pour réveiller l'un des processus en attente. (Sur certains systèmes à bas prix rapide/appels sont utilisés pour mettre en œuvre le mutex, ils deviennent lent (normal) système d'appels uniquement en cas de litige.)

Verrouillage déverrouillé mutex est vraiment pas cher. Déverrouillage de mutex w/o contention n'est pas cher.

Combien coûte un mutex coût? Est-ce un problème d'avoir vraiment beaucoup de mutex? Ou puis-je simplement jeter autant de mutex variables dans mon code que j'ai variables int, et il n'a pas vraiment d'importance?

Vous pouvez lancer autant de mutex des variables dans votre code que vous le souhaitez. Vous êtes seulement limité par la quantité de mémoire de l'application peut allouer.

Résumé. De l'espace utilisateur verrouille (et le mutex en particulier) ne sont pas chers et ne soit soumis à aucune limite du système. Mais beaucoup trop de sorts cauchemar à des fins de débogage. Tableau Simple:

  1. Moins de serrures signifie plus de querelles (lent syscalls, CPU stands) et moindre parallélisme
  2. Moins de serrures signifie moins de problèmes de débogage multi-threading problèmes.
  3. Plus de verrous signifie moins de querelles et de plus le parallélisme
  4. Plus de verrous signifie plus de chances de courir dans les undebugable les blocages.

L'équilibre schéma de verrouillage de l'application doit être trouvé et maintenu, généralement de l'équilibrage de la #2 et la #3.


(*) Le problème avec le moins très souvent verrouillé mutex est que si vous avez trop de verrouillage dans votre application, il provoque beaucoup d'entre CPU/core trafic pour rincer le mutex de la mémoire dans le cache de données des autres Processeurs pour garantir la cohérence de cache. Les vidages de cache sont comme la lumière-poids interruptions et géré par le Cpu de manière transparente, mais ils présentent donc appelé stands (de la recherche pour "décrochage").

Et les stalles sont ce qui rend le code de verrouillage à courir lentement, souvent sans aucune indication apparente pourquoi l'application est lente. (Certains arche de fournir de l'inter-CPU/core traffic stats, d'autres non.)

Pour éviter le problème, les gens en général recours à un grand nombre de verrous à diminuer la probabilité de blocage des querelles, et pour éviter le décrochage. C'est la raison pour laquelle le bas de l'espace utilisateur de verrouillage, n'est pas soumis à des limites du système, il existe.

12voto

valdo Points 7322

Cela dépend de ce que vous appelez "mutex", OS mode et etc.

Au minimum c'est un coût d'un contrefil de fonctionnement de la mémoire. C'est une opération relativement lourde par rapport à d'autres primitives assembleur commandes).

Cependant, qui peut être beaucoup plus élevé. Si ce que vous appelez "mutex" un objet du noyau (c'est à dire - objet géré par l'OS) et s'exécutent en mode utilisateur - chaque opération conduit à un mode noyau de la transaction, qui est très lourd.

Par exemple sur un processeur Intel Core Duo, Windows XP. Interloqué de l'opération: environ 40 cycles de PROCESSEUR. Mode noyau d'appel (c'est à dire de l'appel système) - environ 2000 cycles de PROCESSEUR.

Si c'est le cas, vous pouvez envisager d'utiliser des sections critiques. C'est un hybride d'un noyau de mutex et verrouillé l'accès à la mémoire.

7voto

paxdiablo Points 341644

Le coût varie en fonction de la mise en œuvre, mais vous devez garder à l'esprit deux choses:

  • le coût sera probablement minime, car il est à la fois un assez primitif de fonctionnement et sera optimisé autant que possible en raison de son profil d'utilisation (utilisé un lot).
  • il n'a pas d'importance la façon dont elle est chère, car vous avez besoin de l'utiliser si vous voulez sécurité multi-thread de l'opération. Si vous en avez besoin, puis vous en avez besoin.

Sur les systèmes monoprocesseur, généralement, vous pouvez simplement désactiver les interruptions assez longtemps pour atomiquement de modifier des données. Systèmes Multi-processeurs pouvez utiliser un test et jeu de stratégie.

Dans ces deux cas, les instructions sont relativement efficaces.

Si vous devez fournir un seul mutex, pour un énorme structure de données, ou ont beaucoup de mutex, un pour chaque section, c'est un acte d'équilibrage.

En ayant un seul mutex, vous avez un risque plus élevé de conflit entre plusieurs threads. Vous pouvez réduire ce risque en ayant un mutex par section, mais vous ne voulez pas vous retrouver dans une situation où un thread a pour verrouiller 180 mutex pour faire son travail :-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X