Bagaimana Linux membedakan utas dari proses anak?


Jawaban:


28

Dari task_structperspektif, utas proses memiliki pemimpin grup utas yang sama ( group_leaderdalamtask_struct ), sedangkan proses anak memiliki pemimpin grup utas yang berbeda (masing-masing individu proses anak).

Informasi ini terkena ruang pengguna melalui satu /procsistem file. Anda dapat melacak orang tua dan anak-anak dengan melihat ppidbidang di /proc/${pid}/statatau .../status(ini memberi orang tua pid); Anda dapat melacak utas dengan melihat tgidbidang dalam .../status(ini memberikan id grup utas, yang juga merupakan pid pemimpin grup). Utas proses dibuat terlihat dalam /proc/${pid}/taskdirektori: setiap utas mendapatkan subdirektori sendiri. (Setiap proses memiliki setidaknya satu utas.)

Dalam praktiknya, program yang ingin melacak utasnya sendiri akan bergantung pada API yang disediakan oleh pustaka threading yang mereka gunakan, alih-alih menggunakan informasi spesifik OS. Biasanya pada sistem mirip Unix yang berarti menggunakan pthreads.


Setiap proses dalam pipeline shell (echo foo | cat) berbagi pemimpin grup yang sama (shell), tetapi mereka bukan thread dalam proses yang sama.
psusi

2
Anda sedang berbicara tentang kelompok proses; dalam jawaban saya, pemimpin grup adalah dari perspektif kernel. Dalam akuntansi kernel, proses terpisah adalah pemimpin kelompok mereka sendiri. Anda dapat melihat ini dengan menjalankan (sleep 120 | sleep 120) &dan melihat Tgidnilai - nilai dalam file setiap sleepproses /proc/${pid}/status.
Stephen Kitt

Oh, aneh. Saya tidak tahu ada yang namanya "pemimpin grup utas" dan saya pikir seharusnya semua utas dalam proses multithread sama dan tidak ada "pemimpin". Salah satu dari mereka dapat keluar dan selama masih ada, prosesnya tidak mati.
psusi

5
  1. Ini menjalankan topperintah dengan beberapa opsi tambahan:

    top -H -b -n 1
    
    • Itu -H menginstruksikan argumen atas untuk menampilkan setiap thread individu. Biasanya atas merangkum semua utas dalam proses induknya.
    • Itu -b Argumen membuat lari top dalam modus batch - informasi yang dikumpulkan, ditampilkan, dan kemudian dibuang ke stdout sebagai lawan berjalan dalam mode interaktif dan menyegarkan data yang ditampilkan.
    • Dengan -bopsi, pengguna harus memberi tahu atas berapa kali untuk menjalankan, ini dilakukan dengan -nargumen dan argumen akhir dengan berapa kali untuk menjalankan.

    Jadi top -H -b -n 1menginstruksikan sistem untuk "menjalankan teratas, menampilkan masing-masing utas, berjalan dalam mode batch, dan hanya berjalan sekali".

  2. The psperintah melaporkan sebuah snapshot dari proses yang sedang berjalan.

    ps -eLf
    

    The -eLfargumen (dapat digunakan sebagai -e -L -fjuga) memecah sebagai berikut:

    • ememberitahu psuntuk menampilkan semua proses terlepas dari siapa yang memilikinya atau status mereka saat ini - aktif, tidur, dijeda, menunggu I / O, dll.
    • Lmemberitahu psuntuk menunjukkan utas individu
    • yang fmemberitahu psuntuk memformat output sebagai full format daftar, dan dalam hubungannya dengan Largumen NLWP (jumlah benang) dan LWP (benang ID) kolom ditambahkan ke output.

1

Pertimbangkan proses dengan PID p1

The task_structobjek dari proses anak akan memiliki PPID (induk PID) sebagai p1, dan itu PID dan TGID set untuk, katakanlah, p2.

The task_structobjek dari benang p1 akan memiliki PID set seperti, katakanlah p3, tapi TGID set untuk p1.


Jadi Anda mengatakan hal yang sama dengan Stephen Kitt , tetapi tidak terlalu jelas. PS Mengapa repot-repot membawa PPID ke dalam diskusi jika Anda tidak akan mengatakan apa itu PPID dari utas?
Scott

PID dan TGID selalu sama.
Tim
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.