Điều gì xảy ra khi bạn hết PID?


8

Đây là một câu hỏi hoàn toàn học tập, bởi vì điều này sẽ không bao giờ xảy ra.

Nếu một PID được lưu trữ dưới dạng pid_t và không phải là một loại chính xác tùy ý, thì có một giới hạn đối với số lượng PID có thể tồn tại cùng một lúc. Có một hành vi được xác định cho khi tràn PID?

Quá trình thứ 65536 sẽ giết / sbin / init và tạo kernel hoảng loạn? Hoặc có một số biện pháp an toàn tại chỗ?


2
stackoverflow.com/questions/6294133/maximum-pid-in-linux Tôi đoán bạn có thể thay đổi giá trị tối đa và tìm hiểu;)

2
Các số thấp hơn được sử dụng lại (OpenBSD và các số khác ngẫu nhiên hóa các PID) và bạn có thể sẽ đạt một số giới hạn khác (ví dụ như hết bộ nhớ vì tất cả các quy trình hoặc hoán đổi tử vong hoặc kẻ giết người OOM trở nên điên rồ) trước khi forkkhông thành công pid có sẵn.
thrig

1
Để biết thông tin: Tôi không tin rằng tôi đã thấy một PID lớn hơn 2 ^ 15-1 = 32767. Có bạn không?
THB

3
Không đề xuất trùng lặp thực sự trả lời câu hỏi này mặc dù.
Julie Pelletier

1
Không rõ liệu bạn đang hỏi điều gì sẽ xảy ra khi các PID đạt được giá trị tối đa nào đó (cho dù đó là khoảng 2 ^ 15 hoặc khoảng 2 ^ 32) hay điều gì xảy ra khi không thể phân bổ một PID mới, điều này không giống nhau . Tôi không nghĩ câu hỏi của bạn là một bản sao của một trong hai câu hỏi được đánh dấu; cả hai đều hỏi giới hạn là gì, không phải điều gì xảy ra khi bạn vượt quá nó. Nếu bạn cập nhật câu hỏi để làm rõ những gì bạn đang hỏi, tôi sẽ bỏ phiếu để mở lại nó. (Bạn đã có câu trả lời cho cả hai phiên bản có thể.)
Keith Thompson

Câu trả lời:


8

Tòa nhà forkchọc trời sẽ trả về -1 và được đặt errnothành EAGAIN . Điều gì xảy ra sau đó sẽ phụ thuộc vào quá trình được gọi fork.

Từ ngã ba :

Hàm fork () sẽ thất bại nếu:

[EAGAIN]

Hệ thống thiếu các tài nguyên cần thiết để tạo một quy trình khác hoặc giới hạn áp đặt của hệ thống đối với tổng số quy trình được thực thi trên toàn hệ thống hoặc bởi một người dùng {CHILD_MAX} sẽ bị vượt quá.


9

POSIX không chỉ định rằng PID của mỗi quy trình mới có được bằng cách tăng PID trước đó. Nó chỉ yêu cầu nó là duy nhất.

Trên một hệ thống, nơi các PID được tăng lên trên mỗi hệ thống fork(), tôi đã quan sát thấy các giá trị bao quanh sau khi đạt đến một giới hạn trên (theo kinh nghiệm của tôi là khoảng 2 15 ). Sau khi bọc xung quanh, các PID mới không được tăng nghiêm ngặt, vì một số giá trị PID sẽ vẫn được sử dụng từ các chu kỳ trước.

Không nên có vấn đề gì cho đến khi bạn có 2 N tiến trình chạy đồng thời . Tôi nghi ngờ hệ thống sẽ chạy vào một số giới hạn công suất từ ​​lâu trước khi điều đó xảy ra. Trong trường hợp đó, fork()cuộc gọi hệ thống sẽ thất bại và có thể được đặt errnothành EAGAINhoặc ENOMEM( man forkđể biết chi tiết).

Mã thực hiện forkcó thể hoặc không thể kiểm tra xem có bất kỳ PID nào khả dụng hay không. Nó có thể không bận tâm, bởi vì nó giả định rằng tài nguyên hệ thống sẽ cạn kiệt trước khi đến thời điểm đó, hoặc nó có thể kiểm tra rõ ràng để hoàn thiện và xử lý các khả năng trong tương lai. Tôi đã không kiểm tra, và nếu tôi có tôi chỉ có thể giải quyết bất kỳ hạt nhân nào tôi đã xem xét.


Tất nhiên tôi biết điều đó sẽ không bao giờ xảy ra, nhưng hệ thống có một số lượng giới hạn để gán. Tôi chỉ muốn biết những gì xảy ra khi nó hết.
Fred Frey

1
Câu trả lời này thực sự là người duy nhất trả lời được câu hỏi. Hành vi phụ thuộc vào hệ thống nhưng chỉ cần đảm bảo một mức độ duy nhất cho mỗi quy trình mới. Tất nhiên, bạn bị giới hạn bởi số lượng PID tối đa được cấu hình, được nêu chi tiết trong 2 câu hỏi được đánh dấu là trùng lặp, nhưng điều đó rất khó xảy ra trừ khi hệ thống của bạn đang chạy container hoặc bạn gặp lỗi nghiêm trọng trong chương trình hoặc tập lệnh được cài đặt.
Julie Pelletier

2

Giới hạn PID tối đa ít hơn nhiều 2^((sizeof(int)*CHAR_BIT). Xem giá trị tối đa của ID tiến trình là gì? . Nói cách khác, số tiền của bạn sẽ không bao giờ đạt gần 4 tỷ.

Khi tất cả các vị trí pid được lấp đầy, forkcác cuộc gọi sẽ bắt đầu thất bại với errno==EAGAIN(xem ngã ba (2) ). Nếu bạn chỉ đơn giản là chạm đỉnh mà không lấp đầy tất cả các vị trí, thì PID tiếp theo sẽ là vị trí miễn phí tiếp theo sau 1 (1 là init)

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.