64-bit bir Linux sistemindeki maksimum PID neden 2 ^ 22?


22

Neden 2 ^ 62 veya 2 ^ 31 veya başka bir şey olmasın?

İşlem Kimliğinin maksimum değeri nedir?


2
Bu? Kaynağınız nedir?
muru


Bu Linux'a çok özgü. Genel olarak Unix için geçerli değildir.
muru

Ben tam 64 bit tamsayı kullanmayı tercih ederdim, bu şekilde onlar asla yeniden kullanılmayacak daha garanti. Yeniden kullanma, bir kimliğin anlamının onu aldığınız ve kullandığınız zaman arasında değiştiği yarış koşullarına yol açar.
CodesInChaos

Yanıtlar:


34

Tamamen keyfi bir seçim gibi görünüyor. Herhangi bir şey olabilir, ama 1 kişi 4 milyonun yeterli olduğunu hissetti. Kaynağı kullanı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))

Git'teki tarih sadece 2005'e kadar uzanıyor gibi görünüyor ve değer en azından bu kadar uzun.


1 manpage o diyor /proc/sys/kernel/pid_max2.5.34 eklendi ve bakıyordu değişmek , benzediğini biri oldu 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 ...

Ancak, Ingo sadece ekledi DEFAULT_PID_MAX. 2.5.37'dePID_MAX_LIMIT Linus Torvalds tarafından eklendi :

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

Anlaşılan, değişim günlüğünü yanlış okudum.

Değişiklikler 2.5.37 patchsetinde :

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

Arama becerilerim beni yakaladığında.


@Hobbs sayesinde, Ingo sonuçta birileri gibi görünüyor . Yukarıda alıntıladığım yama ilk olarak onun tarafından gönderildi. Gönderen LKML mesaja beraberindeki:

yeni PID ayırıcısının bellek ayak izi / proc / sys / kernel / pid_max ile dinamik olarak ölçeklenir: varsayılan 32K PID'ler 4K ayırmaya neden olur, 1 milyon pid_max 128K ayak izine neden olur. Pid_max için geçerli mutlak sınır 4 milyon PID'dir - bu çekirdekte herhangi bir ayırmaya neden olmaz, bitmapler isteğe bağlı olarak ayrılmış çalışma zamanlarıdır. Pidmap tablosu 512 bayt alır.

Daha yüksek sınırlara sahip olma konusunda ateşli bir tartışma vardı, ama sonunda hiçbir şey çıkmadı.


2
Stackoverflow.com/questions/3264283/… adresindeki talimatları kullanarak, Linux'un daha derin bir geçmişine sahip, arkeolojiye uygun bir git repo alabilirsiniz . Bu, LWN'de görüntülenebilen Ingo Molnar tarafından a5b5f6a "[PATCH] jenerik-pidhash-2.5.36-J2, BK-curr" ortaya çıkıyor .
Ocaklar

@ hobbs harika! Sonuçta Ingo Molnar'dan. Acaba Linus neden değişiklik günlüğüne sahip oldu?
muru

1
@muru: BitKeeper'ın, Linus'un Git'i tasarlarken uyguladığı derslerden biri olan komünist ve yazar arasındaki farkı desteklemediğine inanıyorum. IIRC, Ingo BitKeeper'ı kullanmayı reddetti, bu yüzden posta başına yamalar gönderdi ve BitKeeper'ın ayrı bir yazarlık fikri olmadığından otomatik olarak oluşturulan ChangeLogs'ta karıştırıcıya yanlış dağıtıldı. Bu benim tahminim zaten.
Jörg W Mittag

@ JörgWMittag mümkündür. Şimdi changelog'u yanlış okuduğumu düşünüyorum ve bu parça farklı bir yama hakkında olabilir.
muru

3
Bu cevabın sonundaki alıntı, keyfi olarak büyük bir değer seçmemenin nedeninin bellek kısıtlamaları olduğunu göstermektedir. 1M PID başına 128 KB RAM'de, 63 bit (işaret bitini bırakarak) kullanmak, eğer matematiği doldurmazsam, sadece PID tablosu için bir milyon TB RAM gerektirir. Mevcut sistemler için biraz yüksekte.
CVn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.