2010-10-04 42 views
12

Tôi có một số câu hỏi về quy trình zombieQuy trình Zombie

  • lợi ích của khái niệm quá trình zombie là gì?
  • biết rằng hạt nhân giữ (PID, trạng thái chấm dứt, thông tin sử dụng tài nguyên) cho quá trình zombie
    ý nghĩa của "thông tin sử dụng tài nguyên"
  • cách zombie của PPID() = 1 và nó vẫn zombie là gì, (init gặt Zombies vì ​​nó chờ() theo mặc định)
    bất kỳ ai có thể viết một số mã C để tạo một zombie là cha mẹ của nó là Init?
  • zombie có thể từ chối phát hành một số khóa trên bộ nhớ không ??

cảm ơn trước

+0

Thuộc về superuser.com –

+10

@Paul R Tôi không nghĩ vậy, những thứ này có trong lập trình hệ thống. – Searock

Trả lời

12

- những lợi ích từ khái niệm quá trình zombie?

Quá trình zombie chỉ là một pid, trạng thái thoát và một số thông tin kế toán nằm xung quanh cho đến khi cha mẹ sử dụng một trong các họ gọi hệ thống wait để có trạng thái cuối cùng. Cho đến khi cha mẹ gọi số wait, ID quá trình của trẻ phải được đánh dấu là đã sử dụng để không có quá trình nào khác có thể được chỉ định. Nếu một quá trình khác được giao một pid tái chế thì sẽ rất khó để nói sự khác biệt giữa nó và các tiến trình trước đó có cùng pid đó. Khi wait được cha mẹ gọi và trả về trạng thái thoát cuối cùng, có thể giả định rằng sẽ không có ai tìm kiếm đứa trẻ ở đó nữa, do đó, bây giờ pid có thể được sử dụng lại. (Tôi nghĩ rằng trên Linux nếu cha mẹ rời SIGCHLD là SIG_IGN hạt nhân sẽ không giữ zombie xung quanh, nhưng việc đăng ký lại SIGCHLD là SIG_IGN không có cùng tác dụng)

- biết rằng hạt nhân giữ (PID , tình trạng chấm dứt, sử dụng tài nguyên thông tin) cho quá trình zombie ý nghĩa của "thông tin sử dụng tài nguyên"

một số thông tin này là những gì chạy một chương trình như là những gì:

time my_program 

sẽ báo cáo. Các giá trị này thường được báo cáo trong cấu trúc siginfo cho SIGCHLD (không chính xác là một cuộc gọi tới wait) nhưng cũng có sẵn từ một cuộc gọi đến dạng gọi systme waitid (trên một số hệ thống). Hãy xem man sigaction để biết thông tin về cấu trúc này.

- làm thế nào PPID zombie của() = 1 và nó vẫn zombie, (init gặt Zombies vì ​​nó chờ đợi() theo mặc định)

Một zombie có ppid = 1 không nên ở một zombie cho rất dài vì init sẽ gặt hái nó khá nhanh chóng. Một quá trình sẽ vẫn là một zombie từ một điểm ngay sau khi nó chết (hoặc thông qua exit hoặc bởi một tín hiệu unhanded giết chết nó) cho đến khi cha mẹ gọi wait và nhận được tình trạng cuối cùng của nó. Điều này có nghĩa là ngay cả khi init không làm gì ngoài việc gọi init và hơn nữa, có thể có một khoảng thời gian nhỏ mà một quá trình có thể xuất hiện như một zombie.Nếu các quá trình hiển thị dưới dạng con của init (0 = ppid) trong một khoảng thời gian dài (giây) thì có thể có sự cố.

- bất kỳ ai có thể viết một số mã C để tạo ra một zombie là cha mẹ của nó là Init?

Đây không phải là rõ ràng, nhưng tôi nghĩ rằng bạn muốn:

pid_t f = fork(); 
if (f > 0) { 
    exit(0); // this is the parent dying, so the child will be an orphan 
      // and get adopted by init 
} else if (f == 0) { 
    sleep(100); // This is the child doing something that takes enough time for 
       // its parent to commit suicide (exit(0)) and then for you to 
       // observe that it has now been adopted by init 
    exit(0); // And now it dyes as well, so init should reap its status, but 
       // it may be a zombie for a short amount of time first. 
} else /* error condition would be handled here */ 

- zombie có thể từ chối để phát hành một số khóa trên bộ nhớ ??

Zombies không thể nắm giữ nhiều thứ. Họ mất tất cả các trang bộ nhớ của họ, mở xử lý tập tin, ... vv. Khá nhiều thứ mà hệ điều hành có thể tìm ra cách giải phóng nên được giải phóng. Nó sẽ là một lỗi không, nhưng hãy nhớ rằng hệ điều hành phải biết rằng nó là cái gì đó được cho là sẽ được giải thoát. Nó rất dễ dàng để tạo ra các tài nguyên trong không gian người dùng cần được giải phóng khi một chương trình chết mà hệ điều hành không biết được cho là sẽ được giải thoát.

+0

nhìn @ này và bạn sẽ biết ý nghĩa của tôi về điểm 3 http://stackoverflow.com/questions/1907775/init-never-reaping-zombie-defunct-processes – Aboelnour

+3

@Aboelnour: Có một hoặc nhiều lỗi trong hạt nhân hoặc _init_ trên hệ thống đã được chạy, vì một số lý do _init_ đã chết (tôi không biết điều gì sẽ xảy ra nếu _init_ chết), root đã gửi 'SIGSTP' tới _init_, hoặc _init_ đang chạy cực kỳ chậm. Điều đó không được cho là xảy ra. – nategoose

3

Một quá trình zombie hoàn toàn là một giá trị tình trạng pid và thoát. Pid không thể được giải phóng vì tài nguyên (pid) "thuộc về" cha mẹ. Nếu nó được phát hành, một quá trình khác có thể được gán cùng một pid, và sau đó cha mẹ có thể sẽ gửi tín hiệu đến một quá trình không liên quan; ngay cả khi cha mẹ lần đầu tiên chờ đợi để xác định xem đứa trẻ đã thoát khỏi, sẽ không có cách nào để tránh điều kiện chủng tộc.

+0

... Tôi nghĩ rằng tôi đang thiếu một cái gì đó. Định nghĩa của một quá trình zombie mà bạn đang làm việc là gì? –

+2

Quy trình con đã hết nhưng có cha mẹ không nhận được thông báo về trạng thái thoát thông qua 'waitpid' hoặc giao diện tương tự. –

+0

Ahh, vâng. Lấy làm tiếc. Tôi chỉ nhận ra rằng tôi tiếp tục đọc "zombie" và đang nghĩ "mồ côi". Cảm ơn. –

2

Nếu bạn quan tâm đến chứng kiến ​​quá trình zombie trong một danh sách các tiến trình đang chạy sử dụng này:

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 

int main(void) 
{ 
    pid_t p = fork(); // creates child process and stores the returned PID 

    if (p != 0)   // executed by parent process 
    { sleep(1);  /* the child process terminates while the parent process sleeps, 
          the child then becomes a zombie process because the returned status 
          of the terminated child process isn't checked via a wait() */ 

     system("ps -eo pid,ppid,stat,cmd"); // prints a list of processes in your terminal 

    } 
    else  // executed by child process 
    { 
     exit(0);  // the child process terminates immediately 
    } 

    return 0; 
} 

Bạn có thể xác định các quá trình zombie bằng Z + trong danh sách:

screenshot of the zombie process

LƯU Ý: bạn sẽ phải sửa đổi mã nếu bạn đang sử dụng các cửa sổ.

Các vấn đề liên quan