- Nein, Ihr Verständnis ist nicht ganz richtig. Nicht präemptive (auch bekannt als kooperative) Threads geben normalerweise manuell die Kontrolle ab, um andere Threads laufen zu lassen, bevor sie fertig sind (obwohl es Sache dieses Threads ist,
yield()
aufzurufen). (oder was auch immer) um das zu erreichen. - Das Vorbeugen von Threading ist einfacher. Kooperative Threads haben weniger Overhead.
- Normalerweise präventiv verwenden. Wenn Sie feststellen, dass Ihr Design viel Threadwechsel-Overhead hat, wären kooperative Threads eine mögliche Optimierung. In vielen (den meisten?) Situationen wird dies jedoch eine ziemlich große Investition mit minimaler Auszahlung sein.
- Ja, standardmäßig erhalten Sie präventives Threading, aber wenn Sie sich nach dem CThreads-Paket umsehen, unterstützt es kooperatives Threading. Nur wenige Leute wollen (jetzt) kooperative Threads, von denen ich nicht sicher bin, ob sie in den letzten zehn Jahren aktualisiert wurden ...
Nicht präemptive Threads werden auch als kooperative Threads bezeichnet. Ein Beispiel hierfür ist POE (Perl). Ein weiteres Beispiel ist das klassische Mac OS (vor OS X). Kooperative Threads haben die ausschließliche Nutzung der CPU, bis sie sie aufgeben. Der Scheduler wählt dann einen anderen Thread zum Ausführen aus.
Preemptive Threads können die CPU genauso wie kooperative Threads freiwillig aufgeben, aber wenn sie dies nicht tun, wird sie ihnen genommen, und der Scheduler startet einen anderen Thread. POSIX- und SysV-Threads fallen in diese Kategorie.
Große Vorteile von kooperativen Threads sind größere Effizienz (zumindest auf Single-Core-Rechnern) und einfachere Handhabung der Parallelität:Sie existiert nur, wenn Sie die Kontrolle abgeben, also ist kein Sperren erforderlich.
Große Vorteile von präemptiven Threads sind eine bessere Fehlertoleranz:Ein einzelner Thread, der nicht nachgibt, stoppt nicht die Ausführung aller anderen Threads. Funktioniert normalerweise auch besser auf Mehrkernmaschinen, da mehrere Threads gleichzeitig ausgeführt werden. Endlich müssen Sie sich keine Gedanken darüber machen, dass Sie ständig nachgeben. Das kann innerlich sehr nervig sein, z. B. eine schwere Zahlenknirschschleife.
Du kannst sie natürlich mischen. In einem einzelnen präemptiven Thread können viele kooperative Threads laufen.
Wenn Sie nicht präemptiv verwenden Dies bedeutet nicht, dass der Prozess keine Kontextumschaltung durchführt, wenn der Prozess auf E/A wartet. Der Dispatcher wählt gemäß dem Scheduling-Modell einen anderen Prozess aus. Wir müssen dem Prozess vertrauen.
nicht präemptiv:
-
weniger Kontextwechsel, weniger Overhead das kann im nicht-präemptiven Modell sinnvoll sein
-
Einfacher zu handhaben, da es auf einem Single-Core-Prozessor gehandhabt werden kann
präventiv :
Vorteil:
-
In diesem Modell haben wir eine Priorität, die uns hilft, mehr Kontrolle über den laufenden Prozess zu haben
-
Bessere Parallelität ist ein Bounce
-
Behandlung von Systemaufrufen, ohne das gesamte System zu blockieren
Nachteil:
-
Erfordert komplexere Algorithmen für die Synchronisation und die Behandlung kritischer Abschnitte ist unvermeidlich.
-
Der damit verbundene Overhead