Yanıtlar:
Herhangi bir G / Ç, bir işlem tarafından çağrılan bir sistem çağrısı tarafından işlenir. Sonunda böyle bir sistem çağrısı, gerçek G / Ç işlemini gerçekleştirmek için bazı uygun düşük seviyeli aygıt sürücüsü işlevine doğru yol alır.
G / Ç zor olabilir - aslında cihazın içine ve dışına veri almak için, sırayla ve muhtemelen zamanlama gereksinimlerine göre çeşitli adımların izlenmesi gerekebilir. Bu adımlar atomik olarak tamamlanmazsa, bir sonraki denemede aygıt yanıt vermeyebilir, yanlış davranabilir ve hatta sistemin kilitlenmesine neden olabilir. Bu adımlar her aygıt için farklı ve benzersiz olabilir, bu yüzden neden bu kadar çok aygıt sürücüsü vardır?
İyi yazılmış bir aygıt sürücüsü, hizmet vermeye çalıştığı aygıtla nasıl başa çıkılacağını bilmelidir, bu nedenle sürücü hatası yoksa, aygıt için yanlış sürücüyü kullanmıyorsanız veya fiziksel aygıt başarısız olduğunda normalde sorun yaşamamalıdır.
Şimdi Maurice Bach'ın "Unix İşletim Sistemlerinin Tasarımı" kitabını okuduğuma göre, bu soruyu kendim cevaplayayım.
Kısacası, G / Ç'nin kesintisiz hale getirilmesi, G / Ç görevinin sinyallere müdahale etmeden ASAP'ı bitirmesini sağlamak içindir.
Kitaptan edindiğim bazı ilgili bilgiler:
Çekirdekteki bazı kod yolları kesintisiz olarak işaretlenir, çünkü kodun katı zamanlamaya uyması (bir cihaza cevap vermek için) veya paraziti kabul etmeyen bir şey yapması nedeniyle. Linux'un durumunda, öncekinin çoğu bağımsız çekirdek içi işlemlere itildi ve ikincisi çoğunlukla yok edildi (çoğunlukla mevcut çoklu CPU makinelerinin baskısı altında olduğundan şüpheleniyorum). Yani, artık kesintisiz uykuda bir süreç görmedim.
write(2)
erken dönmesine izin verilir, yazılan gerçek bayt sayısı döndürülür; bu, 3. bağımsız değişken olarak geçirilen arabellek uzunluğundan daha az olabilir.