ทำไม I / O ไม่หยุดชะงัก


11

เหตุผลเบื้องหลังทำให้ I / O ไม่สามารถขัดจังหวะได้อย่างไร อะไรจะเป็นผลลบหากกระบวนการจัดการ I / O ได้รับอนุญาตให้จัดการสัญญาณ


write(2)ได้รับอนุญาตให้กลับมาก่อนกำหนดส่งคืนจำนวนไบต์จริงที่เขียนซึ่งอาจน้อยกว่าความยาวบัฟเฟอร์ที่ส่งผ่านเป็น ARG ที่ 3
Peter Cordes

คำตอบ:


9

I / O ใด ๆ ได้รับการจัดการโดยการเรียกใช้ระบบโดยกระบวนการ ในที่สุดการเรียกระบบดังกล่าวจะไหลลงไปจนถึงฟังก์ชั่นไดรเวอร์อุปกรณ์ระดับต่ำที่เหมาะสมเพื่อดำเนินการ I / O จริง

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

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


5

ตอนนี้ฉันได้อ่านหนังสือ "การออกแบบระบบปฏิบัติการยูนิกซ์" โดย Maurice Bach ให้ฉันตอบคำถามนี้ด้วยตัวเอง

กล่าวโดยสรุปคือการทำให้ I / O uninterruptible มีวัตถุประสงค์เพื่อทำให้งาน I / O เสร็จสิ้นโดยเร็วโดยไม่ถูกรบกวนจากสัญญาณ

ความรู้ที่เกี่ยวข้องบางอย่างที่ฉันได้รับจากหนังสือ:

  1. คำว่า "uninterruptible" ควรอ้างถึง "uninterruptible sleep" เมื่อกระบวนการอยู่ในโหมดสลีปที่ไม่สามารถขัดจังหวะได้จะไม่สามารถปลุกด้วยสัญญาณและไม่สามารถจัดการสัญญาณได้
  2. กระบวนการจัดการสัญญาณเมื่อ: มันกำลังทำงานในโหมดเคอร์เนลและกำลังจะกลับไปที่โหมดผู้ใช้ ข กำลังจะเข้าและออกจากสถานะสลีปเมื่อการนอนหลับขัดจังหวะ
  3. จะเกิดอะไรขึ้นเมื่อกระบวนการนอนหลับตื่นขึ้นมาด้วยสัญญาณ มันจะจัดการกับสัญญาณด้วยการกระทำเริ่มต้นกำลังออกจากกระบวนการ เมื่อกระบวนการกำลังรอ I / O ที่สมบูรณ์คุณไม่ต้องการให้ออกจากโปรแกรมก่อนเวลาอันควร

2

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


3
ลองอ่านซีดีที่มีรอยขีดข่วน
Joshua

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