Proses init: leluhur semua proses?

26

Saya selalu belajar bahwa proses init adalah nenek moyang dari semua proses. Mengapa proses 2 memiliki PPID 0?

$ ps -ef | head -n 3
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 May14 ?        00:00:01 /sbin/init
root         2     0  0 May14 ?        00:00:00 [kthreadd]
Mathieu Larose
sumber

Jawaban:

32

Pertama, "leluhur" tidak sama dengan "orangtua". Nenek moyang dapat menjadi ... induk orangtua, orangtua, dan kernel hanya melacak satu level. Namun, ketika suatu proses mati, anak-anaknya diadopsi oleh init, sehingga Anda akan melihat banyak proses yang orang tuanya 1 pada sistem yang khas.

Sistem Linux modern juga memiliki beberapa proses yang mengeksekusi kode kernel, tetapi dikelola sebagai proses pengguna, sejauh menyangkut penjadwalan. (Mereka tidak mematuhi aturan manajemen memori yang biasa karena mereka menjalankan kode kernel.) Semua proses ini dihasilkan oleh kthreadd(itu adalah init dari utas-utas kernel). Anda dapat mengenalinya dengan ID proses induknya (2) atau, biasanya, dengan fakta bahwa psdaftar mereka dengan nama antara tanda kurung siku atau dengan fakta bahwa /proc/2/exe(biasanya tautan simbolis ke proses yang dapat dieksekusi) tidak dapat dibaca.

Proses 1 ( init) dan 2 ( kthreadd) dibuat langsung oleh kernel pada saat boot, sehingga mereka tidak memiliki orangtua. Nilai 0 digunakan di bidang ppid mereka untuk menunjukkan itu. Anggap 0 berarti “kernel itu sendiri” di sini.

Linux juga memiliki beberapa fasilitas untuk kernel untuk memulai proses pengguna yang lokasinya ditunjukkan melalui parameter sysctl dalam keadaan tertentu. Sebagai contoh, kernel dapat memicu peristiwa pemuatan modul (misalnya ketika perangkat keras baru ditemukan, atau ketika beberapa protokol jaringan pertama kali digunakan) dengan memanggil program dalam nilai kernel.modprobesysctl. Ketika sebuah program membuang inti, kernel memanggil program yang ditunjukkan oleh kernel.core_patternjika ada.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Jadi, initapakah "leluhur" dari semua user threads, sedangkan [kthreadd ]"orangtua" dari semua kernel threads, kan? Terima kasih!
Nan Xiao
1
@NanXiao Sebagian besar, ya. Seperti yang saya sebutkan di paragraf terakhir saya, ada beberapa cara lain untuk memulai proses pengguna oleh kernel, misalnya program yang terdaftar kernel.core_patternketika sebuah program membuang inti. Pada sistem tipikal, Anda tidak akan melihatnya karena proses tersebut cenderung melakukan tugasnya dengan cepat dan kemudian keluar.
Gilles 'SANGAT berhenti menjadi jahat'