ทำไม System PID 4 ไม่ใช่ PID 1


1

Google-fu ของฉันล้มเหลวฉัน!

บน Linux กระบวนการที่มี PID ต่ำสุดนั้นคือinitPID 1 เนื่องจากเป็นกระบวนการแรกที่เริ่มต้นหลังจากที่โหลดเคอร์เนลและรับผิดชอบในการเริ่มต้นกระบวนการอื่น ๆ ทั้งหมด

pi@raspberry:~ $ ps -ef --sort=pid | head -n 5
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Jan22 ?        00:02:20 /sbin/init
root         2     0  0 Jan22 ?        00:00:00 [kthreadd]
root         3     2  0 Jan22 ?        00:05:54 [ksoftirqd/0]
root         5     2  0 Jan22 ?        00:00:00 [kworker/0:0H]

บน Windows กระบวนการที่มี PID ที่ต่ำที่สุดคือSystemด้วย PID 4

PS C:\Users\msbob> Get-Process | Sort-Object Id | Select -First 5

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
      0       0        0         24     0               0 Idle
    755       0      144        844     4               4 System
     32       1      556       1268     4             388 smss
    521      82   139796     124204   390     6.07    424 iexplore
    661      12     2268       4728    49             604 csrss

ทำไมSystemPID 4 บน Windows ไม่ใช่ PID 1

คำตอบ:


5

คุณจะสังเกตเห็นว่า PID ทั้งหมดหารด้วย 4 4 จึงเป็น PID แรกที่มีให้หลังจาก 0 (ซึ่งเป็นกระบวนการว่าง)

ด้วยเหตุผลที่ว่าเป็นความจริงดูโพสต์นี้ MSDNเรย์มอนด์เฉิน:

ID กระบวนการและเธรดเป็นทวีคูณของสี่เป็นผลข้างเคียงของการใช้รหัสซ้ำ รหัสเดียวกันที่จัดสรรเคอร์เนลที่จับยังใช้ในการจัดสรรกระบวนการและรหัสเธรด เนื่องจากหมายเลขอ้างอิงเคอร์เนลมีหลายสี่จึงเป็นกระบวนการและรหัสเธรด

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

และด้วยเหตุผลที่เคอร์เนลจัดการจะถูกหารด้วยสี่เสมอ ... Raymond Chen เพื่อช่วยเหลืออีกครั้ง!

ความพร้อมใช้งานของสองบิตด้านล่างถูกฝังในไฟล์ส่วนหัว ntdef.h:

// Low order two bits of a handle are ignored by the system and available 
// for use by application code as tag bits.  The remaining
// and used to store a serial number and table index.    
#define OBJ_HANDLE_TAGBITS  0x00000003L

(สำหรับผู้ที่ไม่คุ้นเคยกับตัวเลขเลขฐานสอง: เลขจำนวนเต็มบวกเลขฐานสองที่มีบิตลำดับต่ำสองศูนย์จะหารด้วยสี่เสมอเช่นเดียวกับเลขฐานสิบที่ลงท้ายด้วย "00" จะหารด้วย 100 เสมอ)

ดังนั้น ... คำตอบที่แปลกประหลาดก็คือ PID แรกคือ "1" มันเป็นแค่ Task Manager และอื่นๆ ไม่รู้ว่าในรูปแบบภายในมันเลื่อนไปทางซ้ายสองบิต :)


Aha! Googling "windows pid หารด้วย 4" พาฉันมาที่คำตอบนี้ซึ่งมีรายละเอียดมากกว่านี้ ขอบคุณ!
Hydraxan14

ฉันเพิ่มข้อมูลเพิ่มเติมจากการโพสต์บล็อกของ MSDN โดย Raymond Chen คนแรกที่ตอบมาจากคำตอบนั้น
เจมี่ Hanrahan

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