ค่าสูงสุดของ ID กระบวนการคืออะไร


42

ค่าสูงสุดของ ID กระบวนการคืออะไร

นอกจากนี้ยังเป็นไปได้ที่จะเปลี่ยนรหัสกระบวนการหรือไม่

คำตอบ:


61

บน Linux คุณสามารถค้นหาค่า PID สูงสุดสำหรับระบบของคุณด้วย:

$ cat /proc/sys/kernel/pid_max

ค่านี้สามารถเขียนได้โดยใช้ไฟล์เดียวกันอย่างไรก็ตามค่าสามารถขยายได้สูงสุดตามทฤษฎีเท่ากับ 32768 สำหรับระบบ 32 บิตหรือ 4194304 สำหรับ 64 บิต:

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

ดูเหมือนว่าจะเป็นการปฏิบัติตามกฎเกณฑ์ในระบบ 64 บิตส่วนใหญ่เพื่อตั้งค่านี้ให้เป็นค่าเดียวกันกับที่พบในระบบ 32 บิต แต่นี่เป็นแบบแผนมากกว่าการกำหนด

จาก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).

และไม่คุณไม่สามารถเปลี่ยน PID ของกระบวนการที่กำลังทำงานอยู่ได้ มันได้รับมอบหมายเป็นหมายเลขลำดับโดยเคอร์เนลในเวลาที่กระบวนการเริ่มต้นและนั่นคือมันเป็นตัวระบุจากเวลานั้น สิ่งเดียวที่คุณสามารถทำได้เพื่อรับรหัสใหม่คือให้โค้ดของคุณเป็นกระบวนการใหม่และยุติกระบวนการเก่า


และเราสามารถมั่นใจได้ว่าเคอร์เนลบิตด้วยสิ่งนี้
Aquarius Power

2
ตัวอย่างกึ่ง ๆ ที่น่าสงสัยเกี่ยวกับเรื่องราว "ไม่สามารถเปลี่ยน PID" เป็นกรณีของโปรแกรมแบบมัลติเธรดที่หนึ่งในเธรดสอื่น ๆ ทำ exec () มันซ้อนกระบวนการทั้งหมด แต่เปลี่ยน PID (เป็น TID ของเธรดที่เรียกใช้)
กุมภาพันธ์

3
ค่าสูงสุดของ PID สำหรับเครื่อง 32 บิตคือ 32767 ไม่ใช่ 32768 0 คือตัวกำหนดตารางเวลาและ 1 คือ init แล้วกระบวนการของผู้ใช้จะได้รับ 2 ถึง 32767

2
user129258 นั้นถูกต้องและสอดคล้องกับทั้งหน้าคู่มือและเคอร์เนล doco ค่าสูงสุดที่ได้รับอนุญาตของ PIDเช่นการร้องขอจากคำถามที่ว่าเป็นหนึ่งในน้อยกว่าคุ้มค่าในการที่หลอกไฟล์
JdeBP

1
@ user129258 สิ่งนี้จะระงับเมื่อคุณใช้ init เท่านั้น มีความเป็นไปได้ที่จะบูตโดยตรงไปยังเชลล์เสมอสมมติว่า busybox และทำสิ่งต่าง ๆ ด้วยตนเองโดยไม่ต้องควบคุมงาน หรือแม้กระทั่งมี scrips เริ่มต้นและกลับไปที่ shell ไม่ว่าในกรณีใดเชลล์จะเป็น PID 1 ในกรณีดังกล่าว
ทิม

9

คำตอบอื่น ๆ ได้อธิบายแล้ว

  • /proc/sys/kernel/pid_max สำหรับ Linux และ
  • 99999 สำหรับ FreeBSD

แต่คำถามไม่ได้ระบุระบบปฏิบัติการ ดังนั้นนี่คือบางส่วนอื่น ๆ :

  • บน Solaris ค่าสูงสุดของกระบวนการ ID เป็นพารามิเตอร์ที่เคอร์เนลพริ้ง - pidmaxใน/etc/system- ค่าเริ่มต้นที่ 30,000 ที่สามารถตั้งค่าใดก็ได้ระหว่างและ 266 999,999 โปรดทราบว่านี่ไม่ใช่max_nprocsซึ่งเป็นพารามิเตอร์ที่ปรับได้ของเคอร์เนลที่มีฟังก์ชั่นที่แตกต่างกันอย่างละเอียด
  • บน HP-UX 10 เคอร์เนลที่ปรับได้ตั้งชื่อprocess_id_minและprocess_id_maxกำหนดช่วงของ ID กระบวนการที่อนุญาต
  • บน AIX ID กระบวนการประกอบด้วยหลายฟิลด์รวมถึงฟิลด์ "process slot" และฟิลด์ "count count" ค่าที่เป็นไปได้สูงสุดคือ 0x03FFFFFE เนื่องจากเขตข้อมูลครอบครองเฉพาะจำนวนบิต 26 บิตด้านล่างและบิต # 0 จะเป็นศูนย์เสมอยกเว้นกระบวนการ # 1
  • บน OpenBSD สูงสุดคือ 32766
  • บน NetBSD สูงสุดคือ 30000

ในฐานะของ OpenBSD 6.5 จำนวนสูงสุดคือ 99999 ตามอินโทร (2) ไม่ใช่ 32766
Kaiepi

4

บน FreeBSD ค่าของ PID อยู่ระหว่าง 0 และ 99999 ตาม(ลิงค์)intro(2) นี่คือคำพูดจากคู่มือ:

ID กระบวนการ
แต่ละกระบวนการที่ใช้งานอยู่ในระบบจะถูกระบุด้วยจำนวนเต็มที่ไม่เป็นลบที่เรียกว่ารหัสกระบวนการ ช่วงของ ID นี้คือ 0 ถึง 99999

หากคุณต้องการที่จะอ่านรหัสที่มาด้วยตัวคุณเองแล้วPID_MAXจะกำหนดไว้ใน(ลิงค์)sys/sys/proc.h

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.