GNU/Linux >> Belajar Linux >  >> Linux

Organisasi internal (berkaitan dengan hubungan keluarga) dari proses di Linux

fork() membuat proses baru dengan menyalin deskriptor proses. Oleh karena itu, kedua proses tersebut berbagi (setidaknya pada awalnya) beberapa data, tetapi segera setelah satu proses mulai berubah itu, mekanisme copy-on-write memastikan perubahan dilokalkan hanya untuk proses yang benar-benar membuatnya. Ini adalah mekanisme standar untuk pemijahan proses di UNIX.

Ini tentu saja menciptakan hubungan induk-anak yang agak alami antar proses, namun ini tidak tergantung pada representasi internal di dalam kernel. Deskriptor proses dapat diimplementasikan sebagai daftar tertaut, pohon, tabel hash atau struktur lain (kurang lebih) yang sesuai. Semua yang benar-benar dibutuhkan adalah tempat di deskriptor proses kernel yang menunjuk ke proses induk (dan mungkin juga proses anak). Apakah itu digunakan atau tidak sebagai bagian penting dari struktur adalah keputusan desain. Salah satu dari banyak hal yang berperan saat memutuskan hal seperti itu adalah misalnya apa yang terjadi setelah proses induk keluar - pada UNIX init proses mengadopsi proses tanpa induk (dengan semua proses turunannya).


Kebingungan Anda berasal dari pencampuran dua hal:(1) menjaga deskriptor proses tetap teratur, dan (2) hubungan orang tua/anak.

Anda tidak memerlukan hubungan induk/anak untuk memutuskan proses mana yang akan dijalankan selanjutnya, atau (secara umum) proses mana yang akan dikirimi sinyal. Jadi, task_struct Linux (yang saya temukan di linux/sched.h untuk sumber kernel 3.11.5) memiliki:

struct task_struct __rcu *real_parent; /* real parent process */
struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */
/*
 * children/sibling forms the list of my natural children
 */

struct list_head children;  /* list of my children */
struct list_head sibling;   /* linkage in my parent's children list */

Anda benar, struktur pohon ada untuk hubungan anak/induk, tetapi tampaknya tersembunyi di daftar lain, dan penunjuk ke induk.

Daftar tertaut ganda yang terkenal tidak terlihat jelas di 3.11.5 struct task_struct definisi struktur. Jika saya membaca kode dengan benar, elemen struct yang tidak diberi komentar struct list_head tasks; adalah daftar tertaut ganda "pengorganisasian", tetapi saya bisa saja salah.


Linux
  1. 30 Latihan Proses Linux Untuk Sysadmin

  2. Linux – Proses Init:Leluhur Semua Proses?

  3. UNIX / Linux:3 Cara Mengirim Sinyal ke Proses

  1. Mengelola proses di Linux dengan kill dan killall

  2. Proses UNIX / Linux:C fork() Fungsi

  3. Linux:Temukan dan Bunuh Proses Zombie

  1. Bagaimana Cara Membunuh Proses di Linux? Perintah untuk Mengakhiri

  2. Cara Mendaftar Proses yang Berjalan di Linux

  3. Perintah Ps di Linux (Mendaftar Proses)