- Tidak, pemahaman Anda tidak sepenuhnya benar. Utas non-preemptive (alias kooperatif) biasanya secara manual menghasilkan kontrol untuk membiarkan utas lain berjalan sebelum selesai (meskipun terserah utas untuk memanggil
yield()
(atau apa pun) untuk mewujudkannya. - Mencegah threading lebih sederhana. Utas kooperatif memiliki lebih sedikit overhead.
- Biasanya menggunakan preemptive. Jika Anda menemukan desain Anda memiliki banyak overhead pengalihan utas, utas kooperatif akan menjadi kemungkinan pengoptimalan. Dalam banyak (sebagian besar?) situasi, ini akan menjadi investasi yang cukup besar dengan hasil yang minimal.
- Ya, secara default Anda akan mendapatkan preemptive threading, meskipun jika Anda melihat-lihat paket CThreads, ini mendukung threading kooperatif. Hanya sedikit orang (sekarang) yang menginginkan utas kerja sama yang saya tidak yakin itu telah diperbarui dalam dekade terakhir...
Utas non-preemptive juga disebut utas kooperatif. Contohnya adalah POE (Perl). Contoh lainnya adalah Mac OS klasik (sebelum OS X). Utas kooperatif memiliki penggunaan CPU secara eksklusif sampai mereka melepaskannya. Penjadwal kemudian memilih utas lain untuk dijalankan.
Utas preemptive dapat secara sukarela menyerahkan CPU seperti yang kooperatif, tetapi jika tidak, itu akan diambil dari mereka, dan penjadwal akan memulai utas lainnya. Utas POSIX &SysV termasuk dalam kategori ini.
Keuntungan besar dari thread kooperatif adalah efisiensi yang lebih besar (setidaknya pada mesin inti tunggal) dan penanganan konkurensi yang lebih mudah:ini hanya ada saat Anda menghasilkan kontrol, sehingga penguncian tidak diperlukan.
Keuntungan besar dari utas preemptive adalah toleransi kesalahan yang lebih baik:satu utas yang gagal menghasilkan tidak menghentikan semua utas lainnya untuk dieksekusi. Juga biasanya berfungsi lebih baik pada mesin multi-core, karena banyak utas dijalankan sekaligus. Akhirnya, Anda tidak perlu khawatir untuk memastikan Anda terus-menerus menghasilkan. Itu bisa sangat mengganggu di dalam, misalnya, pengulangan angka yang berat.
Anda bisa mencampurnya, tentu saja. Satu utas preemptive dapat memiliki banyak utas kooperatif yang berjalan di dalamnya.
Jika Anda menggunakan non-preemptive itu tidak berarti bahwa proses tidak melakukan pengalihan konteks ketika proses sedang menunggu I/O. Dispatcher akan memilih proses lain sesuai dengan model penjadwalan. Kita harus memercayai prosesnya.
non-pendahuluan:
-
lebih sedikit peralihan konteks, lebih sedikit overhead yang masuk akal dalam model non-preemptive
-
Lebih mudah ditangani karena dapat ditangani pada prosesor inti tunggal
pendahuluan :
Keuntungan:
-
Dalam model ini, kami memiliki prioritas yang membantu kami memiliki kontrol lebih besar atas proses yang berjalan
-
Konkurensi yang lebih baik adalah bouncing
-
Menangani panggilan sistem tanpa memblokir seluruh sistem
Kerugian:
-
Memerlukan algoritme yang lebih kompleks untuk sinkronisasi dan penanganan bagian kritis tidak dapat dihindari.
-
Overhead yang menyertainya