2013-01-21 8 views
5

Unter Windows gibt es zwei Möglichkeiten, Arbeitselemente einzufügen, um zu vermeiden, zu viele Threads zu erstellen:E/A-Abschlussanschluss vs. QueueUserApc?

Mittel 1: Verwenden Sie IOCP;

Mittel 2: Verwenden Sie QueueUserApc.

bedeutet jedoch, 1 weit komplizierter ist als Mittel 2.e

Also meine Frage ist: Was sind die Vorteile der Einrichtung 1 im Verhältnis zu den Mitteln 2?

Antwort

7

Wenn Sie QueueUserApc aufrufen, müssen Sie einen bestimmten Thread als Ziel haben.

IOCP verfügt über einen integrierten Thread-Dispatch-Mechanismus, der QueueUserApc fehlt, mit dem Sie den effizientesten Thread aus einem Thread-Pool herausholen können. Der Thread-Verteilungsmechanismus verhindert automatisch, dass zu viele Threads gleichzeitig ausgeführt werden (was zusätzliche Kontextwechsel und zusätzliche Konflikte verursacht) oder dass zu wenige Threads gleichzeitig ausgeführt werden (was zu einer schlechten Leistung führt).

Windows verfolgt tatsächlich die Anzahl der Threads, die IOCP-Jobs ausführen. Sie legt zunächst fest, wie viele Threads die Anzahl der virtuellen Kerne auf dem Computer ausführen darf. Wenn ein Thread jedoch für E/A oder Synchronisation blockiert, wird ein anderer Thread, der am IOCP-Port blockiert ist, automatisch freigegeben, um Thread-Mangel zu vermeiden.

Darüber hinaus kann IOCP einfach an E/A angeschlossen werden, so dass E/A-Ereignisse den Versand von Threads auslösen, die am IOCP-Port blockiert sind. Dies ist die effizienteste Möglichkeit, E/A für eine große Anzahl von Zielen unter Windows auszuführen.

+0

+1. Gute Antwort. Hinweis: Der zweite Absatz führt direkt zu dem Grund, warum Sie die Anzahl der erlaubten "laufenden" Threads haben und die tatsächliche Größe des "runnable" Thread-Pools kann sich deutlich unterscheiden. Die Fähigkeit des Betriebssystems, diese interne Terminplanung für Sie selbst durchzuführen, ist nahezu erstaunlich und kann nicht überbewertet werden. – WhozCraig

+0

@WhozCraig: Ich stimme zu. Ich bin überrascht, dass andere Betriebssysteme einen ähnlichen Versandmechanismus nicht übernommen haben. Während andere Betriebssysteme ausgezeichnete E/A-Erkennungsmechanismen haben (wie Linux [epoll] (http://en.wikipedia.org/wiki/Epoll) und FreeBSDs [kqueue] (http://en.wikipedia.org/wiki/ Kqueue)), ich kenne kein anderes Betriebssystem, das über einen vergleichbaren Dispatch-Mechanismus verfügt, geschweige denn direkt an einen E/A-Erkennungs-/Benachrichtigungsmechanismus gebunden ist. –

Verwandte Themen