อะไรคือความแตกต่างระหว่างเคอร์เนลที่ไม่ต้องเสียภาษี


18

อะไรคือความแตกต่างระหว่างเคอร์เนล "แบบไม่ยึดเอาเสียก่อน", "ยึดเอาเสีย" และ "เลือกเฉพาะพื้นที่"

หวังว่าใครบางคนสามารถหลั่งน้ำตาแสงนี้


สิ่งนี้อาจเป็นประโยชน์: cdynamicprogramming.blogspot.com/p/blog-page_5.html
Rick

คำตอบ:


14

บนเคอร์เนลที่ยึดไว้ได้กระบวนการที่รันในโหมดเคอร์เนลสามารถถูกแทนที่ด้วยกระบวนการอื่นในขณะที่อยู่ตรงกลางของฟังก์ชันเคอร์เนล

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

ตัวอย่างเช่น:

กระบวนการAดำเนินการจัดการข้อยกเว้นกระบวนการBได้รับการปลุกโดยการร้องขอ IRQ, เคอร์เนลแทนที่กระบวนการAด้วยB(สลับกระบวนการบังคับ) กระบวนการAยังไม่เสร็จ ตัวกำหนดตารางเวลาจะตัดสินใจหลังจากนั้นหากกระบวนการAรับเวลาของ CPU หรือไม่

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

โดยทั่วไประบบปฏิบัติการที่ใช้ Linux ในปัจจุบันไม่ได้รวมเคอร์เนลที่ควบคุมไว้อย่างสมบูรณ์ แต่ก็ยังมีฟังก์ชั่นที่สำคัญที่ต้องทำงานโดยไม่หยุดชะงัก ดังนั้นฉันคิดว่าคุณสามารถเรียกสิ่งนี้ว่า

นอกจากนั้นยังมีวิธีที่จะทำให้เคอร์เนล Linux (เกือบ) ยึดเอาเสียก่อนอย่างเต็มที่


Macintosh System 6 และรหัสที่เกี่ยวข้อง (เช่น System 7, System 8 และ System 9) นั้นไม่ใช่การยึดเอาเสียก่อน แอปเปิ้ลเปลี่ยนเป็น MacOS X ก็เห็นการเปิดตัวของมัลติทาสก์ที่ยึดถือไว้เช่นกัน
เหม่ย

เคอร์เนลแทนที่กระบวนการ A ด้วย B (สวิตช์กระบวนการที่บังคับ) -> ในรูปแบบภาษาอังกฤษเราสามารถพูดประโยคนั้นได้หรือไม่เมื่อกระบวนการ A ถูกจองไว้ (ตามกระบวนการ B)?
snr

2

ใบจองคือ -> ความสามารถของระบบปฏิบัติการในการจองหรือหยุดงานที่กำหนดไว้ในปัจจุบันเพื่อสนับสนุนงานที่มีลำดับความสำคัญสูงกว่า การกำหนดเวลาอาจเป็นหนึ่งใน แต่ไม่ จำกัด เพียงกระบวนการหรือการจัดตารางเวลา I / O เป็นต้น

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

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

อ้างอิงและจัดรูปแบบจาก: http://www.linuxquestions.org/questions/linux-general-1/pre-emptive-vs-non-pre-emptive-kernel-582437/


ทำไม 2.4 เคอร์เนลจึงไม่ได้รับการยกเว้น
เสน

ถาม Linus Torvalds ดีกว่า :)
Madhur Ahuja

1

เคอร์เนลที่ยึดเอาไว้ช่วยให้กระบวนการสามารถจองได้ในขณะที่กำลังทำงานในโหมดเคอร์เนล เคอร์เนลที่ไม่ได้รับการอนุญาติไม่อนุญาตให้กระบวนการที่รันในเคอร์เนล modeto ถูกจองไว้ก่อน กระบวนการโหมดเคอร์เนลจะทำงานจนกว่าจะออกจากโหมดเคอร์เนลบล็อกหรือสมัครใจให้ผลการควบคุมของ CPU เห็นได้ชัดว่าเคอร์เนลที่ไม่ได้รับการป้องกันเป็นอิสระจากสภาพการแข่งขันในโครงสร้างข้อมูลเคอร์เนลเนื่องจากมีเพียงกระบวนการเดียวเท่านั้นที่ทำงานในเคอร์เนลในแต่ละครั้ง เราไม่สามารถพูดได้เหมือนกันเกี่ยวกับเมล็ดที่ถูกยึดครองดังนั้นพวกมันจะต้องได้รับการออกแบบอย่างระมัดระวังเพื่อให้แน่ใจว่าข้อมูลเคอร์เนลที่ใช้ร่วมกันปราศจากเงื่อนไขการแข่งขัน เมล็ดที่ได้รับการดูแลเป็นพิเศษโดยเฉพาะอย่างยิ่งยากที่จะออกแบบสำหรับสถาปัตยกรรม SMP เนื่องจากในสภาพแวดล้อมเหล่านี้เป็นไปได้ที่กระบวนการเคอร์เนลสองโหมดจะทำงานพร้อมกันในโปรเซสเซอร์ที่แตกต่างกัน เคอร์เนล preemptive เหมาะสำหรับการเขียนโปรแกรมแบบเรียลไทม์ เนื่องจากจะทำให้กระบวนการแบบเรียลไทม์สามารถจองกระบวนการที่กำลังทำงานอยู่ในเคอร์เนลได้ นอกจากนี้เคอร์เนลที่ถูกยึดครองอาจตอบสนองได้ดีกว่าเนื่องจากมีความเสี่ยงน้อยกว่าที่กระบวนการของโหมดเคอร์เนลจะทำงานเป็นระยะเวลานานโดยพลการก่อนที่จะปล่อยโปรเซสเซอร์ให้รอกระบวนการ แน่นอนว่าเอฟเฟกต์นี้สามารถลดลงได้ด้วยการออกแบบเคอร์เนลโค้ดที่ไม่ทำงานในลักษณะนี้ ต่อมาในบทนี้เราจะสำรวจว่าระบบปฏิบัติการต่าง ๆ จัดการการจองไว้ล่วงหน้าภายในเคอร์เนลอย่างไร ผลกระทบนี้สามารถลดลงได้โดยการออกแบบเคอร์เนลโค้ดที่ไม่ทำงานในลักษณะนี้ ต่อมาในบทนี้เราจะสำรวจว่าระบบปฏิบัติการต่าง ๆ จัดการการจองไว้ล่วงหน้าภายในเคอร์เนลอย่างไร ผลกระทบนี้สามารถลดลงได้โดยการออกแบบเคอร์เนลโค้ดที่ไม่ทำงานในลักษณะนี้ ต่อมาในบทนี้เราจะสำรวจว่าระบบปฏิบัติการต่าง ๆ จัดการการจองไว้ล่วงหน้าภายในเคอร์เนลอย่างไร

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