Tại sao các giá trị PID không liên tục?


14

Nếu chúng ta gõ ps -efthì chúng ta sẽ có một danh sách các quy trình. Tại sao các số PID không liên tục?

Câu trả lời:


16

Trên Ubuntu chúng liên tục. Trên các hệ điều hành khác, nó có thể khác nhau.

Hạt nhân phân bổ các PID trong phạm vi (RESERVED_PIDS, PID_MAX_DEFAULT). Nó thực hiện tuần tự trong từng không gian tên (các tác vụ trong các không gian tên khác nhau có thể có cùng ID). Trong trường hợp phạm vi đã cạn kiệt, pid gán kết thúc tốt đẹp.

( /programming/3446727/how-does-linux-determine-the-next-pid )

Mặc dù ...

  • Lập lịch trình hạt nhân có thể rẽ nhánh một quá trình để nó có thể bỏ qua các số.
  • Một PID sẽ biến mất khi nhiệm vụ đó kết thúc.
  • Các PID không được sử dụng lại cho đến khi đạt được PID_MAX_DEFAULT.
  • Một PID máy chủ được bỏ qua.

Một số chủ đề trên stackoverflow:

Trong các ý kiến ​​là một lệnh để kiểm tra sự ám sát của các PID:

for i in {1..20}; do sh -c 'echo $$'; done

"Lập lịch hạt nhân có thể rẽ nhánh một quá trình để nó có thể bỏ qua các số." - kernel có thể tạo một tiến trình trong khi xác định tiến trình nào sẽ chạy? Điều đó có vẻ kỳ lạ.
dùng253751

Nó là khá phổ biến cho bộ lập lịch để rẽ nhánh một quá trình. Có thể là bit này: lxr.free-electrons.com/source/kernel/pid.c#L125 đang xác định nó :)
Rinzwind

8

ID tiến trình bị thiếu ở giữa đã chết và các PID của chúng sẽ được sử dụng lại bởi kernel trong các quy trình sau.

Các quy trình chết sẽ không được hiển thị trong bảng quy trình (ngoại trừ zombie), do đó ps -efsẽ không hiển thị chúng.


3

Thông thường PID là liên tục nhưng một số quá trình sẽ chết chỉ khi bạn chạy lệnh ps -ef.

Ngoài ra một số quy trình có thể chỉ là một quy trình con của một quy trình khác không được hiển thị trong ps -eflệnh. Để xem một số kết quả mở rộng và bạn có thể kiểm tra PID liên tục, sử dụngpstree

pstree -p

Đầu ra mẫu:

   ├─teamviewerd(3468)─┬─{teamviewerd}(3474)
│                   ├─{teamviewerd}(3475)
│                   ├─{teamviewerd}(3476)
│                   ├─{teamviewerd}(3477)
│                   ├─{teamviewerd}(3478)

Trong khi nếu bạn chạy, ps -efbạn chỉ thấy quá trình cha.

$ ps -ef | grep teamviewerd
root      3468     1  0 Jul15 ?        00:07:38 /opt/teamviewer9/tv_bin/teamviewerd -f

2

Họ liên tục. PID được chỉ định theo thứ tự cho đến khi đạt đến giới hạn tối đa. Sau giới hạn này, nó sẽ bắt đầu lại từ số không.

Vì vậy, chỉ có các PID bị thiếu trong ps -efcác quá trình chết. Lưu ý rằng ps -efchỉ liệt kê các quy trình đang chạy.

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.