Wie oft führt Windows (normalerweise) einen Threadwechsel pro Sekunde durch? Ist das anders als bei .NET-Threads? Oder umgekehrt gefragt: Wie lange darf ein Thread (von zB normaler Threadpriorität) laufen?
Wie oft der Windows-Kontext wechselt, hängt vom System "quantum" ab. Dieser Quantum liegt zwischen 10 und 15 Millisekunden (66-100 Mal pro Sekunde), je nachdem, ob das Betriebssystem Client oder Server ist. Für weitere Details empfahl ich Joe Duffys Buch Concurrent Programming on Windows zu lesen; es geht sehr detailliert auf solche Dinge ein - z.B. Details, dass "Client-Betriebssysteme ... ist 2-Takt-Intervalle. ... auf Server-Betriebssystemen ... ist 12-Takt-Intervalle". Auch sein Artikel CLR Inside Out: Verwendung von Parallelität für Skalierbarkeit ist ein Muss.
Sie können die Quantenlänge sortieren. Wenn Sie unter Leistungsoptionen / Erweitert in den Systemeigenschaften unter "Programme" die Option "Für beste Leistung anpassen:" einstellen, erhalten Sie eine kürzere Quantumzahl. Wenn Sie es auf "Hintergrunddienste" einstellen, erhalten Sie eine längere Quantum.
Wenn es keinen Grund zum Kontextwechsel gibt, erhält ein Thread so viel Zeit wie nötig.
A context switching rate of 300 per second per processor is a moderate amount
sagt in der Quelle .
Windows2000 hat Pviewer-Dienstprogramm , um das zu messen.
Bei einem typischen System hängt dies stark vom E / A-Laden ab. Viele Festplatten- und Netzwerkaktivitäten erzeugen eine Menge Kontextwechsel, da Threads E / A aufrufen, blockiert werden und später wieder bereit gemacht werden. Die Komplexität und das Design der laufenden Apps beeinflusst auch die Kontextwechselrate - Apps mit vielen Threads, vielen Sperren, übermäßiger Arbeit innerhalb von Sperren, zu viel Inter-Thread-Comms im Vergleich zu der Größe von kommunizierten Daten, dummes Polling usw. werden fahren up die Kontextänderungsrate.
Auf den meisten Systemen ist die meiste Zeit über "Quantum", "Time-Slice" usw. irrelevant - nur eine Fußnote in E / A-gesteuertem präemptivem Multitasking, das nur regelmäßig auf Boxen mit mehr Ready, CPU-intensive, Threads als Kerne, dh. solche, die stark überlastet sind oder CPU-intensive Apps ausführen.
Ein Thread mit normaler Priorität darf laufen, bis er vorgezogen wird, normalerweise indem er auf I / O oder Signalisierung von einem anderen Thread wartet. Selbst wenn es keine I / O oder Signalisierung, dh. ist vollständig CPU-gebunden, kann es immer noch für immer laufen, wenn die Box nie überlastet ist, (dh nie mehr fertige Threads als Kerne hat).
Tags und Links .net multithreading windows