Saya memiliki pertanyaan terkait dengan implementasi utas di Linux.
Linux tidak memiliki dukungan utas eksplisit. Di ruang pengguna, kami mungkin menggunakan perpustakaan utas (seperti NPTL) untuk membuat utas. Sekarang jika kita menggunakan NPTL, ini mendukung pemetaan 1: 1.
Kernel akan menggunakan clone()
fungsi tersebut untuk mengimplementasikan utas.
Misalkan saya telah membuat 4 utas. Maka itu berarti:
- Akan ada 4
task_struct
. - Di dalam
task_struct
, akan ada ketentuan untuk berbagi sumber daya sesuai argumen untuk kloning(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND)
.
Sekarang saya memiliki pertanyaan berikut:
- Apakah 4 utas akan memiliki PID yang sama? Jika seseorang dapat menjelaskan, bagaimana PID dibagikan.
- Bagaimana berbagai utas diidentifikasi; apakah ada konsep TID (thread ID)?
getpid()
mengembalikan tgid:,asmlinkage long sys_getpid(void) { return current->tgid;}
seperti yang ditunjukkan di www.makelinux.com/gettgid(2)
fungsi. Dangetpid()
tidak akan mengembalikan TID (thread "PID"), dan ada di managettid(2)
masuk. Dengan cara ini saya bisa tahu, apakah kita berada di thread utama atau tidak.Thread diidentifikasi menggunakan PID dan TGID (Thread group id). Mereka juga tahu utas mana yang merupakan induk dari yang pada dasarnya sebuah proses membagikan PID-nya dengan utas apa pun yang dimulai. ID Thread biasanya dikelola oleh perpustakaan thread itu sendiri (seperti pthread, dll ...). Jika 4 utas dimulai, mereka harus memiliki PID yang sama. Kernel itu sendiri akan menangani penjadwalan utas dan semacamnya tetapi pustaka adalah salah satu yang akan mengelola utas (apakah mereka dapat berjalan atau tidak tergantung pada penggunaan metode bergabung dan menunggu utas).
Catatan: Ini dari ingatan saya tentang kernel 2.6.36. Pekerjaan saya di versi kernel saat ini adalah di lapisan I / O jadi saya tidak tahu apakah sudah berubah sejak saat itu.
sumber
Linux menyediakan
fork()
panggilan sistem dengan fungsionalitas tradisional untuk menduplikasi suatu proses. Linux juga menyediakan kemampuan untuk membuat utas menggunakanclone()
panggilan sistem. Namun, linux tidak membedakan antara proses dan utas.sumber