Apakah utas kernel Linux benar-benar proses kernel?
19
Saya telah membaca di banyak tempat bahwa Linux membuat utas kernel untuk setiap utas pengguna di Java VM. (Saya melihat istilah "utas kernel" yang digunakan dalam dua cara berbeda:
sebuah thread yang dibuat untuk melakukan pekerjaan OS inti dan
utas OS yang sadar dan menjadwalkan untuk melakukan pekerjaan pengguna.
Saya berbicara tentang tipe yang terakhir.)
Apakah thread kernel sama dengan proses kernel, karena proses Linux mendukung ruang memori bersama antara orang tua dan anak, atau apakah itu benar-benar entitas yang berbeda?
Sama sekali tidak ada perbedaan antara utas dan proses di Linux. Jika Anda melihat klon (2) Anda akan melihat serangkaian bendera yang menentukan apa yang dibagi, dan apa yang tidak dibagi, di antara utas.
Proses klasik hanyalah utas yang tidak berbagi apa pun; Anda dapat membagikan komponen apa yang Anda inginkan di Linux.
Ini tidak terjadi pada implementasi OS lain, di mana ada banyak perbedaan yang lebih substansial.
Dokumentasinya bisa sangat membingungkan, jadi inilah model Linux " asli ":
di dalam kernel Linux, sesuatu yang dapat dijalankan (& dijadwalkan) disebut "proses",
setiap proses memiliki ID Proses unik (PID) sistem, dan ID Grup Thread (TGID),
proses "normal" memiliki PID = TGID dan tidak ada proses lain yang membagikan nilai TGID ini,
proses "berulir" adalah proses yang nilai TGID dibagi oleh proses lain,
beberapa proses berbagi TGID yang sama juga berbagi, setidaknya, ruang memori dan penangan sinyal yang sama (kadang-kadang lebih),
jika proses "berulir" memiliki PID = TGID, itu dapat disebut "utas utama",
menelepon getpid()dari proses apa pun akan mengembalikan TGID (= "utas utama" PID),
menelepon gettid()dari proses apa pun akan mengembalikan PID (!),
segala jenis proses dapat dibuat dengan clone(2)system call,
nama numerik folder Anda bisa daftar dengan ls /procsebagai /proc/NUMBERyang TGIDs,
nama numerik folder /proc/TGID/taskseperti halnya /proc/TGID/task/NUMBERPID,
meskipun Anda tidak melihat setiap PID yang ada ls /proc, Anda masih bisa melakukannya cd /proc/any_PID.
Kesimpulan : dari sudut pandang kernel, hanya proses yang ada, masing-masing memiliki PID uniknya sendiri, dan yang disebut utas hanyalah jenis proses yang berbeda.
Catatan: implementasi konsep "utas" di Linux telah menyebabkan kebingungan kosa kata, dan jika getpid()berbohong kepada Anda tidak melakukan apa yang Anda pikirkan, itu karena perilakunya mengikuti kompatibilitas POSIX (utas seharusnya berbagi PID umum) .
Saran: menggunakan kata "tugas" dapat membantu merujuk pada sesuatu yang runnable tanpa terlalu banyak terlibat dalam proses / utas kebingungan.
Totor
17
Thread adalah proses di Linux. Mereka dibuat dengan clonepanggilan sistem, yang mengembalikan ID proses yang dapat dikirim sinyal melalui killpanggilan sistem, seperti proses. Proses utas terlihat dalam pskeluaran. The clonepanggilan dilewatkan bendera yang menentukan berapa banyak dari lingkungan proses orangtua dibagi dengan proses benang.
Pria itu pthreads(7)mengatakan bahwa untuk implementasi NPTL (Native POSIX Threads Library) saat ini, "semua utas dalam suatu proses ditempatkan dalam grup utas yang sama; semua anggota grup utas berbagi PID yang sama." Dalam implementasi LinuxThreads yang usang, setiap "utas" memiliki PID sendiri.
Thread adalah proses di Linux. Mereka dibuat dengan
clone
panggilan sistem, yang mengembalikan ID proses yang dapat dikirim sinyal melaluikill
panggilan sistem, seperti proses. Proses utas terlihat dalamps
keluaran. Theclone
panggilan dilewatkan bendera yang menentukan berapa banyak dari lingkungan proses orangtua dibagi dengan proses benang.sumber
pthreads(7)
mengatakan bahwa untuk implementasi NPTL (Native POSIX Threads Library) saat ini, "semua utas dalam suatu proses ditempatkan dalam grup utas yang sama; semua anggota grup utas berbagi PID yang sama." Dalam implementasi LinuxThreads yang usang, setiap "utas" memiliki PID sendiri.