เคอร์เนลเป็นกระบวนการหรือไม่?


30
  1. ใน Linux เรามักพูดเสมอว่ากระบวนการแรกคือinit(pid == 1) แต่ทำไมไม่ใช่เคอร์เนล (เริ่มต้น) ซึ่งติดตั้งระบบและสร้าง initกระบวนการ เคอร์เนลเป็นกระบวนการหรือไม่?
  2. เรารู้ว่าเธรดพื้นที่ผู้ใช้ทั้งหมดถูกรูทที่กระบวนการเริ่มต้น ถ้าอย่างนั้นการจัดตารางเวลาและสิ่งเคอร์เนลอื่น ๆ เช่นการจัดการหน่วยความจำ

โดยพื้นฐานแล้วสิ่งที่ทำให้ฉันสับสนคือโครงสร้างของเคอร์เนล ถ้ามันเป็นกระบวนการมันเป็นกระบวนการเดียวหรือประกอบด้วยหลายกระบวนการ?

คำตอบ:


19

คำตอบสั้น ๆ:

  1. ไม่มันไม่ใช่กระบวนการ
  2. เธรดผู้ใช้ไม่ถูกรูทที่ init

Init เป็นเพียงกระบวนการแรก มันไม่ได้จัดการกระบวนการหรือเธรดใด ๆ มันสร้างบางอย่างโดยใช้เคอร์เนล syscalls fork () และ exec

ฉันคิดว่าคุณมีความคิดที่เป็นโคลนว่ากระบวนการคืออะไร มันไม่ได้หมายถึงการเรียกใช้โค้ดเพียงเล็กน้อย ใช่เคอร์เนลทำงานก่อน init (และบูตโหลดเดอร์ก่อนหน้านั้น) แต่ 'กระบวนการ' มีคำจำกัดความเฉพาะของ:

  • ทำงานในพื้นที่ของผู้ใช้
  • รันด้วย ID กระบวนการ
  • การโต้ตอบจำนวนมากต้องผ่านเคอร์เนล
  • ทรัพยากรทั้งหมดต้องมาจากเคอร์เนล
  • จำเป็นต้องกำหนดเวลาโดยเคอร์เนล

ดังนั้นเมื่อเคอร์เนลเริ่มต้นมันจะเรียกใช้ init ซึ่งจะวางไข่ตามที่กระบวนการอื่น ๆ กำหนดค่าไว้

เท่าที่ # 2 ไปทุกสิ่งเคอร์เนลเป็นอย่างดีในเคอร์เนล คิดว่าเคอร์เนลเป็นรหัสพื้นที่ขนาดใหญ่ ไม่ใช่กระบวนการ แต่เป็นโค้ดขนาดใหญ่ บางส่วนของเคอร์เนลจัดการกับการจัดการหน่วยความจำส่วนต่าง ๆ ของมันมีส่วนของการกำหนดตารางเวลาของตัวเอง (เช่นไดรเวอร์ ฯลฯ ) และบางส่วนของมันด้วยกระบวนการกำหนดเวลา


3
ฉันสงสัยว่า OP รู้ดีพอที่จะทำให้จิตใจของเขาปลิวไปตามเมล็ด ฉันไม่ได้รวมการแก้ไขของฉันเพราะฉันคิดว่ามันจะเสียสมาธิในอัตราใด
new123456

4
วิธีคิดอย่างหนึ่งของเคอร์เนลเปรียบเสมือนไลบรารี่ขนาดมหึมาที่มีจุดเข้า (ระบบเรียก) เพื่อขอให้มันทำอะไรบางอย่างแทนคุณ อีกมุมมองหนึ่งคือว่ามันกำลังรอเหตุการณ์ที่จะจัดการไม่ว่าจะเป็นการเรียกระบบจากผู้ใช้หรือการหยุดชะงักของฮาร์ดแวร์ (เช่นแพ็คเก็ตเครือข่ายใหม่มาถึง) บางสิ่งต้องใช้เวลาในการจัดการดังนั้นเคอร์เนลจึงส่งงานออกไปยังเธรดภายในและกลับไปยังบุคคลที่เรียกว่า
vonbrand

15

เคอร์เนลไม่ได้ทำงานเหมือนกระบวนการเลย มันไม่ได้รับการจัดกำหนดการมันจะทำงานในนามของกระบวนการ (เรียกว่ากระบวนการบริบทหรือผู้ใช้บริบท) หรือทำงานเป็นผลมาจากการขัดจังหวะหรือข้อยกเว้น (เรียกว่าขัดจังหวะบริบท)

ที่กล่าวว่าเคอร์เนลลินุกซ์วางไข่เคอร์เนลเธรดเพื่อทำงานบางอย่างหรือเพื่อหลีกเลี่ยงการรันบางสิ่งในบริบทอินเตอร์รัปต์นานเกินไป (นั่นคือสิ่งที่เธรด ksoftirqd ทำเพื่อหลีกเลี่ยงเวลาแฝงที่มากเกินไป .

คุณสามารถดูเคอร์เนลเธรดบนเอาต์พุตของpsคำสั่ง พวกเขาจะระบุได้อย่างง่ายดาย: ชื่อของพวกเขาอยู่ระหว่างวงเล็บ บางตัวรันหนึ่งอินสแตนซ์ต่อซีพียู CPU ถูกระบุด้วยตัวเลขหลังเครื่องหมายทับดังนั้น [ksoftirqd / 0] จึงเป็นอินสแตนซ์ของ ksoftirqd บน CPU 0


1

มีแนวคิดใน micro-kernels ที่ส่วนต่าง ๆ ของเคอร์เนลเป็นกระบวนการที่มี Sentinel หลักจัดการ IPC เป็นหลัก

Linux - ดีขึ้นหรือแย่ลง - ไม่ใช่ระบบเคอร์เนลขนาดเล็ก


1

ไม่มันไม่ใช่ ... เคอร์เนล (และส่วนขยายเคอร์เนล) ถูกโหลดเข้าสู่หน่วยความจำโดยตรง หากมีรหัสที่ไม่ปลอดภัยในเคอร์เนลจะไม่มีสิ่งใดขวางกั้นกับปัญหาใหญ่

นอกจากนั้นเคอร์เนลจะเรียกใช้ / สลับระหว่างกระบวนการโดยทั่วไป เห็นได้ชัดว่าสิ่งที่ใช้กระบวนการจริง ๆ แล้วจะไม่เป็นกระบวนการ

(tl; dr 1. no 2. ส่วนของเคอร์เนล / ส่วนขยาย)


0

ninjalj wrote: "เคอร์เนลไม่ได้ทำงานเหมือนกระบวนการเลยมันไม่ได้รับการกำหนด"

มีกระบวนการว่าง (โดยทั่วไปคือ pid แม้ว่ามันจะไม่ปรากฏที่ใดก็ตาม) ซึ่งถูกกำหนดเวลาไว้และอยู่ในสถานะที่เรียกใช้ได้เสมอ


0

การสลับบริบท

❖กระบวนการได้รับการจัดการโดยรหัส OS ที่ใช้ร่วมกันที่เรียกว่าเคอร์เนล

▪ The kernel is not a separate process, but rather runs as part of a user process

switch การสลับบริบทผ่านโฟลว์ควบคุมจากกระบวนการหนึ่งไปอีกกระบวนการหนึ่งและดำเนินการโดยใช้รหัสเคอร์เนล

ที่มา: https://courses.cs.washington.edu/courses/cse351/19su/lectures/18/CSE351-L18-processes_19su.pdfหน้า 36

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