G / Ç neden kesintisiz?


12

G / Ç'yi kesintisiz hale getirmenin arkasındaki mantık nedir? Bir işlem G / Ç işleminin bir sinyali işlemesine izin verilirse olumsuz sonuçlar ne olurdu?


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.
Peter Cordes

Yanıtlar:


10

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.


6

Ş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:

  1. "Kesintisiz" kelimesi "kesintisiz uyku" anlamına gelmelidir. Bir süreç kesintisiz uyku durumundayken, sinyallerle Uyandırılamaz veya sinyalleri işleyemez.
  2. Bir işlem şu durumlarda sinyalleri işler: a. çekirdek modunda çalışıyor ve kullanıcı moduna dönmek üzere. b. uyku kesilebilir olduğunda uyku durumuna girmek ve bırakmak üzeredir.
  3. Bir uyku işlemi bir sinyalle uyandığında ne olur? Sinyali işleyecek ve varsayılan eylem işlemden çıkacaktı. Bir işlem G / Ç tamamlanmasını beklerken, elbette erken çıkmasını istemezsiniz.

2

Ç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.


3
Çizilmiş bir CD okumayı deneyin.
Joshua

1
Veya sshfs ile monte edip ağ kablosunu çekerek. Günümüzde bile, altta yatan ortam / depolama işlemi gerçekleştiğinde kesintisiz uyku gerçekleşir. Ve genellikle başa çıkmak için kanlı bir acıdır.
Nubarke
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.