Quá trình zombie là gì?


138

Với các lệnh như topvà gui dựa trên System Monitortôi có thể thấy rằng tại thời điểm này tôi có một số quy trình zombie.

Quá trình zombie là gì?

Do chúng ảnh hưởng đến hiệu suất của hệ thống hoặc ứng dụng mà chúng là zombie. Họ có sử dụng quá nhiều bộ nhớ hoặc bất kỳ bộ nhớ nào không?


39
Chúng là các quá trình muốn ăn cpu của bạn;)
Luis Alvarado

8
cho bữa trưa ... :)
RolandiXor

3
Các quá trình này đã chết nhưng không được chôn cất.
Prateek Joshi

2
Ăn CPU của tôi?! Điều đó thực sự đáng sợ!
Håvard Geithus

Câu trả lời:


162

Zombie là quá trình DEAD. Chúng không thể là 'kill' (Bạn không thể giết DEAD). Tất cả các quá trình cuối cùng sẽ chết, và khi chúng làm chúng trở thành zombie. Họ tiêu thụ gần như không có tài nguyên, đó là điều được mong đợi bởi vì họ đã chết! Lý do cho zombie là vì cha mẹ (quá trình) của zombie có thể truy xuất trạng thái thoát của zombie và thống kê sử dụng tài nguyên. Phụ huynh báo hiệu cho hệ điều hành rằng nó không còn cần zombie nữa bằng cách sử dụng một trong các lệnh gọi hệ thống Wait ().

Khi một tiến trình chết, tất cả các tiến trình con của nó trở thành con của tiến trình số 1, đó là tiến trình init. Ban đầu là '`luôn' 'chờ trẻ em chết, để chúng không còn là thây ma.

Nếu bạn có các quy trình zombie, điều đó có nghĩa là những thây ma đó đã không được cha mẹ của chúng chờ đợi (nhìn vào PPID được hiển thị bởi ps -l). Bạn có ba lựa chọn: Khắc phục quy trình cha mẹ (làm cho nó chờ); giết cha mẹ; hoặc sống với nó. Hãy nhớ rằng sống với nó không quá khó vì zombie chiếm ít hơn một dòng phụ trong đầu ra của ps.

Zombie có thể được xác định trong đầu ra từ lệnh Unix Unix bằng sự hiện diện của chữ "Z" trong cột STAT. Zombie tồn tại trong hơn một khoảng thời gian ngắn thường chỉ ra lỗi trong chương trình mẹ. Cũng như các rò rỉ khác, sự hiện diện của một vài zombie không đáng lo ngại, nhưng có thể chỉ ra một vấn đề sẽ trở nên nghiêm trọng dưới tải nặng hơn.

Để loại bỏ zombie khỏi hệ thống, tín hiệu SIGCHLD có thể được gửi đến cha mẹ bằng tay, sử dụng lệnh kill. Nếu tiến trình cha mẹ vẫn từ chối gặt hái zombie, bước tiếp theo sẽ là loại bỏ tiến trình cha. Khi một tiến trình mất cha mẹ của nó, init trở thành cha mẹ mới của nó. Ban đầu định kỳ thực hiện lệnh gọi hệ thống chờ để gặt hái bất kỳ zombie nào với init là cha.

Ngoài ra còn có các quy trình mồ côi là một quy trình máy tính có quá trình cha mẹ đã kết thúc hoặc kết thúc.

Một tiến trình có thể trở thành mồ côi trong quá trình gọi từ xa khi máy khách xử lý sự cố sau khi thực hiện yêu cầu của máy chủ.

Trẻ mồ côi lãng phí tài nguyên máy chủ và có khả năng khiến máy chủ gặp rắc rối (Đây là sự khác biệt lớn nhất về tài nguyên giữa zombie và trẻ mồ côi (Ngoại trừ nếu bạn xem một số phim về zombie mồ côi). Tuy nhiên, có một số giải pháp cho vấn đề quá trình mồ côi:

  1. Hủy diệt là kỹ thuật được sử dụng phổ biến nhất; trong trường hợp này, quá trình mồ côi bị giết.

  2. Tái sinh là một kỹ thuật trong đó máy móc định kỳ cố gắng xác định vị trí cha mẹ của bất kỳ tính toán từ xa nào; tại đó các quá trình mồ côi bị giết.

  3. Hết hạn là một kỹ thuật trong đó mỗi quy trình được phân bổ một lượng thời gian nhất định để hoàn thành trước khi bị giết. Nếu cần là một quá trình có thể "yêu cầu" thêm thời gian để kết thúc trước khi hết thời gian quy định.

Một tiến trình cũng có thể mồ côi chạy trên cùng một máy như tiến trình mẹ của nó. Trong một hệ điều hành giống như UNIX, mọi quy trình mồ côi sẽ ngay lập tức được áp dụng bởi quy trình hệ thống "init" đặc biệt. Hoạt động này được gọi là tái cha mẹ và xảy ra tự động. Mặc dù về mặt kỹ thuật, quy trình này có quy trình "init" là cha mẹ của nó, nó vẫn được gọi là quy trình mồ côi do quy trình ban đầu tạo ra nó không còn tồn tại.

Thêm thông tin:

http://wiki.answers.com/Q/What_is_Zombie_Process_and_Orphan_Process#ixzz1PCN9vojU

http://www.linuxsa.org.au/tips/zombie.html

http://www.brighthub.com/computing/linux/articles/79186.aspx

Làm thế nào để xác định và tiêu diệt quá trình treo, khi hệ thống bị treo và phản ứng chậm với đầu vào của người dùng?

Giết quá trình đang chạy trong máy Ubuntu từ xa từ máy Windows trong mạng LAN


18
Ekhm! Bạn có thể giết chết người! Bạn chỉ cần nhắm vào đầu. Hay họ đã nói dối chúng ta mọi lúc?
Marcin Kaminski

1
initkêu gọi waittất cả các quá trình con của nó là nó, zombie, mồ côi (được nhận nuôi) và sinh học (tự sinh sản)?
Chảy máu ngón tay

1
acc. đến World War Z ngụy trang sử dụng: P
عثمان غني

Xin hãy trao huy chương cho @MarcinK Vitaminki!
Andrea

20

Quá trình zombie (cũng hiển thị dưới dạng <defunct>), không phải là quá trình thực sự. Chúng chỉ là các mục trong bảng quy trình kernel. Đây là tài nguyên duy nhất họ tiêu thụ. Họ không tiêu thụ bất kỳ CPU hoặc RAM. Nguy cơ duy nhất của việc có zombie là hết không gian trong bảng quy trình (bạn có thể sử dụng cat /proc/sys/kernel/threads-maxđể xem có bao nhiêu mục được phép trên hệ thống của mình).

Chúng chỉ xuất hiện khi tiến trình cha mẹ của chúng (tức là quá trình mà fork()'edchúng) còn sống, nhưng chưa gọi wait()chức năng hệ thống. Khi cha mẹ chết, thây ma là wait()'eddo initvà biến mất.


4
Các top'ảnh chụp màn hình trong câu hỏi này dường như mâu thuẫn với bạn? Ở đó, zombie dường như sử dụng 100% của 1 CPU, nhưng không có bộ nhớ.
Torben Gundtofte-Bruun

7

Khi child processchấm dứt, cái chết của nó được thông báo cho cha mẹ của nó để cha mẹ có thể thực hiện một số hành động thích hợp.

Một processcái đang chờ cha mẹ của nó chấp nhận mã trả về của nó được gọi là quá trình zombie .

Họ có completed their executionnhưng vẫn có một entrytrong process table.


1

Các quy trình zombie là các quy trình đã ngừng chạy nhưng mục nhập bảng quy trình của chúng vẫn tồn tại do quy trình cha mẹ đã không truy xuất được thông qua tòa nhà chờ. Về mặt kỹ thuật, mỗi quá trình chấm dứt là một thây ma trong một khoảng thời gian rất ngắn nhưng chúng có thể sống lâu hơn.

Các quá trình zombie tồn tại lâu hơn xảy ra khi các tiến trình cha mẹ không gọi tòa nhà chờ đợi sau khi quá trình con kết thúc. Một tình huống xảy ra là khi quy trình cha mẹ được viết kém và chỉ đơn giản là bỏ qua cuộc gọi chờ hoặc khi quy trình cha mẹ chết trước khi đứa trẻ và quy trình cha mẹ mới không gọi chờ. Khi cha mẹ của một tiến trình chết trước đứa trẻ, HĐH sẽ gán tiến trình con cho quá trình "init" hoặc PID 1. tức là quá trình init "thông qua" tiến trình con và trở thành cha mẹ của nó. Điều này có nghĩa là bây giờ khi tiến trình con thoát khỏi cha mẹ mới (init) phải gọi waitto lấy mã thoát của nó hoặc mục nhập bảng quy trình của nó vẫn tồn tại mãi mãi và nó trở thành zombie

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.