Tại sao PID tối đa trong hệ thống Linux 64 bit 2 ^ 22?


22

Tại sao không phải là 2 ^ 62, hay 2 ^ 31 hay bất cứ thứ gì khác?

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


2
Nó là? Nguồn của bạn là gì?
muru


Điều đó rất đặc trưng cho Linux. Nó không áp dụng cho Unix nói chung.
muru

Tôi sẽ thích sử dụng số nguyên 64 bit đầy đủ, theo cách đó bạn có thể đảm bảo hơn là chúng không bao giờ được sử dụng lại. Tái sử dụng dẫn đến các điều kiện chủng tộc trong đó ý nghĩa của ID thay đổi giữa thời gian bạn nhận được và sử dụng nó.
CodeInChaos

Câu trả lời:


34

Nó dường như là một sự lựa chọn hoàn toàn tùy ý. Nó có thể là bất cứ điều gì, nhưng ai đó 1 cảm thấy 4 triệu là đủ. Sử dụng nguồn :

/*
 * A maximum of 4 million PIDs should be enough for a while.
 * [NOTE: PID/TIDs are limited to 2^29 ~= 500+ million, see futex.h.]
 */
#define PID_MAX_LIMIT (CONFIG_BASE_SMALL ? PAGE_SIZE * 8 : \
    (sizeof(long) > 4 ? 4 * 1024 * 1024 : PID_MAX_DEFAULT))

Lịch sử trên git dường như chỉ quay trở lại cho đến năm 2005, và giá trị đã kéo dài ít nhất là như vậy.


1 Các manpage nói rằng /proc/sys/kernel/pid_maxđã được bổ sung trong 2.5.34, và nhìn vào changelog , có vẻ như ai đó đã Ingo Molnár :

<mingo@elte.hu>
    [PATCH] pid-max-2.5.33-A0

    This is the pid-max patch, the one i sent for 2.5.31 was botched.  I
    have removed the 'once' debugging stupidity - now PIDs start at 0 again.
    Also, for an unknown reason the previous patch missed the hunk that had
    the declaration of 'DEFAULT_PID_MAX' which made it not compile ...

Tuy nhiên, Ingo chỉ thêm vào DEFAULT_PID_MAX. PID_MAX_LIMITđã được Linus Torvalds thêm vào trong 2.5.37 :

<torvalds@home.transmeta.com>
    Make pid_max grow dynamically as needed.

Hóa ra, tôi đọc sai thay đổi.

Những thay đổi nằm trong bản vá 2.5.37 :

diff -Nru a/include/linux/threads.h b/include/linux/threads.h
--- a/include/linux/threads.h   Fri Sep 20 08:20:41 2002
+++ b/include/linux/threads.h   Fri Sep 20 08:20:41 2002
@@ -17,8 +17,13 @@
 #define MIN_THREADS_LEFT_FOR_ROOT 4

 /*
- * This controls the maximum pid allocated to a process
+ * This controls the default maximum pid allocated to a process
  */
-#define DEFAULT_PID_MAX 0x8000
+#define PID_MAX_DEFAULT 0x8000
+
+/*
+ * A maximum of 4 million PIDs should be enough for a while:
+ */
+#define PID_MAX_LIMIT (4*1024*1024)

 #endif

Đó là theo như kỹ năng tìm kiếm của tôi có được tôi.


Nhờ @hobbs, có vẻ như Ingo là người cuối cùng. Bản vá tôi trích dẫn ở trên lần đầu tiên được gửi bởi anh ấy. Từ bài viết của LKML kèm theo nó:

dấu chân bộ nhớ của bộ cấp phát PID mới tự động thay đổi tỷ lệ với / Proc / sys / kernel / pid_max: các bộ nhớ 32K mặc định gây ra phân bổ 4K, pid_max là 1 triệu gây ra dấu chân 128K. Giới hạn tuyệt đối hiện tại cho pid_max là 4 triệu PID - điều này không gây ra bất kỳ sự phân bổ nào trong kernel, bitmap là thời gian chạy được phân bổ theo nhu cầu. Bảng pidmap chiếm 512 byte.

Đã có một cuộc thảo luận sôi nổi về việc có giới hạn cao hơn, nhưng dường như cuối cùng không có gì ra khỏi nó.


2
Bạn có thể nhận được một repo git với lịch sử sâu hơn về Linux, phù hợp với khảo cổ học, sử dụng các hướng dẫn tại stackoverflow.com/questions/3264283/ . Điều đó bật lên a5b5f6a "[PATCH] generic-pidhash-2.5.36-J2, BK-current" của Ingo Molnar, có thể xem tại đây trên LWN .
hobbs

@hobbs tuyệt vời! Vì vậy, đó là từ Ingo Molnar sau khi tất cả. Tôi tự hỏi tại sao Linus nắm quyền sở hữu trong changelog.
muru

1
@muru: Tôi tin rằng BitKeeper không hỗ trợ sự khác biệt giữa người đi làm và tác giả, đó là một trong những bài học mà Linus áp dụng khi anh ấy thiết kế Git. IIRC, Ingo đã từ chối sử dụng BitKeeper, vì vậy anh ta đã gửi các bản vá cho mỗi thư và chúng bị phân phối sai trong ChangeLogs được tạo tự động cho người gửi, vì BitKeeper không có khái niệm riêng về quyền tác giả. Dù sao đó cũng là phỏng đoán của tôi.
Jörg W Mittag

@ JörgWMittag có thể. Bây giờ tôi đang nghĩ rằng tôi đã đọc sai thay đổi và bit đó có thể là về một bản vá khác.
muru

3
Câu trích dẫn gần cuối câu trả lời này chỉ ra rằng lý do không chọn giá trị lớn tùy ý là các hạn chế về bộ nhớ. Với RAM 128 KB trên mỗi 1M PID, sử dụng thậm chí 63 bit (để lại bit dấu), nếu tôi không thực hiện phép toán, sẽ yêu cầu một triệu TB RAM cho bảng PID. Một chút về phía cao cho các hệ thống hiện tại.
một CVn
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.