THREADS: Utas kernel vs. Utas yang didukung kernel vs. Utas tingkat pengguna?

9

Adakah yang tahu apa perbedaannya?

Sepertinya saya bahwa utas kernel berhubungan dengan kode yang menjalankan kernel (secara intuitif), tapi saya tidak yakin tentang dua lainnya ...

Juga, apakah standar pthreads dianggap tingkat pengguna dan didukung kernel, karena Anda mengakses perpustakaan sementara kernel melakukan semua penjadwalan / pengalihan thread?

Dark Templar
sumber

Jawaban:

14

Istilah "utas kernel" dapat digunakan untuk merujuk pada utas aktual yang berjalan seluruhnya dalam ruang kernel atau dapat merujuk pada utas ruang pengguna yang dijadwalkan oleh kernel. Istilah "didukung oleh kernel" berarti utas yang terakhir, utas yang berjalan di ruang pengguna tetapi difasilitasi oleh kernel, yang biasanya berarti kernel menjadwalkannya.

"Utas tingkat pengguna" biasanya berarti utas yang terlihat oleh ruang pengguna. Yaitu, apa yang Anda buat ketika Anda memanggil fungsi "buat utas" threading standar Anda. Secara umum, istilah "utas tingkat pengguna" digunakan untuk berarti utas yang dibuat oleh kode aplikasi terlepas dari bagaimana penerapannya oleh sistem. Ini mungkin utas murni ruang pengguna dengan sedikit atau tanpa dukungan kernel atau itu mungkin utas yang dijadwalkan oleh kernel.

Standar pthreads dapat diimplementasikan sebagai utas ruang pengguna murni (tempat kernel menjadwalkan proses dan proses menjadwalkan utas), utas yang didukung kernel (tempat kernel menjadwalkan utas secara langsung), atau pendekatan hibrid (tempat kernel menjadwalkan utas tingkat kernel yang kemudian, dalam ruang pengguna, menjadwalkan utas tingkat pengguna). Standar ini tidak menuntut satu cara implementasi tertentu. Implementasi yang paling umum adalah pemetaan 1-ke-1 di mana setiap utas tingkat pengguna memiliki utas yang sesuai yang dijadwalkan oleh kernel.

David Schwartz
sumber
seperti apa implementasinya di Linux?
yati sagade
3
Pada semua sistem Linux modern (2.6 kernel atau lebih baru) yang saya ketahui, implementasi threading default sistem adalah 1 banding 1, setiap utas tingkat pengguna memiliki KSE (entitas penjadwalan kernel - yang sesuai, pada dasarnya, utas yang dijadwalkan oleh Kernel Linux). Utas yang Anda buat dengan 'pthread_create' akan dijadwalkan langsung oleh kernel. Sistem modern umumnya menggunakan NPTL , sistem yang lebih lama menggunakan LinuxThreads - keduanya 1-ke-1.
David Schwartz
"atau pendekatan hybrid (di mana kernel menjadwalkan utas tingkat kernel yang kemudian, dalam ruang pengguna, menjadwalkan utas tingkat pengguna)." Hei David, bisakah Anda menjelaskan ini lagi? Saya tidak yakin apa yang sedang terjadi ... Ketika Anda mengatakan pemetaan 1-ke-1, apakah Anda merujuk pada Blok Kontrol Thread ketika menyebutkan mode-level kernel?
Dark Templar
Dengan 1-to-1 saya berarti bahwa setiap kali Anda sebut 'pthread_create', konteks baru dibuat yang dijadwalkan oleh kernel. Dalam pendekatan hibrid , jumlah konteks yang dijadwalkan oleh kernel kurang dari jumlah utas yang dibuat - kernel menjadwalkan salah satu konteks itu, dan kemudian pengarsipan menjadwalkan perpustakaan salah satu utas yang dibuat oleh aplikasi.
David Schwartz