หากคอมพิวเตอร์เริ่มนับที่ 0 เหตุใดกระบวนการเริ่มจึงมี pid เท่ากับ 1


27

ไม่มากที่จะใส่ที่นี่ในร่างกาย


18
pid0 มีความหมายพิเศษสำหรับการkill(2)เรียกระบบซึ่งมันหมายถึงตัวฉันเองและสำหรับwaitpid(2)ที่หมายถึงกระบวนการใด ๆ ในกลุ่มกระบวนการของฉันอย่างน้อย ไม่ต้องพูดถึงว่าการfork()กลับมา0หมายความว่าเราอยู่ในเด็ก
Stéphane Chazelas

1
คุณควรโพสต์สิ่งนี้เป็นคำตอบ
Jonathan Muller

3
Zero ทำให้แฟล็กถูกตั้งค่าโดยอัตโนมัติในการลงทะเบียนสถานะของ CPU ส่วนใหญ่เมื่อโหลดในรีจิสเตอร์ทำให้สาขาสามารถใช้งานได้โดยไม่ต้องทำการเปรียบเทียบ / ทดสอบโดยเฉพาะ ดังนั้นจึงถูกใช้เป็นค่า "sentinel" มากเช่นค่าที่หมายถึง "ไม่ถูกต้อง", "จุดสิ้นสุดของข้อมูล" หรือ "กรณีพิเศษ" ที่นี่ ดังนั้นแม้ว่าคอมพิวเตอร์จะเริ่มนับที่ 0 จะมีหลายกรณีที่ 1 เป็นค่าแรกที่ถูกต้องสำหรับแอปพลิเคชันหรือโครงสร้างข้อมูลที่เป็นปัญหา
LawrenceC

4
หมายเหตุด้าน: คอมพิวเตอร์ไม่เริ่มนับที่ศูนย์ ภาษาการเขียนโปรแกรมจำนวนมากและฉันเชื่อว่าภาษาของเครื่องทั้งหมดใช้ออฟเซ็ตที่คนอื่น ๆ (และคนส่วนใหญ่) ใช้ดัชนี แต่ไม่ว่าการนับจะนับ อาร์เรย์ที่มีสององค์ประกอบมีสององค์ประกอบ (นับรวม) ไม่ว่าภาษาของคุณจะอ้างถึงพวกเขาด้วยการชดเชยหรือตามดัชนี
jthill

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

คำตอบ:


29

กระบวนการต้องมีพาเรนต์ (PPID) เคอร์เนลแม้จะไม่ได้เป็นกระบวนการจริง แต่ก็ยังจัดทำกระบวนการจริงบางอย่างเช่น init อย่างน้อยและให้ ID กระบวนการ 0 กับตัวเองทั้งนี้ขึ้นอยู่กับระบบปฏิบัติการอาจแสดงหรือไม่แสดงเป็นกระบวนการในpsเอาต์พุต แต่จะแสดงเสมอ เป็น PPID:

เช่นบน Linux:

$ ps -ef|head
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 09:09 ?        00:00:00 /sbin/init
root         2     0  0 09:09 ?        00:00:00 [kthreadd]
root         3     2  0 09:09 ?        00:00:00 [ksoftirqd/0]
...

บน Solaris:

$ ps -ef|head
     UID   PID  PPID   C    STIME TTY         TIME CMD
    root     0     0   0   Oct 19 ?           0:01 sched
    root     5     0   0   Oct 19 ?          11:20 zpool-rpool1
    root     1     0   0   Oct 19 ?           0:13 /sbin/init
    root     2     0   0   Oct 19 ?           0:07 pageout
    root     3     0   1   Oct 19 ?         117:10 fsflush
    root   341     1   0   Oct 19 ?           0:15 /usr/lib/hal/hald --daemon=yes
    root     9     1   0   Oct 19 ?           0:59 /lib/svc/bin/svc.startd
...

ยังทราบว่า pid 0(และ-1และค่านิยมเชิงลบอื่น ๆ สำหรับเรื่องที่) มีความหมายที่แตกต่างกันขึ้นอยู่กับสิ่งที่ใช้ฟังก์ชั่นพวกเขาชอบkill, และforkwaitpid

ในที่สุดขณะที่initกระบวนการให้ pid แบบดั้งเดิม#1นี่ไม่ใช่กรณีเมื่อใช้การจำลองเสมือนระดับระบบปฏิบัติการเช่นโซน Solaris เนื่องจากอาจมีมากกว่าหนึ่งการinitทำงาน:

$ ps -ef|head
     UID   PID  PPID   C    STIME TTY         TIME CMD
    root  4733  3949   0 11:07:25 ?           0:26 /lib/svc/bin/svc.configd
    root  4731  3949   0 11:07:24 ?           0:06 /lib/svc/bin/svc.startd
    root  3949  3949   0 11:07:14 ?           0:00 zsched
  daemon  4856  3949   0 11:07:46 ?           0:00 /lib/crypto/kcfd
    root  4573  3949   0 11:07:23 ?           0:00 /usr/sbin/init
  netcfg  4790  3949   0 11:07:34 ?           0:00 /lib/inet/netcfgd
    root  4868  3949   0 11:07:48 ?           0:00 /usr/lib/pfexecd
    root  4897  3949   0 11:07:51 ?           0:00 /usr/lib/utmpd
  netadm  4980  3949   0 11:07:54 ?           0:01 /lib/inet/nwamd

5

มีสองงานที่มี ID กระบวนการที่แตกต่างเป็นพิเศษ: swapper หรือ sched มีกระบวนการ ID 0 และรับผิดชอบเพจจิ้งเช่น jlliagre ใส่ในตัวอย่างก่อนและเป็นส่วนหนึ่งของเคอร์เนลมากกว่ากระบวนการโหมดผู้ใช้ปกติ

ID กระบวนการ 1 มักจะเป็นกระบวนการเริ่มต้นที่รับผิดชอบในการเริ่มต้นและปิดระบบ ในขั้นต้น ID กระบวนการ 1 ไม่ได้ถูกสงวนไว้เฉพาะสำหรับการเริ่มต้นโดยมาตรการทางเทคนิคใด ๆ : มันมี ID นี้เป็นผลมาจากธรรมชาติของการเป็นกระบวนการแรกที่เรียกใช้โดยเคอร์เนล โดยทั่วไประบบ Unix ล่าสุดจะมีองค์ประกอบเคอร์เนลเพิ่มเติมที่มองเห็นเป็น 'กระบวนการ' ซึ่งในกรณีนี้ PID 1 ถูกสงวนไว้อย่างแข็งขันสำหรับกระบวนการเริ่มต้นเพื่อรักษาความสอดคล้องกับระบบเก่า


4

โดยทั่วไปแล้ว 0 มักใช้เพื่อบ่งบอกถึง 'การอ้างอิงที่เป็นโมฆะ' ซึ่งหมายความว่าแม้ว่าจะมีค่า 0 อยู่ แต่คุณอาจไม่ใช้เพราะคุณต้องการให้ศูนย์มีความหมายถึงค่าพิเศษ

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