- Ne, vaše chápání není zcela správné. Nepreemptivní (aka kooperativní) vlákna obvykle ručně převezmou kontrolu a nechají ostatní vlákna běžet před dokončením (ačkoli je na daném vláknu, aby zavolalo
yield()
(nebo cokoliv jiného), aby se to stalo. - Zabránění vytváření vláken je jednodušší. Kooperativní vlákna mají menší režii.
- Normálně používejte preventivní opatření. Pokud zjistíte, že váš návrh má spoustu režie s přepínáním vláken, možná optimalizace by byla kooperativní vlákna. V mnoha (většině?) situacích to bude poměrně velká investice s minimální návratností.
- Ano, ve výchozím nastavení získáte preemptivní vytváření vláken, i když pokud se porozhlédnete po balíčku CThreads, podporuje kooperativní vytváření vláken. Jen málo lidí (nyní) chce kooperativní vlákna, o kterých si nejsem jistý, zda byly v posledním desetiletí aktualizovány...
Nepreemptivní vlákna se také nazývají kooperativní vlákna. Příkladem je POE (Perl). Dalším příkladem je klasický Mac OS (před OS X). Kooperativní vlákna mají výhradní využití CPU, dokud se ho nevzdají. Plánovač pak vybere další vlákno ke spuštění.
Preemptivní vlákna se mohou dobrovolně vzdát CPU stejně jako kooperativní, ale když tak neučiní, bude jim odebráno a plánovač spustí další vlákno. Vlákna POSIX a SysV spadají do této kategorie.
Velkými výhodami kooperativních vláken je vyšší efektivita (alespoň na jednojádrových strojích) a snadnější zacházení se souběžností:existuje pouze tehdy, když získáte kontrolu, takže zamykání není vyžadováno.
Velkou výhodou preemptivních vláken je lepší odolnost proti chybám:jediné vlákno, které se nepodaří vzdát, nezabrání spuštění všech ostatních vláken. Také normálně funguje lépe na vícejádrových počítačích, protože se spouští více vláken najednou. Konečně se nemusíte starat o to, abyste se neustále poddávali. To může být uvnitř opravdu nepříjemné, např. těžká smyčka křupání čísel.
Můžete je samozřejmě míchat. Jedno preemptivní vlákno může mít v sobě spuštěno mnoho kooperativních vláken.
Pokud používáte nepreemptivní neznamená to, že proces neprovádí přepínání kontextu, když proces čeká na I/O. Dispečer zvolí jiný proces podle rozvrhovacího modelu. Musíme procesu věřit.
Nepreemptivní:
-
méně přepínání kontextu, méně režie to může být rozumné v nepreemptivním modelu
-
Snáze se s ním manipuluje, protože jej lze ovládat na jednojádrovém procesoru
preventivní :
Výhoda:
-
V tomto modelu máme prioritu, která nám pomáhá mít větší kontrolu nad běžícím procesem
-
Lepší souběžnost je odrazem
-
Obsluha systémových volání bez blokování celého systému
Nevýhoda:
-
Vyžaduje složitější algoritmy pro synchronizaci a manipulace s kritickými sekcemi je nevyhnutelná.
-
Režie, která s tím souvisí