เหตุผลเบื้องหลังทำให้ I / O ไม่สามารถขัดจังหวะได้อย่างไร อะไรจะเป็นผลลบหากกระบวนการจัดการ I / O ได้รับอนุญาตให้จัดการสัญญาณ
เหตุผลเบื้องหลังทำให้ I / O ไม่สามารถขัดจังหวะได้อย่างไร อะไรจะเป็นผลลบหากกระบวนการจัดการ I / O ได้รับอนุญาตให้จัดการสัญญาณ
คำตอบ:
I / O ใด ๆ ได้รับการจัดการโดยการเรียกใช้ระบบโดยกระบวนการ ในที่สุดการเรียกระบบดังกล่าวจะไหลลงไปจนถึงฟังก์ชั่นไดรเวอร์อุปกรณ์ระดับต่ำที่เหมาะสมเพื่อดำเนินการ I / O จริง
I / O อาจเป็นเรื่องยุ่งยาก - ในการรับข้อมูลเข้าและออกจากอุปกรณ์จริง ๆ อาจต้องทำตามขั้นตอนต่าง ๆ ตามลำดับและอาจมีข้อกำหนดด้านเวลา หากขั้นตอนเหล่านี้ยังไม่เสร็จสมบูรณ์แบบอะตอมในครั้งถัดไปที่พวกเขาพยายามอุปกรณ์อาจไม่ตอบสนองทำงานผิดปกติหรือทำให้ระบบล็อค ขั้นตอนเหล่านี้อาจแตกต่างกันและไม่ซ้ำกันสำหรับแต่ละอุปกรณ์ดังนั้นเหตุใดจึงมีไดรเวอร์อุปกรณ์มากมาย
โปรแกรมควบคุมอุปกรณ์ที่เป็นลายลักษณ์อักษรที่ดีควรทราบวิธีจัดการกับอุปกรณ์ที่พยายามให้บริการตามปกติดังนั้นจึงไม่ควรประสบปัญหาหากไม่มีข้อผิดพลาดของไดรเวอร์คุณกำลังใช้ไดรเวอร์ที่ไม่ถูกต้องสำหรับอุปกรณ์หรืออุปกรณ์ทางกายภาพล้มเหลว
ตอนนี้ฉันได้อ่านหนังสือ "การออกแบบระบบปฏิบัติการยูนิกซ์" โดย Maurice Bach ให้ฉันตอบคำถามนี้ด้วยตัวเอง
กล่าวโดยสรุปคือการทำให้ I / O uninterruptible มีวัตถุประสงค์เพื่อทำให้งาน I / O เสร็จสิ้นโดยเร็วโดยไม่ถูกรบกวนจากสัญญาณ
ความรู้ที่เกี่ยวข้องบางอย่างที่ฉันได้รับจากหนังสือ:
บางเส้นทางของรหัสในเคอร์เนลถูกทำเครื่องหมายว่าไม่สามารถขัดจังหวะได้ส่วนใหญ่เป็นเพราะรหัสจะต้องปฏิบัติตามเวลาที่เข้มงวด (เพื่อตอบอุปกรณ์) หรือเพราะมันกำลังทำสิ่งที่ไม่ยอมรับการรบกวน ในกรณีของลีนุกซ์ผู้ใช้ส่วนใหญ่ในอดีตถูกผลักออกไปเป็นส่วนแบ่งในเคอร์เนลและอันที่สองก็ถูกกำจัดให้หมดไป (ฉันสงสัยว่าส่วนใหญ่อยู่ภายใต้แรงกดดันจากเครื่องมัลติซีพียูในปัจจุบัน) คือมีบางเวลาที่ฉันไม่ได้เห็นกระบวนการในการนอนหลับไม่หยุดชะงัก
write(2)
ได้รับอนุญาตให้กลับมาก่อนกำหนดส่งคืนจำนวนไบต์จริงที่เขียนซึ่งอาจน้อยกว่าความยาวบัฟเฟอร์ที่ส่งผ่านเป็น ARG ที่ 3