อะไรคือสาเหตุที่ทำให้เมล็ดลีนุกซ์รุ่นเก่าไม่ได้รับสิทธิพิเศษ?


15

ทำไมนักพัฒนาลีนุกซ์คนแรกเลือกที่จะใช้เคอร์เนลที่ไม่ได้รับสิทธิพิเศษ? มันคือการบันทึกการประสาน?

เท่าที่ฉันรู้ลีนุกซ์ได้รับการพัฒนาในช่วงต้นยุค 90 เมื่อพีซีมีหน่วยประมวลผลเดียว เคอร์เนลที่ไม่ได้รับการยกเว้นมีประโยชน์อะไรบ้างในพีซีดังกล่าว แต่ทำไมข้อดีของโปรเซสเซอร์แบบมัลติคอร์จึงลดลง?

คำตอบ:


26

ในบริบทของเคอร์เนลลินุกซ์เมื่อผู้คนพูดถึงการเลือกล่วงหน้าพวกเขามักอ้างถึงความสามารถของเคอร์เนลในการขัดจังหวะตัวเองโดยพื้นฐานแล้วให้สลับงานในขณะที่ใช้รหัสเคอร์เนล การอนุญาตให้สิ่งนี้เกิดขึ้นค่อนข้างซับซ้อนซึ่งอาจเป็นเหตุผลหลักที่ใช้เวลานานในการทำให้เคอร์เนลถูกทำให้ว่างไว้ล่วงหน้า

ในตอนแรกรหัสเคอร์เนลส่วนใหญ่ไม่สามารถถูกขัดจังหวะได้เนื่องจากมันได้รับการปกป้องโดยการล็อคเคอร์เนลขนาดใหญ่ ล็อคนั้นถูกกำจัดอย่างต่อเนื่องจากรหัสเคอร์เนลมากขึ้นเรื่อย ๆ ทำให้สามารถเรียกเคอร์เนลได้พร้อมกันหลายขนาน (ซึ่งมีความสำคัญมากขึ้นเมื่อระบบ SMP กลายเป็นเรื่องธรรมดามากขึ้น) แต่นั่นก็ยังไม่ได้ทำให้เคอร์เนล pre-emptible; ที่ยังคงพัฒนามากขึ้นสูงสุดในPREEMPT_RTชุดปะซึ่งในที่สุดก็รวมอยู่ในเคอร์เนลฉีด (และมีความสามารถในการล้างก่อน BKL ต่อไป) ทุกวันนี้เคอร์เนลสามารถกำหนดค่าให้มากหรือน้อยกว่า pre-emptible ขึ้นอยู่กับปริมาณงานและคุณสมบัติเวลาแฝงที่คุณต้องการ ดูการกำหนดค่าเคอร์เนลที่เกี่ยวข้องสำหรับรายละเอียด

ดังที่คุณสามารถดูได้จากคำอธิบายในการกำหนดค่าเคอร์เนล pre-emption มีผลต่อปริมาณงานและเวลาในการตอบสนองไม่ใช่ความพร้อมกัน สำหรับระบบที่ใช้ซีพียูเดี่ยวการปล่อยล่วงหน้ายังคงมีประโยชน์เพราะช่วยให้สามารถประมวลผลเหตุการณ์ด้วยเวลาตอบสนองที่สั้นลง อย่างไรก็ตามมันยังส่งผลให้ปริมาณงานลดลง (เนื่องจากเคอร์เนลใช้เวลาในการสลับงาน) การปล่อยล่วงหน้าอนุญาตให้ CPU ใด ๆ ที่กำหนดในระบบ CPU เดียวหรือหลายระบบสามารถสลับไปใช้งานอื่นได้รวดเร็วยิ่งขึ้น ปัจจัยที่ จำกัด ในระบบมัลติซีพียูไม่ได้เป็นการปลดล็อคล่วงหน้ามันมีขนาดใหญ่หรืออย่างอื่น: เมื่อใดก็ตามที่รหัสจะล็อคหมายความว่า CPU อื่นไม่สามารถเริ่มดำเนินการกระทำเดียวกันได้


12

เคอร์เนล Preemptive เพียง แต่หมายถึงว่าไม่มีบิ๊ก Kernel ล็อค

ลีนุกซ์มีการทำงานแบบมัลติทาสกิ้งไว้ล่วงหน้า (เช่นรหัสผู้ใช้สามารถจองได้) ตั้งแต่ช่วงเวลาแรก (เท่าที่ฉันรู้ลีนุกซ์ 0.0.1 แรกที่อัพโหลดโดย Linus ไปยังเซิร์ฟเวอร์ ftp funet เป็นมัลติทาสก์ที่ได้รับการควบคุมล่วงหน้าแล้ว) หากคุณดำเนินการตัวอย่างเช่นกระบวนการบีบอัดหรือรวบรวมหลายกระบวนการจะถูกดำเนินการแบบขนานจากช่วงเวลาแรก

ตรงกันข้าม - ในเวลา - Win31 ใช้กันอย่างแพร่หลาย บน Win31 หากงานได้รับ CPU จาก "เคอร์เนล" โดยค่าเริ่มต้นมันเป็นความรับผิดชอบในการพิจารณาว่าจะให้การควบคุมกลับไปที่ OS (หรืองานอื่น ๆ ) เมื่อใด หากกระบวนการไม่มีการสนับสนุนพิเศษสำหรับคุณสมบัตินี้ (ซึ่งต้องการงานเขียนโปรแกรมเพิ่มเติม) จากนั้นในขณะที่ดำเนินการงานอื่น ๆ ทั้งหมดจะถูกระงับ แม้แต่แอพพื้นฐานส่วนใหญ่ที่รวมเข้ากับ Win31 ก็สามารถใช้งานได้

การทำงานมัลติทาสกิ้งแบบ preemptive หมายความว่างานไม่มีวิธีจัดสรร CPU ตามที่ต้องการ แต่หากช่วงเวลาของพวกเขาหมดอายุเคอร์เนลจะได้รับ CPU จากพวกเขา ดังนั้นในระบบปฏิบัติการแบบ preemptive กระบวนการเขียนหรือการทำงานที่ไม่ดีไม่สามารถหยุดการทำงานของระบบปฏิบัติการหรือหลีกเลี่ยงกระบวนการอื่นจากการทำงาน ลีนุกซ์สามารถจองพื้นที่กระบวนการของผู้ใช้ได้เสมอ

Big Kernel Lock หมายถึงในบางกรณีภายในพื้นที่เคอร์เนลอาจมีการล็อกบางอย่างเพื่อป้องกันไม่ให้กระบวนการอื่นรันโค้ดที่ป้องกัน ตัวอย่างเช่นคุณไม่สามารถเมานต์ระบบไฟล์หลายระบบพร้อมกัน - หากคุณให้คำสั่งเมานต์หลายคำสั่งระบบจะยังคงทำงานต่อเนื่องเนื่องจากการติดตั้งสิ่งต่าง ๆ ที่จำเป็นในการจัดสรร Big Kernel Lock

การทำให้เคอร์เซอร์ยึดเอาเสียก่อนจำเป็นต้องกำจัดการล็อกเคอร์เนลขนาดใหญ่เช่นนี้ทำให้การเมานต์และงานอื่น ๆ สามารถรันพร้อมกันได้ มันเป็นงานที่ยิ่งใหญ่

ในอดีตสิ่งนี้เกิดขึ้นอย่างเร่งด่วนโดยการสนับสนุนที่เพิ่มขึ้นของ SMP (การสนับสนุนมัลติซีพียู) ในครั้งแรกที่มีเมนบอร์ดที่ใช้ CPU หลายตัวจริงๆ ต่อมาซีพียูหลายตัว ("คอร์") ถูกรวมเข้ากับชิปตัวเดียววันนี้เมนบอร์ดที่ใช้ซีพียูหลายตัวนั้นหายากอยู่แล้ว (โดยทั่วไปจะอยู่ในระบบเซิร์ฟเวอร์ราคาแพง) นอกจากนี้ระบบ single-core จริงๆ (ที่มีเพียงซีพียูเดียวที่มีคอร์เดียว) ก็หายาก

ดังนั้นคำตอบสำหรับคำถามของคุณไม่ใช่ว่า "อะไรคือสาเหตุของการไม่ยึดถืออำนาจ" เพราะเป็นสิ่งที่ยึดเอาเสียก่อนเสมอ คำถามที่แท้จริงคือสิ่งที่ทำให้การดำเนินการมาตรการเคอร์เนลจำเป็นจริงๆ คำตอบคือ: อัตราส่วนที่เพิ่มขึ้นของซีพียูหลายตัว, ระบบหลายคอร์


ฉันไม่เข้าใจจริง ๆ :( จนกระทั่งเคอร์เนลเวอร์ชัน 2.4 มีเพียงกระบวนการผู้ใช้ที่ถูกยึดเอาไว้และเคอร์เนลก็ไม่ได้ถูกยึดเอาเสียก่อนที่ฉันตอบใครบางคนก่อนหน้านี้ฉันคิดว่าเหตุผลคือการบันทึกการทำงานเกี่ยวกับการหยุดชะงัก การดำเนินการตามกระบวนการแบบ Single-Core คุณคิดอย่างไร
Narden

@ ใกล้ฉันไม่รู้ว่าคุณอ่านมันแล้วหรือยัง ประมาณ 1.3 หรือ 2.0 ประมาณกระบวนการเดียวเท่านั้นที่สามารถอยู่ในพื้นที่เคอร์เนลแม้ว่ากระบวนการหลายกระบวนการกำลังทำงานอยู่ ข้อ จำกัด นี้ถูกกำจัดอย่างคร่าวๆกับ 2.0 จนถึงประมาณ 2.4 มี Big Kernel Lock (เช่นการติดตั้งระบบไฟล์หลายระบบพร้อมกันไม่ทำงาน)
peterh - Reinstate Monica

@ Narden แต่มันไม่ใช่การทำงานหลายอย่างพร้อมกันโดยไม่จำเป็นต้องมีกระบวนการใดที่จะให้ CPU กลับไปที่ task scheduler โดยเจตนา ใช่เหตุผลที่ BKL มีความเป็นไปได้ว่าการทำอย่างถูกต้องนี้เป็นงานจำนวนมาก: 1) ล็อคต้องแยก 2) ควรใช้โครงสร้างข้อมูลที่ไม่ล็อคได้ถ้าเป็นไปได้ 3) ล็อคแยกจะทำให้เกิดการหยุดชะงัก / โดยทั่วไปแล้วสิ่งเหล่านี้จะสกปรกโดยเฉพาะอย่างยิ่งข้อผิดพลาดที่ยากต่อการแก้ไขทั้งหมดของพวกเขาควรจะพบและแก้ไข 4) ไดรเวอร์ทั้งหมดควรได้รับการแจ้งเตือนการเปลี่ยนแปลงใน kernel core API
peterh - Reinstate Monica

ฉันอ่านมันในขณะที่ฉันกำลังค้นหาคำตอบและยังได้รับเป็นข้อมูลในหลักสูตรที่ฉันใช้ชื่อระบบปฏิบัติการ
Narden

1
Big Kernel Lock ป้องกันไม่ให้เธรดอื่นเข้าสู่เคอร์เนลเมื่อมีการดำเนินการในเคอร์เนล อนุญาตให้ใช้เธรดเดียวเท่านั้นเนื่องจากเคอร์เนลไม่ได้รับการออกแบบตั้งแต่เริ่มต้นโดยคำนึงถึงการประมวลผลแบบหลายส่วนที่สมมาตร เคอร์เนลที่ถูกจองไว้ก่อนหมายถึงสิ่งที่ต่างออกไป โดยทั่วไปบริบทการดำเนินการจะเปลี่ยนเฉพาะเมื่อเคอร์เนลกลับสู่พื้นที่ผู้ใช้ ในเคอร์เนล pre-emptive เธรดสามารถถูก pre-empted ในระหว่างการรันโค้ดเคอร์เนล
Johan Myréen

3

นี่ไม่ใช่คำตอบทางเทคนิค แต่เป็นคำตอบในอดีตสำหรับคำถามเฉพาะที่ OP: "สาเหตุของการไม่ได้รับสิทธิพิเศษของเมล็ด Linux เก่ากว่าคืออะไร"

(ฉันถือว่าตามที่อธิบายไว้โดย @peterh ในคำตอบและความคิดเห็นของเขาว่าโดย "การไม่ยึดถือสิทธิ" OP หมายถึงข้อเท็จจริงอย่างใดอย่างหนึ่งหรือทั้งสองอย่างว่ากระบวนการผู้ใช้เพียงอย่างเดียวอาจอยู่ภายในเคอร์เนล (ใน API) ที่ เวลาและ / หรือ Big Kernel Lock)

Linus Torvalds สนใจที่จะเรียนรู้ว่าระบบปฏิบัติการทำงานอย่างไรและวิธีที่เขาเรียนรู้คือการเขียนหนึ่งระบบ โมเดลและฐานและสภาพแวดล้อมการพัฒนาเริ่มต้นของเขาคือ Minix ซึ่งเป็นระบบปฏิบัติการที่มีอยู่เพื่อการศึกษา (เช่นไม่ใช่ระบบปฏิบัติการที่ใช้งานจริง) ซึ่งไม่ฟรี (เหมือนในโอเพ่นซอร์สในเวลานั้น - มันไม่ฟรีในเบียร์ ทั้ง).

ดังนั้นเขาจึงเขียนเคอร์เนลที่ไม่มีการจองล่วงหน้า (Big Kernel Lock ที่กล่าวถึงในคำตอบอื่น ๆ ) เพราะนั่นคือวิธีที่คุณทำถ้าคุณต้องการให้ระบบปฏิบัติการใหม่ของคุณทำงานได้อย่างรวดเร็วเพื่อการศึกษา: มันง่ายกว่านั้นมาก เคอร์เนลเพื่อรองรับการทำงานหลายโปรแกรมพร้อมกันของผู้ใช้โปรแกรมและอุปกรณ์นั้นยากพอ - มันยากมากที่จะทำให้เคอร์เนลเกิดขึ้นพร้อมกัน

ถ้าเขารู้แล้วว่าลินุกซ์ยอดนิยม / มีประโยชน์ / สำคัญจะกลายเป็น ... เขาคงจะทำแบบเดียวกัน (IMO เท่านั้นฉันไม่รู้เลยว่าเขาคิดอย่างไร) เพราะคุณต้องเดินก่อนที่คุณจะวิ่งได้

และมันก็ยังคงอยู่ต่อไปอีกนานเพราะก) มีงานอื่นอีกมากที่ต้องทำในการทำลีนุกซ์วันนี้ (หรือแม้แต่ตอนนี้) และข) การเปลี่ยนแปลงมันจะเป็นเรื่องยาก (ตามที่อธิบายไว้ในคำตอบอื่น ๆ )

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