Quá trình Zombie sẽ không có bất kỳ ảnh hưởng nào đến hiệu suất hoặc sự chậm chạp vì quá trình Zombie không sử dụng bất kỳ tài nguyên hệ thống nào.
Lưu ý: - Thực tế, nó vẫn đang sử dụng PID (vốn là tài nguyên giới hạn) và cấu trúc dữ liệu kernel cho quy trình vẫn được phân bổ. Thông thường, điều này sẽ không quan trọng lắm, nhưng việc sử dụng bộ nhớ kernel có thể có ý nghĩa đối với các hệ thống có bộ nhớ rất hạn chế.
Vấn đề gây ra bởi quá trình zombie
Mỗi quá trình zombie giữ lại ID tiến trình của nó. Các hệ thống Linux có số lượng ID quy trình hữu hạn - 32767 theo mặc định trên các hệ thống 32 bit. Nếu zombie được tích lũy với tốc độ rất nhanh, toàn bộ nhóm các PID có sẵn cuối cùng sẽ được gán cho các quy trình zombie, ngăn các quá trình khác khởi chạy.
Lưu ý : Trên các hệ thống 64 bit, bạn có thể tăng mức tối đa PID, xem /unix//a/16884/170373
Tuy nhiên, một vài quy trình zombie treo xung quanh không có vấn đề gì - mặc dù chúng chỉ ra lỗi với quy trình cha mẹ của chúng trên hệ thống của bạn.
Giải trình:
Khi một tiến trình chết trên Linux, nó không bị xóa khỏi bộ nhớ ngay lập tức - bộ mô tả quy trình của nó vẫn nằm trong bộ nhớ.
Trạng thái của quá trình trở thành EXIT_ZOMBIE
và cha mẹ của quá trình được thông báo rằng tiến trình con của nó đã chết với SIGCHLD
tín hiệu.
Quá trình cha sau đó được cho là thực hiện lệnh gọi hệ thống Wait () để đọc trạng thái thoát của tiến trình chết và các thông tin khác. Điều này cho phép tiến trình cha mẹ lấy thông tin từ tiến trình chết. Sau khi Wait () được gọi, quá trình zombie hoàn toàn bị xóa khỏi bộ nhớ.
Điều này thường xảy ra rất nhanh, vì vậy bạn sẽ không thấy các quá trình zombie tích lũy trên hệ thống của mình. Tuy nhiên, nếu một quy trình cha mẹ không được lập trình đúng và không bao giờ gọi chờ (), những đứa trẻ zombie của nó sẽ lưu lại trong bộ nhớ cho đến khi chúng được dọn sạch.
Nghị quyết:
Bạn không thể tiêu diệt các quy trình zombie vì bạn có thể tiêu diệt các quy trình thông thường bằng tín hiệu SIGKILL - các quy trình zombie đã chết.
Một cách để tiêu diệt zombie là gửi tín hiệu SIGCHLD đến tiến trình cha. Tín hiệu này cho biết quá trình cha mẹ thực hiện lệnh gọi hệ thống Wait () và dọn sạch các zombie con của nó. Gửi tín hiệu bằng lệnh kill, thay thế pid trong lệnh bên dưới bằng PID của tiến trình cha:
kill -s SIGCHLD pid
Khi quá trình tạo ra zombie kết thúc, init sẽ thừa hưởng các quá trình zombie và trở thành cha mẹ mới của chúng. (init là quá trình đầu tiên được khởi động trên Linux khi khởi động và được gán PID 1.)
Lưu ý: - Từ Linux 3.4 trở đi, các quy trình có thể thực hiện lệnh gọi hệ thống prctl () với tùy chọn PR_SET_CHILD_SUBREAPER và kết quả là chúng, chứ không phải xử lý # 1, sẽ trở thành cha mẹ của các quá trình hậu duệ mồ côi của chúng. Tham khảo: /unix//a/177361/5132
INIT sau đó thực hiện lệnh gọi hệ thống Wait () để dọn sạch lũ zombie của nó, do đó init sẽ tạo ra các tác phẩm ngắn của zombie. Bạn có thể khởi động lại quá trình cha sau khi đóng nó.