อย่างแรก "บรรพบุรุษ" ไม่ใช่สิ่งเดียวกับ "ผู้ปกครอง" บรรพบุรุษสามารถเป็น…ผู้ปกครองของผู้ปกครอง…และผู้ปกครองเคอร์เนลติดตามเพียงระดับเดียว อย่างไรก็ตามเมื่อโปรเซสตายลูก ๆ ของมันจะถูกนำมาใช้โดย init ดังนั้นคุณจะเห็นกระบวนการจำนวนมากที่พาเรนต์เป็น 1 บนระบบทั่วไป
ระบบลีนุกซ์สมัยใหม่ยังมีกระบวนการบางอย่างที่เรียกใช้เคอร์เนลโค้ด แต่ได้รับการจัดการเช่นเดียวกับกระบวนการผู้ใช้ (พวกเขาไม่เชื่อฟังกฎการจัดการหน่วยความจำตามปกติเนื่องจากพวกเขากำลังเรียกใช้รหัสเคอร์เนล) กระบวนการเหล่านี้ล้วน แต่เกิดจากkthreadd
(เป็นจุดเริ่มต้นของเคอร์เนลเธรด) คุณสามารถรับรู้พวกเขาด้วย ID กระบวนการหลักของพวกเขา (2) หรือโดยปกติแล้วโดยความจริงที่ว่าps
พวกเขามีชื่อระหว่างวงเล็บเหลี่ยมหรือโดยความจริงที่ว่า/proc/2/exe
(ปกติลิงค์สัญลักษณ์ไปยังกระบวนการปฏิบัติการ) ไม่สามารถอ่านได้
โปรเซส 1 ( init
) และ 2 ( kthreadd
) ถูกสร้างขึ้นโดยตรงจากเคอร์เนลตอนบูทดังนั้นพวกมันจึงไม่มีพาเรนต์ ค่า 0 ถูกใช้ในฟิลด์ ppid เพื่อระบุว่า คิดว่า 0 เป็นความหมาย "เคอร์เนลตัวเอง" ที่นี่
ลินุกซ์ยังมีสิ่งอำนวยความสะดวกบางอย่างสำหรับเคอร์เนลเพื่อเริ่มกระบวนการผู้ใช้ที่มีการระบุตำแหน่งผ่านพารามิเตอร์ sysctlในบางสถานการณ์ ตัวอย่างเช่นเคอร์เนลสามารถทริกเกอร์เหตุการณ์การโหลดโมดูล (เช่นเมื่อค้นพบฮาร์ดแวร์ใหม่หรือเมื่อมีการใช้โปรโตคอลเครือข่ายบางครั้ง) โดยการเรียกโปรแกรมในkernel.modprobe
ค่า sysctl เมื่อโปรแกรมทิ้งแกนเคอร์เนลจะเรียกโปรแกรมที่ระบุโดยkernel.core_pattern
ถ้ามี
init
"บรรพบุรุษ" ของทั้งหมดuser threads
ในขณะที่[kthreadd ]
เป็น "ผู้ปกครอง" ของทั้งหมดkernel threads
ใช่มั้ย ขอบคุณ!