Giá trị tối đa của ID tiến trình là gì?


42

Giá trị tối đa của ID tiến trình là gì?

Ngoài ra, có thể thay đổi ID tiến trình không?

Câu trả lời:


61

Trên Linux, bạn có thể tìm thấy giá trị PID tối đa cho hệ thống của mình bằng cách này:

$ cat /proc/sys/kernel/pid_max

Giá trị này cũng có thể được ghi bằng cùng một tệp, tuy nhiên giá trị chỉ có thể được mở rộng tối đa theo lý thuyết là 32768 cho các hệ thống 32 bit hoặc 4194304 cho 64 bit:

$ echo 32768 > /proc/sys/kernel/pid_max

Dường như đó là thông lệ quy tắc trên hầu hết các hệ thống 64 bit để đặt giá trị này thành cùng giá trị như được tìm thấy trên các hệ thống 32 bit, nhưng đây là theo quy ước chứ không phải là một yêu cầu.

Từ man 5 proc:

/proc/sys/kernel/pid_max  
  This file (new in Linux 2.5) specifies the value at which PIDs wrap around
  (i.e., the value in this file is one greater than the maximum PID). The
  default value for this file, 32768, results in the same range of PIDs as
  on earlier kernels. On 32-bit platfroms, 32768 is the maximum value for
  pid_max. On 64-bit systems, pid_max can be set to any value up to 2^22
  (PID_MAX_LIMIT, approximately 4 million).

Và không, bạn không thể thay đổi PID của một tiến trình đang chạy. Nó được gán dưới dạng số liên tiếp bởi kernel tại thời điểm quá trình bắt đầu và đó là định danh từ lúc đó. Điều duy nhất bạn có thể làm để có được một cái mới là mã của bạn rẽ nhánh một quy trình mới và chấm dứt quy trình cũ.


và chúng ta có thể chắc chắn về các bit kernel với điều này
Aquarius Power

2
Một ví dụ bán mẫu gây tò mò cho câu chuyện "không thể thay đổi PID" là trường hợp của một chương trình đa luồng, trong đó một trong các luồng phụ trợ thực hiện một exec (). Nó phủ lên toàn bộ quá trình, nhưng thay đổi PID (thành TID của luồng thực thi).
fche

3
Giá trị tối đa của một bộ vi xử lý cho máy 32 bit là 32767, không phải 32768. 0 là bộ lập lịch và 1 là init, sau đó quá trình người dùng nhận được 2 đến 32767.

2
user129258 là đúng, và phù hợp với cả trang hướng dẫn và tài liệu kernel. Các tối đa cho phép giá trị của một PID , theo yêu cầu của câu hỏi, là một trong ít hơn giá trị ở chỗ pseudo-file.
JdeBP

1
@ user129258, điều này chỉ giữ nếu bạn đang sử dụng init. Luôn có khả năng khởi động trực tiếp vào hệ vỏ, giả sử busybox và thực hiện thủ công từ đó mà không cần kiểm soát công việc. Hoặc thậm chí có một số đoạn mã khởi động và thả trở lại vỏ. Trong mọi trường hợp, shell sẽ là PID 1 trong trường hợp như vậy.
Tim

9

Những câu trả lời khác đã giải thích

  • /proc/sys/kernel/pid_max cho Linux và
  • 99999 cho FreeBSD

Nhưng câu hỏi không chỉ định một hệ điều hành. Vì vậy, đây là một số người khác:

  • Trên Solaris, giá trị tối đa của ID tiến trình là một tham số có thể điều chỉnh kernel - pidmaxtrong /etc/system- mặc định là 30.000 và có thể được đặt ở bất kỳ đâu trong khoảng từ 266 đến 999.999. Lưu ý rằng đây không phải max_nprocslà một tham số có thể điều chỉnh kernel với chức năng khác biệt tinh tế.
  • Trên HP-UX 10, các bộ điều chỉnh hạt nhân được đặt tên process_id_minprocess_id_maxquy định phạm vi ID quy trình được phép.
  • Trên AIX, ID tiến trình bao gồm một số trường, bao gồm "vị trí quy trình" và trường "đếm thế hệ". Giá trị tối đa có thể là 0x03FFFFFE, vì các trường chỉ chiếm 26 bit dưới cùng của một số nguyên và bit # 0 luôn bằng 0 ngoại trừ quá trình # 1.
  • Trên OpenBSD tối đa là 32766.
  • Trên NetBSD tối đa là 30000.

Kể từ OpenBSD 6.5, mức tối đa bây giờ là 99999 theo giới thiệu (2), không phải 32766.
Kaiepi

4

Trên FreeBSD, giá trị của PID nằm trong khoảng từ 0 đến 99999 theo intro(2)(liên kết) . Đây là một trích dẫn từ hướng dẫn:

Xử lý ID.
Mỗi quy trình hoạt động trong hệ thống được xác định duy nhất bởi một số nguyên không âm được gọi là ID quy trình. Phạm vi của ID này là từ 0 đến 99999.

Nếu bạn muốn tự đọc mã nguồn thì PID_MAXđược định nghĩa trong sys/sys/proc.h(link) .

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.