2010-06-20 2 views
2

J'ai l'application .NET en temps réel souple exécutée sur W2008R2. Je viens de me rendre compte que je ne peux pas expliquer comment les threads sont programmés avec précision.Existe-t-il un schéma/algorithme simple et conscient sur la programmation des threads?

Et pour mon embarassement je ne sais pas du tout comment cela fonctionne sur les threads du système d'exploitation. Donc, je vais vous expliquer ce que je sais et je serais reconnaissant si quelqu'un pouvait m'aider à combler les lacunes et me référer à une simple description des algorithmes qui sont utilisés dans .NET et Windows pour planifier les discussions.

Mon code s'exécute dans les threads gérés. Comme je sais que les threads gérés (appelons les threads .NET) s'exécutent dans des threads non gérés (appelons les threads OS).

Je sais que les threads sont en concurrence pour le temps CPU et d'autres ressources. Et qu'il y a un logiciel - un planificateur qui surveille les ressources et les threads et qui fait fonctionner le tout.

Ici, je ne suis pas sûr - est le planificateur juste un pour le système d'exploitation ou il y a aussi le programmeur .NET qui programme les threads .NET? Et s'il y a deux planificateurs alors comment ils travaillent ensemble?

Et quelles sont les règles pour planifier un thread? Je souhaite limiter cette question à un thread qui ne fait que des calculs arithmétiques et aucun accès à des périphériques, donc nous parlons purement thread processeur.

Comment les facteurs du planificateur sont la priorité de thread .NET, la priorité de processus et une ressource partagée (CPU dans ce cas)?

Répondre

1

Les versions actuelles du .NET desktop runtime ont un mappage 1: 1 entre les threads .NET et les threads du système d'exploitation. Cela peut changer dans les futures versions (et peut ne pas être vrai dans d'autres hôtes, je sais que ce n'est pas vrai dans AutoCAD mais je crois que c'est vrai dans SQL Server et MS Office). Notez que le thread .NET pool est différent du pool d'unités d'exécution du système d'exploitation (bien qu'il utilise un seul port d'achèvement d'E/S à l'échelle du processus, qui a une certaine sémantique de type pool). Pour des réponses complètes et complètes, vous aurez besoin de deux livres: Windows Internals et Concurrent Programming on Windows. Je recommande de les lire dans cet ordre.

+0

Stephen Je suis très friand de gars comme Russinovich et Duffy mais pour lire 2 livres épais seulement pour comprendre comment les discussions sont programmées .... Je suis sûr que scheduler utilise des règles très simples. C'est à dire. si un thread a priotiry X et il signale READY et il y a un noyau CPU disponible et il n'y a pas de threads PREADY avec la priorité> X puis exécutez ce thread .... –

+0

De plus, .NET 4.0 fournit un ThreadPool amélioré qui permet au pool d'avoir c'est propre (éventuellement défini par l'utilisateur) Planificateur de tâches. Cependant, je crois que cela s'applique seulement au démarrage de nouveaux threads, pas à ceux qui sont en cours d'exécution (je peux me tromper là-dessus) et une fois qu'un thread est en cours d'exécution sous le planificateur de thread du système d'exploitation. –

+0

@Bobb: En fait, la planification des threads est assez complexe. Je recommande Windows Internals pour la vue d'ensemble (par exemple, les priorités de thread "hard" et "soft"), et CPoW pour les détails. –

Questions connexes