Linux xử lý quá trình zombie như thế nào


12

Các quy trình zombie được tạo ra trong các hệ thống Unix / Linux. Chúng ta có thể loại bỏ chúng thông qua killlệnh.

Nhưng có bất kỳ cơ chế dọn dẹp tích hợp nào trong Linux để xử lý các tiến trình zombie không?

Câu trả lời:


18

Quá trình zombie đã chết. Bạn không thể giết chúng. Các killlệnh hoặc hệ thống gọi không ảnh hưởng đến quá trình zombie. (Bạn có thể khiến zombie biến mất kill, nhưng bạn phải bắn cha mẹ, không phải zombie, như chúng ta sẽ thấy trong một phút.)

Một quá trình zombie không thực sự là một quá trình, nó chỉ là một mục trong bảng quy trình. Không có tài nguyên nào khác liên quan đến quá trình zombie: nó không có bất kỳ bộ nhớ hoặc bất kỳ mã đang chạy nào, nó không giữ bất kỳ tệp nào mở, v.v.

Khi một quá trình chết, điều cuối cùng sẽ xảy ra, sau khi tất cả các tài nguyên khác được dọn sạch, là mục trong bảng quy trình. Mục nhập này được giữ xung quanh, tạo thành một thây ma, để cho phép quá trình cha mẹ theo dõi trạng thái thoát của trẻ. Phụ huynh đọc trạng thái thoát bằng cách gọi một trong các waitgia đình của tòa nhà; tại thời điểm này, zombie biến mất. Gọi điện waitđược cho là để gặt hái đứa trẻ, mở rộng phép ẩn dụ của một thây ma đã chết nhưng theo một cách nào đó vẫn chưa được xử lý hoàn toàn sang thế giới bên kia. Phụ huynh cũng có thể chỉ ra rằng nó không quan tâm (bằng cách bỏ qua tín hiệu SIGCHLD hoặc bằng cách gọi sigactionvới SA_NOCLDWAITcờ), trong trường hợp đó, mục trong bảng quy trình sẽ bị xóa ngay lập tức khi đứa trẻ chết.

Do đó, zombie chỉ tồn tại khi một quá trình đã chết và cha mẹ của nó chưa được gọi wait. Trạng thái này chỉ có thể tồn tại chừng nào cha mẹ vẫn đang chạy. Nếu cha mẹ chết trước khi đứa trẻ hoặc chết mà không đọc trạng thái của con, quy trình cha mẹ của zombie được đặt thành quy trình với PID 1 init. Một trong những công việc của initlà gọi waitmột vòng lặp và do đó gặt hái bất kỳ quá trình zombie nào bị bỏ lại bởi cha mẹ của nó.


6

Bạn không phải killlà một quá trình zombie, vì nó đã chết.

Quá trình zombie phải được chỉnh sửa waitbởi cha mẹ của chúng, để thu thập trạng thái thoát của chúng.

"Cơ chế dọn dẹp tích hợp" duy nhất có trong Linux, hoạt động trong trường hợp bất kỳ quy trình cha mẹ nào cũng chết trước khi nó thu thập trạng thái thoát của con cái nó. Trong trường hợp này, mỗi đứa trẻ được kế thừa bởi initquá trình, nó sẽ waittrên đứa trẻ, thu thập trạng thái thoát của nó và loại bỏ mục nhập của nó trong bảng quy trình.


3

Ngay khi cha mẹ của một quá trình chết đi, quá trình đó trở thành một đứa trẻ mồ côi - không quan tâm đến việc nó có phải là zombie hay không. Điều gì xảy ra với trẻ mồ côi? Họ nhận được một cha mẹ mới, được gọi init. initsẽ waittrên mỗi đứa trẻ mồ côi mà nó thu thập được, do đó gặt hái được đứa trẻ mồ côi (đó cũng có thể là một thây ma).


1
Không chính xác, initkhông giết bất kỳ quá trình. Nó chỉ waits trên con của nó để thu thập trạng thái của họ.
chrk

1
@chrk, Philipp: thuật ngữ thông thường là gặt hái .
Gilles 'SO- ngừng trở nên xấu xa'

1

Không, không có cơ chế làm sạch tích hợp cho zombie. Zombie đến thiên đường zombie một khi cha mẹ của chúng bị giết. Cho đến lúc đó, HĐH giữ cho họ trả lại trạng thái thoát cho cha mẹ.


vì vậy .. không phải điều này có ảnh hưởng tiêu cực của bộ nhớ vv?

1
Thật ra, khi cha mẹ của thây ma chết, initquá trình này sẽ diễn ra và sẽ gọi wait

Không, tất cả các tài nguyên được phân bổ cho quy trình được giải phóng, ngoại trừ mục nhập trong bảng quy trình.
unxnut
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.