เคอร์เนล Linux มีกระบวนการเคอร์เนลจริง ๆ หรือไม่


19

ฉันอ่านในหลาย ๆ ที่ที่ Linux สร้างเคอร์เนลเธรดสำหรับแต่ละเธรดผู้ใช้ใน Java VM (ฉันเห็นคำว่า "kernel thread" ที่ใช้ในสองวิธีที่แตกต่างกัน:

  1. เธรดที่สร้างขึ้นเพื่อทำงานหลักของระบบปฏิบัติการและ
  2. เธรดที่ระบบปฏิบัติการทราบถึงและกำหนดเวลาเพื่อทำงานของผู้ใช้

ฉันกำลังพูดถึงประเภทหลัง)

เคอร์เนลเธรดเหมือนกับกระบวนการเคอร์เนลเนื่องจากกระบวนการ Linux สนับสนุนพื้นที่หน่วยความจำที่แบ่งใช้ระหว่างพาเรนต์และชายด์หรือเป็นเอนทิตีที่แตกต่างกันอย่างแท้จริงหรือไม่?

คำตอบ:


23

ไม่มีความแตกต่างระหว่างเธรดและกระบวนการบน Linux หากคุณดูที่โคลน (2)คุณจะเห็นชุดของธงที่กำหนดสิ่งที่แบ่งปันและสิ่งที่ไม่ได้ใช้ร่วมกันระหว่างกระทู้

กระบวนการคลาสสิกเป็นเพียงเธรดที่ไม่มีส่วนเกี่ยวข้อง คุณสามารถแบ่งปันองค์ประกอบที่คุณต้องการภายใต้ Linux

นี่ไม่ใช่กรณีของการใช้งานระบบปฏิบัติการอื่น ๆ ที่มีความแตกต่างอย่างมีนัยสำคัญมากขึ้น


22

เอกสารอาจสร้างความสับสนได้ดังนั้นนี่คือรูปแบบ Linux "ของจริง ":

  • ภายในเคอร์เนล Linux บางสิ่งที่สามารถเรียกใช้ (& กำหนดเวลา) เรียกว่า "กระบวนการ"
  • แต่ละกระบวนการมี ID กระบวนการเฉพาะ (PID) และ ID กลุ่มเธรด (TGID)
  • กระบวนการ "ปกติ" มี PID = TGID และไม่มีกระบวนการอื่นแบ่งปันค่า TGID นี้
  • กระบวนการ "เธรด" เป็นกระบวนการที่ค่า TGID ถูกแชร์โดยกระบวนการอื่น
  • กระบวนการหลายอย่างที่ใช้ TGID เดียวกันก็แบ่งปันอย่างน้อยก็คือพื้นที่หน่วยความจำเดียวกันและตัวจัดการสัญญาณ
  • หากกระบวนการ "เธรด" มี PID = TGID ก็สามารถเรียกได้ว่า "เธรดหลัก"
  • การเรียกgetpid()จากกระบวนการใด ๆ จะส่งคืน TGID (= "main thread" PID)
  • การโทรgettid()จากกระบวนการใด ๆ จะส่งคืน PID (!)
  • สามารถสร้างกระบวนการใด ๆ ด้วยการclone(2)เรียกของระบบ
  • ชื่อตัวเลขของโฟลเดอร์ที่คุณสามารถแสดงรายการด้วยls /procเช่นเดียวกับ/proc/NUMBERTGID
  • ชื่อที่/proc/TGID/taskเป็น/proc/TGID/task/NUMBERตัวเลขของโฟลเดอร์เช่นเดียวกับPID
  • แม้ว่าคุณจะไม่ได้เห็นทุก PIDs ที่มีอยู่กับคุณยังสามารถทำls /proccd /proc/any_PID

สรุป : จากมุมมองของเคอร์เนลมีเพียงกระบวนการเท่านั้นซึ่งแต่ละกระบวนการมี PID ที่ไม่ซ้ำกันและเธรดที่เรียกว่าเป็นกระบวนการที่แตกต่างกัน

หมายเหตุ:การนำแนวคิด "เธรด" ไปใช้ใน Linux ทำให้เกิดคำศัพท์สับสนและหากgetpid() คุณไม่ได้ทำตามที่คุณคิดก็เป็นเพราะพฤติกรรมของมันเป็นไปตาม POSIX ที่เข้ากันได้ (เธรดควรแบ่งปัน PID ทั่วไป) .


1
คำแนะนำ: การใช้คำว่า "task" อาจช่วยในการอ้างถึงบางสิ่งที่สามารถรันได้โดยไม่ทำให้เกิดความสับสนในกระบวนการ / เธรดมากนัก
Totor

17

เธรดเป็นกระบวนการภายใต้ Linux พวกมันถูกสร้างขึ้นด้วยการcloneเรียกของระบบซึ่งจะส่งกลับ ID กระบวนการที่สามารถส่งสัญญาณผ่านการkillเรียกของระบบเช่นเดียวกับกระบวนการ กระบวนการของเธรดสามารถมองเห็นได้ในpsผลลัพธ์ การcloneโทรถูกส่งผ่านแฟล็กซึ่งกำหนดจำนวนของสภาวะแวดล้อมของกระบวนการพาเรนต์ที่แบ่งใช้กับกระบวนการเธรด


1
ชายคนนั้นpthreads(7)กล่าวว่าสำหรับการใช้งาน NPTL (Native POSIX Library เธรด) การใช้งาน "เธรดทั้งหมดในกระบวนการจะถูกวางในกลุ่มเธรดเดียวกันโดยสมาชิกทั้งหมดของกลุ่มเธรดใช้ PID เดียวกัน" ในการใช้งาน LinuxThreads ที่ล้าสมัยแต่ละ "เธรด" จะมี PID ของตัวเอง
Totor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.