Các chương trình được viết kém hoặc thực hiện xấu có thể rời đi quy trình zombie. Lurking bên trong máy tính Linux của bạn. Tìm hiểu làm thế nào zombie được tạo ra, và làm thế nào bạn có thể đặt chúng để nghỉ ngơi.
Làm thế nào các quốc gia quy trình làm việc trên Linux
Linux, tất nhiên, phải theo dõi tất cả các ứng dụng và daemon chạy trên máy tính của bạn. Một trong những cách nó làm việc này bằng cách duy trì bảng quy trình. Đây là một danh sách các cấu trúc trong bộ nhớ kernel. Mỗi quy trình có một mục trong danh sách này chứa một số thông tin về nó.
Không có một thỏa thuận lớn trong mỗi cấu trúc bảng quá trình. Họ giữ xử lý ID , Một vài mục dữ liệu khác và một con trỏ đến khối điều khiển quy trình (PCB) cho quá trình đó.
Đó là PCB chứa nhiều chi tiết Linux cần tra cứu hoặc đặt cho từng quy trình. PCB cũng được cập nhật như một quy trình được tạo, đưa thời gian xử lý và cuối cùng bị phá hủy.
PCB Linux chứa hơn 95 trường.
Nó được xác định
như một cấu trúc được gọi là
TASK_S BƯỚC.H.
, và nó dài hơn 700 dòng. PCB chứa các loại thông tin sau:
- Quy trình nhà nước. : Các trạng thái được mô tả dưới đây.
- QUY TRÌNH SỐ : Mã định danh duy nhất của nó trong hệ điều hành.
- Chương trình truy cập. : Khi quá trình này tiếp theo được truy cập vào CPU, hệ thống sẽ sử dụng địa chỉ này để tìm hướng dẫn tiếp theo của quy trình nên được thực thi.
- Đăng ký : Danh sách các thanh ghi CPU được sử dụng bởi quy trình này. Danh sách có thể chứa tích lũy, đăng ký chỉ mục và con trỏ chồng.
- Mở danh sách tập tin : Các tệp liên quan đến quá trình này.
- Thông tin lập lịch CPU : Được sử dụng để xác định tần suất, và thời gian xử lý CPU được trao cho quá trình này. Ưu tiên của quy trình, con trỏ để lên lịch hàng đợi và các tham số lập lịch khác phải được ghi lại trong PCB.
- Thông tin quản lý bộ nhớ : Chi tiết về bộ nhớ Quá trình này đang sử dụng, chẳng hạn như các địa chỉ bắt đầu và kết thúc của bộ nhớ quá trình và trỏ đến các trang bộ nhớ.
- Thông tin trạng thái I / O : Bất kỳ thiết bị trong hoặc đầu ra được sử dụng bởi quy trình.
"Trạng thái quá trình" có thể là bất kỳ thứ gì sau đây:
- NS: Một quá trình chạy hoặc runnable. Chạy có nghĩa là nó nhận được chu kỳ CPU và thực thi. Một quy trình runnable đã sẵn sàng để chạy và chờ một khe cắm CPU.
- NS: Một quá trình ngủ. Quá trình đang chờ hành động hoàn tất, chẳng hạn như thao tác nội bộ hoặc đầu ra hoặc đối với tài nguyên để có sẵn.
- NS: Quá trình này nằm trong trạng thái ngủ không bị gián đoạn. Nó đang sử dụng một cuộc gọi hệ thống chặn và không thể tiếp tục cho đến khi các cuộc gọi hệ thống đã hoàn tất. Không giống như trạng thái "Ngủ", một quy trình ở trạng thái này sẽ không phản hồi tín hiệu cho đến khi cuộc gọi hệ thống hoàn tất và thực thi đã quay lại quy trình.
-
NS:
Quá trình đã chấm dứt (đã dừng) vì nó đã nhận được
Sigstop.dấu hiệu. Nó sẽ chỉ trả lời đếnSigkill.hoặcSigcont.Tín hiệu, giết chết quá trình hoặc hướng dẫn nó tiếp tục, tương ứng. Đây là những gì đang xảy ra khi bạn trao đổi từ vấn đề xung quanh (fg.) đến lai lịch (bg)nhiệm vụ. -
Z:
Một quá trình zombie. Khi một quá trình hoàn thành, nó không chỉ biến mất. Nó giải phóng bất kỳ bộ nhớ nào đang sử dụng và tự xóa khỏi bộ nhớ, nhưng mục nhập của nó trong bảng xử lý và PCB vẫn còn. Trạng thái của nó được đặt thành
Exit_zombie.và quá trình cha của nó được thông báo (bởiSIGCHLD.tín hiệu) rằng quá trình trẻ em đã hoàn thành.
Trong trạng thái zombie, quá trình cha mẹ gọi một trong những
đợi đã()
gia đình chức năng
khi quá trình trẻ em được tạo ra. Sau đó, nó chờ đợi một sự thay đổi trạng thái trong quá trình trẻ em. Quá trình trẻ em đã bị dừng lại, tiếp tục hoặc bị giết bởi một tín hiệu? Nó đã chấm dứt bằng cách chạy qua việc hoàn thành mã của nó?
Nếu trạng thái thay đổi là một phương tiện có nghĩa là quá trình trẻ em đã ngừng chạy, mã thoát của nó được đọc. Sau đó, PCB của trẻ bị phá hủy và mục nhập của nó trong bảng xử lý được gỡ bỏ. Lý tưởng nhất, tất cả điều này xảy ra trong chớp mắt và các quá trình trong trạng thái zombie không tồn tại rất lâu.
CÓ LIÊN QUAN: Cách chạy và kiểm soát các quy trình nền trên Linux
Điều gì gây ra các quy trình zombie trên Linux?
Một quá trình cha mẹ được viết kém có thể không gọi
đợi đã()
Chức năng khi quá trình con được tạo. Điều này có nghĩa là không có gì là theo dõi các thay đổi trạng thái trong quá trình trẻ em, và
SIGCHLD.
Tín hiệu sẽ bị bỏ qua. Hoặc, có lẽ một ứng dụng khác đang ảnh hưởng đến việc thực hiện quy trình phụ huynh, do chương trình kém hoặc ý định xấu.
Tuy nhiên, nếu quá trình cha mẹ không theo dõi các thay đổi trạng thái trong quá trình trẻ em, việc dọn phòng hệ thống thích hợp sẽ không xảy ra. PCB và mục trong bảng quy trình sẽ không bị xóa khi quá trình trẻ em chấm dứt. Điều này dẫn đến trạng thái zombie không bao giờ bị xóa khỏi PCB.
Zombie sử dụng một chút bộ nhớ, nhưng chúng thường không gây ra vấn đề. Mục nhập trong bảng quy trình nhỏ, nhưng, cho đến khi nó được phát hành, ID tiến trình không thể được sử dụng lại. Trên hệ điều hành 64 bit, không có khả năng gây ra bất kỳ vấn đề nào vì PCB lớn hơn nhiều so với mục nhập bảng quy trình.
Một số lượng lớn zombie có thể, có thể hình dung, ảnh hưởng đến lượng bộ nhớ miễn phí cho các quy trình khác. Tuy nhiên, nếu bạn có nhiều zombie, mặc dù, bạn đã gặp một vấn đề nghiêm trọng với ứng dụng cha mẹ hoặc lỗi hệ điều hành.
Cách loại bỏ các quy trình zombie
Bạn không thể giết một quá trình zombie vì nó đã chết. Nó sẽ không đáp ứng với bất kỳ tín hiệu nào vì nó đã bị xóa khỏi bộ nhớ, không có nơi nào để gửi một
Sigkill.
dấu hiệu. Bạn có thể thử gửi
SIGCHLD.
Tín hiệu cho quy trình phụ huynh, nhưng nếu nó không hoạt động khi quá trình trẻ em bị chấm dứt, nhưng cũng không có khả năng làm việc.
Giải pháp đáng tin cậy duy nhất là tiêu diệt quá trình cha mẹ. Khi nó bị chấm dứt, các quá trình con của nó được di truyền bởi
trong đó
Quá trình, đó là quy trình đầu tiên để chạy trong một hệ thống Linux (ID quy trình của nó là 1).
Các
trong đó
Quá trình thường xuyên thực hiện việc dọn dẹp zombie cần thiết, vì vậy để giết chúng, bạn chỉ cần giết quá trình tạo ra chúng. Các
đứng đầu
Lệnh là một cách thuận tiện để xem nếu bạn có bất kỳ zombie nào.
Gõ như sau:
Top
Hệ thống này có tám quy trình zombie. chúng tôi
có thể liệt kê những thứ này
bằng cách sử dụng.
trước
chỉ huy
và làm hỏng nó vào
egrep.
. Một lần nữa, các quy trình zombie có một lá cờ trạng thái của "Z" và bạn cũng sẽ thấy "không còn tồn tại."
Gõ như sau:
PS AUX | egrep "z | không còn tồn tại
Các quá trình zombie được liệt kê.
Đây là một cách nấu ăn để khám phá ID quy trình của zombie hơn là cuộn qua lại thông qua
đứng đầu
. Chúng ta cũng thấy rằng một ứng dụng có tên "Badprg" đã sinh ra những zombie này.
ID quy trình của Zombie đầu tiên là 7641, nhưng chúng ta cần tìm ID quy trình của quá trình cha. Chúng ta có thể làm như vậy bằng cách sử dụng
lần nữa. Chúng tôi sẽ sử dụng tùy chọn đầu ra (
trước
-
) nói
trước
Để chỉ hiển thị ID tiến trình của cha mẹ, sau đó chuyển nó với
PPID =.
lá cờ.
Quá trình chúng tôi muốn tìm sẽ được chỉ định bằng cách sử dụng
-P
(quy trình) tùy chọn, sau đó chuyển vào ID quy trình của Zombie.
Do đó, chúng tôi nhập lệnh sau để tra cứu thông tin quy trình cho quá trình 7641, nhưng nó sẽ chỉ báo cáo ID của quy trình cha:
PS -O PPID = -P 7641
Chúng tôi đã nói với ID giám sát phụ huynh là 7636. Bây giờ chúng ta có thể tham chiếu chéo này bằng cách sử dụng
trước
một lần nữa.
Chúng tôi thấy điều này phù hợp với tên của quá trình cha mẹ từ trước đó. Để tiêu diệt quy trình phụ huynh, hãy sử dụng tùy chọn SIGKILL với lệnh Kill như sau:
Kill -sigkill 7636
Tùy thuộc vào chủ sở hữu của quá trình cha, bạn cũng có thể cần sử dụng
sudo.
.
Zombie không đáng sợ ...
Trừ khi họ ở trong một đám đông lớn. Một số ít không phải là bất cứ điều gì để lo lắng và một khởi động lại đơn giản sẽ xóa sạch chúng.
Tuy nhiên, nếu bạn nhận thấy rằng một ứng dụng hoặc quy trình luôn gây ra zombie, đó là thứ bạn nên xem xét. Rất có thể chỉ là một chương trình viết chậm, trong trường hợp đó, có lẽ có một phiên bản cập nhật được dọn dẹp đúng cách sau các quá trình con của nó.