2017-08-11 21 views
0

Y a-t-il un nombre minimum d'instructions garanties pour être exécutées par un thread pendant un intervalle de temps donné. La page Wikipedia pour Execution Model dit "L'opération d'addition est une unité de travail indivisible dans de nombreuses langues"Y a-t-il un nombre minimum d'instructions exécutées par thread pendant un intervalle de temps donné?

Je voudrais en savoir plus sur le modèle d'exécution de POSIX Thread utilisé avec C/C++ et le nombre minimum d'instructions ou d'instructions indivisibles garantie d'être exécuté dans une seule tranche de temps. Quelqu'un peut-il donner un pointeur d'où je peux apprendre plus à ce sujet. Merci, c'est avance

+1

Quel est le problème que vous essayez de résoudre, que vous pense qu'une réponse à votre question vous rapprocherait d'une solution? La seule chose que le standard C++ garantit est que "** [intro.multithread]/3 ** Implémentations devrait s'assurer que tous les threads débloqués finissent par progresser." –

+0

Pas une réponse à votre question mais: l'addition pourrait être une instruction dans certains scénarios sur certaines machines et plus d'une sur d'autres. Si vous ajoutez deux registres de la même taille et que vous remettez le résultat dans un registre de même taille, alors il s'agira probablement d'une instruction et sur une machine sans instruction pipelining, ce sera probablement un cycle. Mais que faire si vous avez besoin de lire les valeurs de la mémoire - qui prend presque toujours plus d'un cycle. Si les registres n'ont pas tous la même taille, le processeur peut avoir à faire une lecture-modification-écriture qui n'est définitivement pas indivisible. –

+0

Je n'ai jamais envisagé cela lorsque j'écrivais des applications multithread, car cela semble hors de propos, mais je suppose que la réponse est 'une instruction machine'.Il n'est pas déraisonnable qu'un thread soit défini sur un core, puis presque immédiatement interrompu et préempté par un thread de plus haute priorité qui est devenu prêt pour une interruption d'E/S ou une signalisation inter-thread. –

Répondre

3

Non, il n'y a aucune garantie sur le nombre d'instructions par temps. La façon dont les choses fonctionnent est plus compliquée que l'exécution d'un certain nombre d'instructions de toute façon.

Les instructions exécutées dépendent plus de l'architecture du processeur que de la langue. L'architecture MIPS «traditionnelle» enseignée dans de nombreux cours de conception d'introduction exécuterait une instruction par cycle d'horloge; un processeur conçu comme celui-ci fonctionnant à 1MHz exécuterait un million d'opérations par seconde. Les processeurs du monde réel utilisent des techniques telles que les pipelines, la prédiction de branchement, l'hyper-threading, etc. et n'ont pas un nombre défini d'opérations par cycle d'horloge. Au-delà de cela, les processeurs du monde réel fonctionneront généralement sous un système d'exploitation avec des capacités multitâches. Cela signifie qu'un thread peut être interrompu par le noyau à des points inconnus, et n'exécuter aucun code car les autres threads reçoivent du temps processeur. Il existe des systèmes d'exploitation «en temps réel» conçus pour donner plus de garanties sur le temps nécessaire à l'exécution du code exécuté sur le processeur.

Vous avez déjà fait des recherches sur Wikipedia; Certains des mots-clés ci-dessus devraient aider à trouver plus d'articles sur le sujet, et à partir de là, vous devriez être en mesure de trouver beaucoup de sources primaires pour en savoir plus sur le sujet.

+0

Dans le cas où il n'y a pas de nombre minimum d'instructions, si deux thread appellent pthread_lock() comment il est garanti qu'un thread particulier se verrouille avec succès avant l'autre. Comment même ce mécanisme fonctionne? – Dinesh

+0

Il existe des instructions de processeur qui sont "atomiques" comme TSL (test-set-lock). Ces instructions effectuent une comparaison et stockent un résultat dans une instruction unique, et sont utilisées pour implémenter des verrous par le système d'exploitation. Pour votre exemple, les deux threads tentent chacun d'acquérir le verrou, et dans le cadre de cette opération, utilisez une instruction TSL. Le premier thread qui a réussi l'instruction TSL acquiert le verrou; le deuxième thread pour exécuter l'instruction échouera et passera dans un état d'attente sur le verrou. – wmorrell

1

Dans les threads POSIX, il existe deux stratégies d'ordonnancement principales (FIFO et Round Robin). Round Robin est le planificateur par défaut car c'est plus juste. Lorsque RR scheduler est utilisé, chaque thread a une durée (AKA quantum) à courir, donc il n'y a aucune garantie qu'un nombre X d'instructions sera exécuté - sauf si nous savons combien de temps prend chaque instruction.

Vous pouvez trouver plus sur des algorithmes de planification sur PThreads ici: http://maxim.int.ru/bookshelf/PthreadsProgram/htm/r_37.html

Juste pour vous donner une idée sur la façon dont Linux définit le quantum rond ronde:

/* 
* default timeslice is 100 msecs (used only for SCHED_RR tasks). 
* Timeslices get refilled after they expire. 
*/ 
#define RR_TIMESLICE  (100 * HZ/1000) 

#endif /* _LINUX_SCHED_RT_H */