init process: tổ tiên của tất cả các process?


26

Tôi đã luôn học được rằng quá trình init là tổ tiên của tất cả các tiến trình. Tại sao quá trình 2 có PPID bằng 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]

Câu trả lời:


32

Đầu tiên, tổ tiên của người Hồi giáo không giống với cha mẹ của Google. Tổ tiên có thể là cha mẹ cha mẹ của cha mẹ và hạt nhân chỉ theo dõi một cấp độ. Tuy nhiên, khi một tiến trình chết, con của nó được áp dụng bởi init, vì vậy bạn sẽ thấy rất nhiều tiến trình có cha mẹ là 1 trên một hệ thống điển hình.

Ngoài ra, các hệ thống Linux hiện đại cũng có một vài quy trình thực thi mã hạt nhân, nhưng được quản lý theo quy trình của người dùng, liên quan đến lập lịch. (Chúng không tuân theo các quy tắc quản lý bộ nhớ thông thường vì chúng đang chạy mã hạt nhân.) Các quy trình này đều được sinh ra bởi kthreadd(đó là init của các luồng nhân). Bạn có thể nhận ra chúng bằng ID tiến trình cha mẹ của chúng (2) hoặc, thông thường, bằng cách psliệt kê chúng với một tên giữa dấu ngoặc vuông hoặc bởi thực tế /proc/2/exe(thông thường một liên kết tượng trưng đến quá trình thực thi quy trình) không thể đọc được.

Các quy trình 1 ( init) và 2 ( kthreadd) được tạo trực tiếp bởi kernel khi khởi động, vì vậy chúng không có cha mẹ. Giá trị 0 được sử dụng trong trường ppid của chúng để chỉ ra điều đó. Hãy nghĩ về 0 có nghĩa là bản thân hạt nhân bản thân ở đây.

Linux cũng có một số phương tiện cho kernel để bắt đầu các tiến trình của người dùng có vị trí được chỉ định thông qua tham số sysctl trong một số trường hợp nhất định. Ví dụ, hạt nhân có thể kích hoạt các sự kiện tải mô-đun (ví dụ: khi phần cứng mới được phát hiện hoặc khi một số giao thức mạng được sử dụng lần đầu tiên) bằng cách gọi chương trình trong kernel.modprobegiá trị sysctl. Khi một chương trình bỏ lõi, kernel gọi chương trình được chỉ định bởi kernel.core_patternnếu có.


1
Vậy initlà "tổ tiên" của tất cả user threads, trong khi đó [kthreadd ]là "cha mẹ" của tất cả kernel threads, phải không? Cám ơn!
Nan Xiao

1
@NanXiao Chủ yếu, vâng. Như tôi đã đề cập trong đoạn cuối của mình, có một vài cách khác để các tiến trình của người dùng được khởi động bởi kernel, ví dụ chương trình được liệt kê kernel.core_patternkhi chương trình bỏ lõi. Trên một hệ thống điển hình, bạn sẽ không thấy chúng vì các quy trình đó có xu hướng thực hiện công việc của chúng một cách nhanh chóng và sau đó thoát.
Gilles 'SO- ngừng trở thành ác quỷ'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.