หลังจากอ่านหลายแหล่งฉันยังคงสับสนเกี่ยวกับเธรดผู้ใช้และเคอร์เนลระดับ
โดยเฉพาะอย่างยิ่ง:
เธรดสามารถอยู่ได้ทั้งในระดับผู้ใช้และระดับเคอร์เนล
อะไรคือความแตกต่างระหว่างระดับผู้ใช้และระดับเคอร์เนล?
หลังจากอ่านหลายแหล่งฉันยังคงสับสนเกี่ยวกับเธรดผู้ใช้และเคอร์เนลระดับ
โดยเฉพาะอย่างยิ่ง:
เธรดสามารถอยู่ได้ทั้งในระดับผู้ใช้และระดับเคอร์เนล
อะไรคือความแตกต่างระหว่างระดับผู้ใช้และระดับเคอร์เนล?
คำตอบ:
หนึ่งในบทบาทของเคอร์เนลระบบปฏิบัติการมัลติทาสกิ้งคือการกำหนดเวลา : การพิจารณาว่าเธรดการดำเนินการใดที่จะดำเนินการเมื่อ ดังนั้นเมล็ดดังกล่าวมีความคิดของบางด้ายหรือกระบวนการ เธรดเป็นส่วนต่อเนื่องของรหัสที่กำลังดำเนินการและมีสแต็กของตัวเองและบางครั้งข้อมูลอื่น ๆ ในบริบทของระบบปฏิบัติการผู้คนมักจะใช้กระบวนการเพื่อหมายถึงเธรดที่มีพื้นที่หน่วยความจำของตัวเองและเธรดเพื่อหมายถึงเธรดที่แชร์พื้นที่หน่วยความจำของตนกับเธรดอื่น ๆ กระบวนการสามารถมีเธรดตั้งแต่หนึ่งเธรดขึ้นไป
ระบบปฏิบัติการบางระบบเช่นระบบยูนิกซ์ที่เก่ากว่าให้กระบวนการเท่านั้น: ทุกเธรดที่เคอร์เนลจัดการมีพื้นที่หน่วยความจำของตัวเอง ระบบปฏิบัติการอื่น ๆ เช่นระบบยูนิกซ์ที่ทันสมัยส่วนใหญ่อนุญาตให้กระบวนการมีหลายเธรดของการดำเนินการ: พวกเขาให้ความคิดระดับเคอร์เนลของเธรด
อาจเป็นไปได้สำหรับกระบวนการจัดการเธรดของตัวเอง ในมัลติเธรดที่ทำงานร่วมกันรหัสของแต่ละเธรดประกอบด้วยคำแนะนำในการสลับไปยังเธรดอื่น ในมัลติเธรดแบบpreemptiveกระบวนการร้องขอการแจ้งเตือนแบบอะซิงโครนัสเป็นระยะจากเคอร์เนลและตอบสนองต่อการแจ้งเตือนเหล่านี้โดยสลับไปที่เธรดอื่น วิธีนี้การมัลติเธรดถูกนำไปใช้โดยไม่มีความร่วมมือเคอร์เนลในระดับผู้ใช้ในไลบรารี
ระบบสามารถเสนอทั้งระดับเคอร์เนลและเธรดระดับผู้ใช้ นี้เป็นที่รู้จักกันเป็นเกลียวไฮบริด
เธรดผู้ใช้และเคอร์เนลแต่ละเธรดมีข้อดีและข้อเสีย การสลับระหว่างเธรดระดับผู้ใช้มักเร็วกว่าเนื่องจากไม่จำเป็นต้องรีเซ็ตการป้องกันหน่วยความจำเพื่อสลับไปยังตัวกำหนดเวลาในเคอร์เนลและอีกครั้งเพื่อสลับกลับไปที่กระบวนการ นี้ส่วนใหญ่เป็นเรื่องสำคัญสำหรับระบบพร้อมกันอย่างหนาแน่นที่ใช้เป็นจำนวนมากของหัวข้อสั้น ๆ มากเช่นบางภาษาระดับสูง ( Erlangโดยเฉพาะ) ของพวกเขาและหัวข้อสีเขียว เธรดระดับผู้ใช้ต้องการการสนับสนุนเคอร์เนลน้อยลงซึ่งสามารถทำให้เคอร์เนลง่ายขึ้น เธรดระดับเคอร์เนลอนุญาตให้เธรดรันในขณะที่เธรดอื่นในกระบวนการเดียวกันถูกบล็อกในการเรียกระบบ; กระบวนการที่มีเธรดระดับผู้ใช้จะต้องระมัดระวังไม่ให้ทำการบล็อกการเรียกของระบบเนื่องจากสิ่งเหล่านี้จะบล็อกเธรดทั้งหมดของกระบวนการ เธรดระดับเคอร์เนลสามารถรันพร้อมกันบนเครื่องหลายตัวประมวลผลซึ่งเธรดระดับผู้ใช้ล้วน แต่ไม่สามารถทำได้
คิดว่าเธรดระดับเคอร์เนลเป็น " ตัวประมวลผลเสมือน " และเธรดระดับผู้ใช้เป็นเพียงเธรด (ลองเรียกใช้ในตอนนี้) ตอนนี้สำหรับเธรดที่จะดำเนินการมันได้รับมอบหมายให้โปรเซสเซอร์ใช่ไหม? ดังนั้นแต่ละเธรดจะถูกกำหนดให้กับตัวประมวลผลเสมือนเพื่อให้สามารถดำเนินการได้
นี่คือข้อเท็จจริง
การสร้างตัวประมวลผลเสมือนใหม่นั้นมีราคาค่อนข้างแพง (เคอร์เนลต้องสร้างรายการในThread Control Blockกำหนดสแต็คเป็นต้น)
การสร้างเธรดนั้นค่อนข้างง่ายเมื่อเทียบกับการสร้างโปรเซสเซอร์เสมือนใหม่ นักพัฒนาแอพลิเคชันสามารถสร้างหัวข้อใช้ห้องสมุดกระทู้ให้โดยการเขียนโปรแกรมภาษาและมีการจัดการในพื้นที่ของผู้ใช้ และภาษาที่แตกต่างใช้มัลติเธรดในวิธีที่ต่างกัน
หากเธรดถูกแม็พเข้ากับตัวประมวลผลเสมือนเดียวดังนั้นต้องระมัดระวังไม่ให้ทำการเรียกระบบการบล็อกในเธรดใด ๆ เนื่องจากเธรดอื่นไม่สามารถรันพร้อมกันได้อีก
ข้อ จำกัด นี้สามารถเอาชนะได้หากสามารถสร้างตัวประมวลผลเสมือนได้อีกสองสามตัว ตอนนี้เธรดสามารถรันพร้อมกัน (ในแบบขนานหากมีตัวประมวลผลจริงจำนวนมาก) เธรดจะไม่มีผลต่อเธรดอื่นซึ่งถูกแม็พกับตัวประมวลผลเสมือนอื่น
ในโมเดลหลังสามารถแมปหนึ่งหรือหลายเธรดบนตัวประมวลผลเสมือน
โมเดลดังกล่าวมีชื่อหลายต่อหนึ่ง, หนึ่งต่อหนึ่งและหลายต่อหลายตามลำดับ
Referenes: แนวคิดของระบบปฏิบัติการโดย Galvin และคณะ หัวข้อ: เธรด -> มัลติเธรดโมเดล