2016-04-25 12 views
0

Bitte korrigieren Sie mein Verständnis.Hat ein Worker-Thread im Blocking-Zustand vor dem TAP/TPL-Befehl im alten Threadpool-Modell den Threadpool zurückgegeben und zurückgegeben?

Bevor das Task-basierte asynchrone Programmiermodell eingeführt wurde, funktionierte der .NET ThreadPool anders.

1) Wenn ein Thread an einem I/O Completion-Port blockierte, gab es im alten System den Anteil der CPU-Zeit an das OS, während es sich im blockierenden Zustand befand.

2) Ist mein Verständnis korrekt, dass nach der neuen Thread Pool und Task Scheduler-Implementierung, die mit TPL kam, dass jetzt ein Thread in den Thread-Pool sofort nach dem Eintritt in den Blockierungszustand zurückkehrt?

3) Und dass im alten Regime der blockierte Thread nicht zum Thread-Pool zurückkehrte und daher unnötigen Overhead der Thread-Injektion verursachte, der hätte vermieden werden können?

+0

Nein, weder die ThreadPool-Implementierung noch der Scheduler wurden geändert. Und ThreadPool.SetMin/MaxThreads() nahm immer ein Argument * completionPortThreads * . Und TPL belegt keinen Thread, während I/O läuft. TAP hat die Callback-Methode viel einfacher geschrieben, der C# -Compiler schreibt sie jetzt für Sie. –

+0

Danke. Ich denke, der Hauptteil meiner Frage ist: Früher, wenn ein Thread-Pool-Thread im Sperrzustand war, könnte er für etwas anderes verwendet worden sein? Wenn es in den Pool zurückkehrt, könnte es auch seinen Ausführungskontext an einen anderen Ort ausgelagert und für etwas anderes verwendet worden sein. Welche realen Kosten hat TPL dann eingespart?Wenn es jedoch nicht für etwas anderes verwendet werden kann, während es blockiert ist, hat die * task * -Abstraktion einen echten Vorteil, und wenn der Benutzer nicht über den Thread als Arbeitseinheit nachdenkt, kann nun jeder Thread Arbeit von anderen stehlen. –

+0

Ein paar Vorlesungen in der Architektur von Betriebssystemen und etwas Lesen von Managed Threading vom MSDN haben mir gezeigt, wie dumm ich bin, diese unvernünftige, ungebildete Frage zu stellen und die Hybris zu haben (es war nicht Hybris, sondern blinde Ignoranz)) um mit @HansPassant zu sprechen, der wie der Guy de Maupassant der Low-Level-Programmierung ist. Ich stehe in der Ferne, korrigiert. –

Antwort

2

1) Nach dem alten System, wenn ein Faden auf einem I/O-Completion-Port blockiert wurde, hat es seine Scheibe der CPU-Zeit auf die OS Ausbeute, während es in Zustand blockiert war?

Ja. Es wird im Grunde das Warten gleichwertig auf dem Vollendungshafen nennen. Beachte das "WILL". NICHTS hat sich in dieser Hinsicht verändert.

2) Ist mein Verständnis richtig, dass nach dem neuen Thread-Pool und Aufgabe Scheduler-Implementierung, die mit TPL, kam hier überhaupt

Nichts Neues

kam. Woher bekommst du den Wahn? TPL ist auf dem Laufflächenpool aufgebaut. Es hat es weder verändert noch den KERNEL LEVEL SCHEDULER auf magische Weise neu geschrieben.

3) Und das in dem alten Regime, nicht der blockierten Thread unnötigen Aufwand an den faden Pool und somit verursacht Faden Injektion zurückgehen, dass hätte vermieden werden können?

Es ist immer noch so. Sie können weiterhin die Standard-API verwenden. Alles andere ist oben mit einigen Compiler-Tricks aufgebaut, um den Aufruf der API zu erleichtern, aber nichts hat sich geändert. Es gibt immer noch Fälle, in denen die alte API besser ist.

Also, dieser Teil ist falsch. Der Rest ist richtig - ein Thread ist vom Pool nicht nutzbar, bis er dort zurückgegeben wird. Und die Standard-Threading-API wird nicht zurückgegeben. Das neue tut es auch nicht - der Thread wird an den Task-Scheduler zurückgegeben, der ihn für eine andere Task verwendet, aber vom Thread-Pool hat sich nichts geändert.

+0

Vielen Dank. Ich hörte Jeffrey Richter (glaube ich) auf einem der Channel 9-Videos sagen, dass mit .NET 4.5 die Implementierung der ThreadPool-Klasse umgeschrieben wurde. Aber ich habe auf die neuen Funktionen von * Work Stealing/Load Balancing * und solchen, die vorher nicht existierten, hingewiesen, aber ich verstehe, was Sie sagen. Es nutzt die gleiche alte Infrastruktur. –

+0

Nein. Sie haben den Thread-Pool überarbeitet, um ihn effizienter zu machen. Zum Beispiel werden Threads jetzt zwischen appdomains geteilt. Aber das Stehlen usw. wird nicht im Thread Pool gemacht. Der TaskScheduler sitzt über normalen Threads und weist sie den Tasks zu. Am Ende des Tages sind Threads ein Mechanismus auf Kernel-Ebene (zumindest in der Windows-Implementierung). – TomTom

+0

Ja, Arbeitsstehlen wird vom Scheduler ausgeführt und der Thread-Pool stellt nur Arbeitsaufgaben oder verwaltete Min- und Max-Threads in die Warteschlange und antizipiert und behandelt die Überbelegung. Ich habe daraus nicht abgeleitet, dass der Thread-Pool das tut. Ich dachte nur, dass sie auch den Thread-Pool neu geschrieben haben, den du geklärt hast. Und wie du sagst, wäre ein Umschreiben/Refactoring des Thread-Pools, um in dem neuen Paradigma zu sitzen, unvermeidlich gewesen. Ich dachte nur, dass der ThreadPool sich jetzt drastisch anders verhielt. Danke für die Klarstellung. –