Kısım I · Makine · Bölüm 17

Sürücüler ve Giriş/Çıkış

Donanımla konuşmak (Device drivers and I/O)

Neden burada · Neye dayanıyor

Neden burada: İşletim sistemini şimdiye kadar içeriden gördük: işlemciyi, belleği paylaştırdı, diski dosyalara çevirdi. Askıda bir soru kaldı: klavyeyi, ekranı, diski ve ağ kartını nasıl tanıyor ve onlarla nasıl konuşuyor? Donanımla yazılımın gerçekten dokunduğu yer burası.

Neye dayanıyor: Bölüm 13: çekirdek ve ayrıcalık seviyeleri (aygıt erişiminin neden işletim sistemi tarafından denetlendiği). Bölüm 14: bağlam değişimi (giriş/çıkış bekleyen işten başka işe geçmek). Bölüm 16: dosya sisteminin altındaki disk. Ayrıca Bölüm 1.4'teki arayüz–gerçekleme ayrımı ve Bölüm 2.4'teki onaltılık gösterim.

  1. Kat 8–10Ağ, tarayıcı, bizim uygulamaAygıt dili bu katlardan görünmez.
  2. Kat 7İşletim sistemiBu bölüm: sürücüler ve kesme işleyicileri. Bölüm 13–18.
  3. Kat 0–3Donanım: elektrik, kapılar, devreler, işlemci ve bellekBu bölüm: aygıtlar bu tarafta; yazmaçlarıyla açılırlar.

Örnekler Linux ağırlıklıdır, çünkü kaynaklarımız Linux'u anlatır; macOS ve Windows'taki adları Bölüm 18'de göreceğiz. Bölümün sonunda şunları bileceksin: giriş/çıkış aygıtlarının (klavye, ekran, disk, ağ kartı) bilgisayara nasıl bağlandığını; sürücünün ne olduğunu; işin tamamlandığını öğrenme yöntemlerini (yoklama, kesme) ve veri taşıma yöntemini (DMA) birbirinden ayırmayı; ve Bölüm 1'deki kat planını, bir tuş basışının elektrikten ekrana yolculuğu olarak yeniden okumayı.

17.1 Giriş/çıkış aygıtları: klavye, ekran, disk, ağ kartı

Bölüm 1.1'de her işin dört parçaya ayrıldığını görmüştük: girdi, işlem, çıktı, saklama. İşlemci ve bellek işlemin fiziksel karşılığıydı. Girdi, çıktı ve saklama için giriş/çıkış aygıtı (I/O device) gerekir: bilgisayarın dış dünyayla ya da kalıcı depoyla alışveriş yaptığı her parça. OSTEP şöyle başlar: hiç girdisi olmayan bir program her seferinde aynı sonucu üretir; hiç çıktısı olmayan bir programın çalışmasının ne anlamı olurdu?1

Dört örnek: klavye ve dokunmatik yüzey yalnızca girdi ("B şıkkı"na dokunmak); ekran yalnızca çıktı (yeşil "Doğru!" ve +10); disk ve ağ kartı (network interface card, NIC) hem girdi hem çıktı (dünkü seriyi saklamak, cevabı sunucuya yollamak).

Aygıtlar neden farklı yollara bağlanır?

Klavyeden saniyede birkaç tuş gelir, ekran kartı milyonlarca pikselin rengini ister; hepsini neden tek yola bağlamıyoruz? OSTEP'in cevabı iki kelime: fizik ve maliyet. Bir yol (veri yolu (bus), ayrıntısı Bölüm 6.3'te) ne kadar hızlıysa o kadar kısa olmak zorundadır; en hızlı yola çok aygıt takacak yer kalmaz, üstelik hızlı yol pahalıdır. Tasarımcılar bu yüzden kademe kurmuştur: hızlı yol işlemciye yakın, yavaş yol uzak.1

OSTEP'in klasik şemasında hızlı aygıtlar genel bir yola (PCI), yavaşlar çevre birimi yoluna (SCSI, SATA, USB) takılır. OSTEP’in gösterdiği Intel Z270 örneğinde işlemci belleğe ve ekran kartına hızlı bir bağlantıyla (PCIe) konuşur; diğer birçok aygıt ayrı bir giriş/çıkış çipi (I/O chip) üzerinden bağlanır: diskler SATA, klavye ve fare USB, ağ kartı ve hızlı NVMe diskler PCIe ile.1 Kısaltmaları ezberleme; fikir şu: aygıtlar hıza ve maliyete göre kademelendirilmiş yollara takılır, tıpkı Bölüm 8'deki bellek hiyerarşisi gibi.

Bir aygıtın iki yüzü: arayüz ve iç yapı

Her aygıtın iki parçası vardır; bu, Bölüm 1.4'ün arayüz–gerçekleme ayrımının donanımdaki halidir.1

Arayüz de aygıttan aygıta değişir; bunu 17.2'de sürücüyle çözeceğiz.

Disk: aygıtın birimi ile dosya sisteminin birimi

Dosya sistemi dosya ve bloklarla ilgilenirken disk arayüzü okunup yazılabilen sektörler (sectors) sunar. OSTEP'in basitleştirilmiş disk örneğinde sektör 512 byte'tır. Dosya sistemi bloğunu 4096 byte seçersek 4096 ÷ 512 = 8 sektör eder; hesabı Python ile doğruladık. Bu seçilmiş örnektir, bütün disklerde aynı sektör boyu veya güç kesintisi güvencesi var demiyoruz. Üstteki dosya bloğu ile alttaki aygıt aktarım birimi aynı olmak zorunda değildir.2

17.2 Sürücü: işletim sistemi ile donanım arasındaki tercüman

OSTEP sorunu dosya sistemiyle koyar: dosya sistemini SCSI disklerde, IDE disklerde, USB belleklerde aynı şekilde çalışacak biçimde yazmak istiyoruz; bir okuma ya da yazma isteğinin her aygıtta nasıl verildiğinden habersiz kalmasını istiyoruz.1 Çözüm, Bölüm 1.4'ten tanıdığın soyutlama. En altta, bu bölümdeki çekirdek tabanlı modelde, aygıtın nasıl çalıştığını ayrıntısıyla bilen bir yazılım parçası bulunur: sürücü (device driver). Aygıtla etkileşimin bütün özgül ayrıntıları onun içine kapatılmıştır.1

Hukuk benzetmesi: yabancı dilde ifade veren tanığı dinleyen hâkim yalnızca Türkçe bilir; yeminli tercüman o dilin ayrıntılarını hâkimden saklar. Her yeni dil için yeni tercüman gerekir, mahkeme aynı kalır. Benzetmenin sınırı şudur: sürücü her ayrıntıyı aynen dışarı vermez; ortak bir arayüz sunabilmek için bazı aygıt farklarını gizler.

Dosya sisteminden aygıta inen yol

OSTEP, Linux'un dosya sistemi yığınını kabaca şöyle çizer: uygulama POSIX arayüzüyle (open, read, write, close) dosya sistemine seslenir; dosya sistemi genel blok arayüzüne ("blok oku/yaz") konuşur; genel blok katmanı isteği uygun sürücüye yönlendirir; sürücü aygıta özgü isteği verir.1

Uygulama                                 [kullanıcı alanı]
-- POSIX arayüzü: open, read, write --
Dosya sistemi                            [çekirdek, Bölüm 13.2]
-- genel blok arayüzü: blok oku/yaz --
Genel blok katmanı
-- aygıta özgü arayüz --
Sürücü [SCSI, ATA, ...]
Aygıt (disk)                             [donanım]

Her kat yalnızca bir alttakinin arayüzünü bilir. Şemada ayrıca, özel araçların (dosya sistemi denetleyicisi, disk birleştirme gibi) dosya soyutlamasını atlayıp blokları doğrudan okumasını sağlayan bir ham arayüz (raw interface) de var.1 Böylece Bölüm 16'daki zincir tamamlanır: ad → inode → blok numarası → sürücü → sektörler.

Sürücü aygıtla nasıl konuşur

Sürücünün işi, 17.1'deki üç yazmacı kullanan bir protokolü yürütmektir. OSTEP'in dört adımlı kanonik protokolü:1

Durum == MEŞGUL olduğu sürece bekle      // 1. aygıt hazır mı, tekrar tekrar bak
Veriyi VERİ yazmacına yaz                 // 2. aygıta veriyi ver
Komutu KOMUT yazmacına yaz                // 3. aygıt işe başlar
Durum == MEŞGUL olduğu sürece bekle      // 4. bitti mi, tekrar tekrar bak

İşlemcinin veriyi bizzat taşıdığı bu yönteme programlanmış giriş/çıkış (programmed I/O, PIO) denir. Basit ve çalışır; ama bekleme döngüleri ve veri taşıma işlemciyi meşgul eder. Çaresi 17.3'te.

İşlemci aygıt yazmacına nasıl yazar? OSTEP iki yöntem sayar:1

OSTEP, birinin ötekine belirgin üstünlüğü olmadığını söyler; ikisi de bugün kullanılıyor.1

Üç sınıf: karakter, blok, ağ

Linux'ta sürücülerin sunduğu aygıtlar üç temel sınıfa ayrılır:5

Sınıflar sert değildir: bir USB aygıtı karakter, blok ya da ağ aygıtı olarak görünebilir.5

Bölüm 16'daki izinlerle buluşma: /dev

Karakter ve blok aygıtlarına /dev dizinindeki dosya sistemi girdileriyle ulaşılır.5 "Her şey dosyadır" fikri (Bottom-Up CS): ekran yazılan, klavye okunan bir dosya gibi görülebilir; dosya, veri veren ya da alan her şeyin soyutlamasıdır.4 Bu dosyalar aygıtın kendisi değil, ona erişim kapısıdır.

ls -l çıktısında c karakter aygıtını, b blok aygıtını belirtir; 16.3'teki izin bilgileri bu girdilerde de görünür. Dosya boyu yerine görülebilen ana ve alt numara (major and minor number), geleneksel olarak sürücüyü ve onun yönettiği aygıtı ayırt eder. Böylece insanın gördüğü ad, çekirdeğin ilgili sürücü işlevlerini bulabildiği erişim kaydına bağlanır.6 Komutları çalıştırmayı Bölüm 18'de öğreneceğiz.

Mekanizma ve politika; soyutlamanın bedeli

Linux Device Drivers'ın temel ilkesi: sürücü mekanizma (mechanism) sağlar, politika (policy) değil. Mekanizma "hangi yetenekler sunulacak", politika "bunlar nasıl kullanılacak"tır. Örnek: disket sürücüsü yalnızca disketi sürekli bir blok dizisi gösterir; kimin erişeceğine, dosya sistemi üzerinden mi doğrudan mı erişileceğine üst katmanlar karar verir.5 Benzetme: altyapı kamu hizmetini mümkün kılar, kimin yararlanacağı mevzuatındır; yukarıdaki rw-rw---- bir politikadır.

Soyutlamanın bedeli de olabilir. OSTEP'in tarihsel blok arayüzü örneğinde, SCSI'nin ayrıntılı hata bilgisi üst katlara yalnız genel EIO giriş/çıkış hatası olarak aktarılabilir. Ortak arayüz basitlik sağlar ama aygıtın her özelliğini göstermeyebilir.1 Linux'ta sürücüler çekirdeğe derlenebildiği gibi yüklenebilir modül (loadable kernel module) olarak sonradan da eklenebilir. insmod ve rmmod böyle modül işlemlerinin araçlarıdır; burada yalnız adlarını tanıyoruz, çalıştırmıyoruz.5

17.3 Kesme, yoklama, doğrudan bellek erişimi (DMA)

Protokoldeki iki bekleme döngüsünü hatırla. Bölüm 8.1'deki gecikme farkını sayıya çevirelim. Süreler örnek değerdir (belirli bir aygıtın ölçümü değil), işlemci 3 GHz (saniyede 3 milyar çevrim, Bölüm 5.2):

Beklenen olay (örnek değer)Süreİşlemci çevrimi (3 GHz)
Sabit disk bir blok verir10 ms30.000.000
SSD bir blok verir100 µs300.000

(Süre × 3 × 10⁹, Python ile doğrulandı.) İşlemci bunları bekleme döngüsünde harcarsa, tek bir disk okumasında otuz milyon çevrim çöpe gider. Sorun: işlemci ile aygıtın hızı arasındaki uçurum. İki soruyu ayıralım: sonucu nasıl öğreneceğiz, veriyi kim taşıyacak?

Yoklama: tekrar tekrar sormak

17.2'deki protokolde işletim sistemi, bitip bitmediğini durum yazmacını tekrar tekrar okuyarak anlıyordu. Buna yoklama (polling) denir. Basit ve çalışır, ama OSTEP'in dediği gibi (potansiyel olarak yavaş) aygıtı beklerken çok işlemci zamanı harcar; oysa hazır başka bir sürece geçilebilirdi.1 Benzetme: duruşma sonucunu öğrenmek için kalemin kapısını beş dakikada bir çalmak.

Kesme: aygıt işlemciyi dürtsün

Çözüm kesmedir (interrupt). İşletim sistemi isteği verir, isteği yapan süreci uyutur ve başka işe geçer (bağlam değişimi, Bölüm 14.2). Aygıt işini bitirince bir donanım kesmesi gönderir; işlemci yaptığı işi bırakıp işletim sisteminin önceden belirlenmiş bir koduna atlar: kesme işleyicisi (interrupt handler, ISR). İşleyici isteği tamamlar (veriyi okur, hata kodunu alır) ve bekleyen süreci uyandırır.1 Hesaplama ile giriş/çıkış üst üste biner: disk süreç 1'in isteğini işlerken işlemci süreç 2'yi çalıştırır; çalıştırılabilecek başka iş varsa bekleme süresi yararlı hesapla örtüşebilir.

Bottom-Up CS’in sade kesmeli modelinde mekanizma şöyle: tuşa basılınca olayı işletim sistemine iletmek için kesme üretilir. Aygıtlar anakarttaki ayrı bir çipe, kesme denetleyicisine (programmable interrupt controller, PIC) bağlanır; aygıt kesme istediğinde hattın gerilimini değiştirir (Bölüm 3.1), denetleyici bunu işlemciye mesaj olarak iletir. İşletim sistemi, her kesmeyi atlanacak bir kod adresiyle eşleştiren bir kesme tablosu (interrupt descriptor table) hazırlamıştır; işlemci tabloya bakıp işleyiciyi bulur. İşleyiciyi yazmak sürücü yazarının işidir. Kesme her an gelebileceğinden işletim sistemi işleyiciye girerken yazmaçları kaydeder, çıkarken geri yükler; kaybedilen zaman dışında kesme çalışan programa görünmezdir. Çoğu sürücü işi iki aşamaya böler: kesmeyi onaylayıp işi sıraya koyar, işlemciyi hemen eski işine döndürür, ağır işlemeyi sonra yapar.3

Aynı düzenek içeriden de kullanılır (Bottom-Up CS): geçersiz bellek erişimi gibi işlemci istisnaları, sistem çağrısına tuzakla giriş ve sanal bellek kesmenin akrabalarıdır; Bölüm 13.3'teki sistem çağrısı ve Bölüm 15.3'teki sayfa hatası böyledir.3

Kesme her zaman iyi değildir

"Kesme yoklamayı yener" sonucu yanlıştır. OSTEP’in vurgusu: çok hızlı bir aygıtta kısa yoklama daha ekonomik olabilir; iş hemen bitmişse kesmenin ek maliyeti kazancı aşabilir, çünkü başka sürece geçmek, kesmeyi işlemek, geri dönmek pahalıdır. Hız bilinmiyorsa melez yöntem: kısa süre yokla, bitmediyse kesmeye geç. Ağda daha tehlikeli bir durum vardır: her paket bir kesme üretirse işletim sistemi yalnızca kesmeleri işleyip kullanıcı süreçlerine hiç fırsat veremeyen bir canlı kilitlenmeye (livelock) düşebilir; OSTEP'in örneği, yük patlaması yaşayan bir web sunucusudur. Bir eniyileme kesme birleştirme (interrupt coalescing): aygıt kesmeyi göndermeden biraz bekler, bu sırada biten başka istekler tek kesmede toplanır; bedel gecikmedir.1

DMA: veriyi işlemci taşımasın

Bir sorun daha: PIO'da büyük bir veri bloğu aygıta aktarılırken işlemci veriyi kelime kelime kopyalar. Öğretim hesabı (512 byte sektör ve her kopyada 4 byte varsayımıyla sektör başına 128 kopya): 4096 byte blok = 8 sektör = 8 × 128 = 1024 kopyalama (Python ile doğrulandı). Çözüm doğrudan bellek erişimi (direct memory access, DMA): DMA motoru, aygıtlarla ana bellek arasındaki aktarımı işlemciyi neredeyse hiç karıştırmadan yöneten özel bir aygıttır. İşletim sistemi motora üç şey söyler: verinin bellekte nerede olduğunu, ne kadar kopyalanacağını, hangi aygıta gideceğini; sonra başka işe geçer, aktarım bitince motor kesme gönderir.1 Bottom-Up CS aynı akışı sürücü açısından anlatır.3 İşlemci 1024 ayrı veri kopyasını kendisi yapmak yerine aktarımı hazırlar ve tamamlanmasını yönetir. Bunun tam komut sayısı aygıta ve sürücüye bağlıdır. Benzetme: sekretere "dosyaları taşı, bitince zili çal" demek.

Üç araç, iki ayrı soru

Yoklama ve kesme aynı soruyu cevaplar: bitti mi? (sorarak ya da aygıtın haber vermesiyle). DMA başka soruyu cevaplar: veriyi kim taşıyacak? İkisi birlikte kullanılır: DMA bitince aygıt kesme gönderir. DMA'yı üçüncü bir "haber verme" seçeneği sanmak en sık yanlış haritadır.

Uygulamamızda

Planlanan Go sunucusu ağdan veri alacak, Postgres kalıcı veri yazacak. Örnek bir DMA'lı disk aktarımında dosya sistemi blok isteği üretir; sürücü aktarımı hazırlar; veri bellekteki alandan aygıta taşınır; tamamlanma kesmeyle bildirilebilir. Bekleyen iş sonradan yeniden çalışabilir. Her okuma veya yazmanın mutlaka bu sırayla yeni fiziksel aygıt işlemi yaptığını söylemiyoruz: 16.2'deki tamponlar da aradadır. fsync() kalıcılık isteğidir; DMA tamamlandı bilgisi tek başına verinin güç kesintisinde korunacağını kanıtlamaz. Ağ ve disk bekleyişlerini CPU hesabından ayırmak, “uygulama yavaş” sorusunu doğru kata yerleştirir.1

17.4 Donanım–yazılım ilişkisinin tam tablosu: kat planına dönüş

Bölüm 1.5'te "donanım ile yazılımın sınırı Kat 3 ile 4 arasından geçer" demiş, bunun bir sadeleştirme olduğunu eklemiştik. Sınırın gerçekte nerede kesiştiğini artık görüyoruz: sürücü, yazılımın donanıma dokunduğu yerdir. Ele aldığımız modelde çekirdek kodudur; aygıt arayüzüyle konuşur: yazmaçlar, adresler, bekleme bitleri. Tablo planı giriş/çıkış gözüyle okur:

KatNeGiriş/çıkışta rolü
10UygulamamızSoru cevabını ve puan gibi anlamlı durumu işler.
9Web ve tarayıcıGirdiyi belge olaylarına; belge ve görünümü görüntüye bağlar.
8Ağ ve internetBaşka makinelerle veri alışverişi imkânı sunar; Bölüm 19–20.
7İşletim sistemiSistem çağrıları, sürücüler ve kesme işleyicileriyle kaynak erişimini yönetir.
6Gömülü yazılım ve açılışAçılışın önkoşullarını sağlar; aygıttaki gömülü yazılım çalışma sırasında da iş görebilir.
5Programlama dilleri ve derleyiciSürücünün ve uygulamanın kodunun yazıldığı ve çevrildiği araç düzeyi.
4Makine dili ve assemblyİşlemcinin yürüttüğü yükleme, saklama ve giriş/çıkış komutları.
3İşlemci ve bellekKod yürür, veri tutulur; aygıt aktarımı bu fiziksel düzenle alışveriş yapar.
2Hesap ve hafıza devreleriKontrol ve veri durumlarını fiziksel olarak işler ve saklar.
1Transistör ve mantık kapılarıHesap ve kontrol devrelerinin temel yapı taşları.
0Elektrik ve bitBitleri fiziksel durumlarla temsil eder; ağ ve aygıt sinyallerinin temeli.

İki sonuç: giriş/çıkış tek katta yaşamaz; Kat 7 ise onca çeşitliliği dosyalara, bloklara, paketlere çevirir. Bölüm 1.4'ün "arayüz sabit kaldıkça alttaki kat değişebilir" cümlesinin kanıtı: uyumlu ortak arayüzü sağlayan yeni aygıt, üstteki uygulamayı aygıt ayrıntılarından koruyabilir. Bu, bütün donanım değişimlerinin her zaman yalnız sürücüyle çözüleceği garantisi değildir.

Bir giriş olayının yolculuğu

Bölüm 1.7'deki önizlemeyi (index.html'e çift tıklamak) şimdi açabiliriz. Kesmeli girişin sade modeli (her donanım yolu aynı değildir; özellikle USB gibi bağlantılar ek denetleyici katları içerebilir):

  1. Kat 0–2, aygıt: Klavyenin devresi tuşu bir sinyale çevirir (OSTEP: USB, klavye ve fare gibi düşük hızlı aygıtlar içindir).1
  2. Kat 3, kesme: Aygıt, kesme denetleyicisi üzerinden işlemciye kesme gönderir; Bottom-Up CS tam olarak bu örneği verir.3
  3. Kat 7, sürücü: İşlemci tablodan işleyiciyi bulur; sürücü olayı aygıt yazmaçlarından okur.
  4. Kat 7 → 9: İşletim sistemi olayı odaktaki programa (tarayıcıya) iletir; bu dinlemeyi Bölüm 26'da göreceğiz.
  5. Kat 9–10: Tarayıcı uygun belge olayını oluşturur; uygulamanın dinlediği olay bir düğme etkinleştirmesine karşılık geliyorsa örneğin cevap işlenir. Her tuşun otomatik olarak click olduğu söylenmiyor.
  6. Çıktı, ters yönde: Görüntü piksel renkleri olarak ekran kartına, oradan ekrana gider.1

Bölüm 1.7'deki "çift tıklama bir sürücü aracılığıyla alınır" cümlesi artık açık: fiziksel girdi, aygıt ve işletim sistemi katlarından geçer; kesme, bu modelde haber verme mekanizmasıdır, giriş verisinin kendisi değildir.

Bu bölümde neler kuruldu

Aygıtlar hız ve maliyet yüzünden kademeli yollara bağlanır ve durum, komut, veri yazmaçlarından oluşan bir arayüzün arkasında gizli bir iç yapı taşır. Aygıtın özgül ayrıntılarını bilen çekirdek kodu sürücüdür; sürücü mekanizma sağlar, politikayı üst katlar koyar. Yavaşlık üç araçla yönetilir: yoklama, kesme, DMA. Terimler sözlükte, Bölüm 17 başlığı altında.

Birincil okuma

OSTEP, I/O Devices (PDF'te 36. bölüm), baştan sona; özellikle The Canonical Protocol, Lowering CPU Overhead With Interrupts, More Efficient Data Movement With DMA, Fitting Into The OS: The Device Driver. Derinleşme: Linux Device Drivers, Bölüm 1; Bottom Up CS, Peripherals and buses.

Takıldığın yeri yapay zekâ öğretmenine sor. Alıştırma: ona ls -l /dev/null çıktısını satır satır açıklat; sonra varsa bir disk aygıtı girdisi için aynısını sen yap (komutları Bölüm 18'de öğreneceksin).

Bölüm sonu soruları

Kitaba bakmadan cevapla. Yanlış yaparsan geri bildirim seni ilgili alt bölüme yönlendirir.

1. Giriş/çıkış aygıtları neden hepsi aynı yola bağlanmaz?
OSTEP: sebep fizik ve maliyettir; yol hızlandıkça kısalmak zorundadır, bu yüzden hızlılar yakına, yavaşlar uzağa takılır. Bkz. 17.1.
2. Bir sürücünün temel işlevi aşağıdakilerden hangisidir?
Sürücü aygıta özgü ayrıntıları içine kapatır; dosya sistemi gibi üst katmanlar aygıt türünden habersiz kalır. Bkz. 17.2.
3. Linux'ta bir disk hangi sınıf aygıt olarak sunulur?
Dosya sistemi barındırabilen aygıt blok aygıtıdır (ls -l'de ilk harf b). Bkz. 17.2.
4. "Sürücü mekanizma sağlar, politika değil" ne demektir?
Mekanizma "hangi yetenekler", politika "nasıl kullanılacağı"dır; erişim izni gibi kararlar üstte verilir. Bkz. 17.2.
5. Yoklamanın temel maliyeti nedir?
Yoklamada işlemci durum yazmacını tekrar tekrar okur; o sırada başka süreç çalışamaz. Kesme bu bekleyişi kaldırır. Bkz. 17.3.
6. DMA'nın yoklama ve kesmeden farkı nedir?
DMA "veriyi kim taşıyacak" sorusunu çözer: motor aktarır, işlemci başka işe geçebilir; tamamlanma bu örnekte kesmeyle bildirilir. Bkz. 17.3.
7. Yoğun ağ yükünde her pakete bir kesme neden zararlıdır?
OSTEP buna canlı kilitlenme (livelock) der; çözüm ara sıra yoklamak ya da kesmeleri birleştirmektir. Bkz. 17.3.
8. Kesmeli girişin sade modelinde olay nasıl bildirilir?
Bu modelde aygıt olayı kesmeyle bildirir; işlemci uygun işleyiciye geçer. Gerçek bağlantıda aracı denetleyiciler bulunabilir. Tarayıcı olayı ancak işletim sisteminden alır. Bkz. 17.4.
9. Kendi cümlelerinle: yoklama, kesme ve DMA hangi sorunu çözer? Bir hukuk benzetmesiyle (duruşma sonucunu beklemek, dosya taşımak) anlat.
Örnek cevabı göster

Aygıt işlemciden çok yavaştır. Yoklama "bitti mi?" diye tekrar tekrar sorar; basit, ama bekleyen işlemci başka iş yapamaz (kalemin kapısını beş dakikada bir çalmak). Kesme cevabı aygıta bırakır (zil çalar). DMA başka sorunu çözer: veriyi kim taşıyacak? Motor taşır, işlemci başka işe geçer, bitince kesme gelir (sekretere dosyaları taşıt). Yoklama ve kesme "haber verme", DMA "taşıma" yöntemidir.

Bkz. 17.3.

10. 4096 byte'lık dosya sistemi bloğu, 512 byte'lık sektörlerle ve 4 byte'lık kelimelerle PIO ile diske yazılırken kaç sektör ve kaç kelime kopyası gerekir? DMA ile işlemci neleri yapar? Hesabı göster.
Cevabı göster

4096 ÷ 512 = 8 sektör. Her sektör 512 ÷ 4 = 128 kelime; toplam 8 × 128 = 1024 kelime kopyası (ya da 4096 ÷ 4 = 1024). PIO'da işlemci bu 1024 kopyayı kendi yapar. DMA'da motora üç bilgi yazar (nerede, kaç byte, hangi aygıt), başka işe geçer, bitince kesmeyi işler.

Bkz. 17.4.

Kaynaklar

  1. Remzi H. Arpaci-Dusseau ve Andrea C. Arpaci-Dusseau, Operating Systems: Three Easy Pieces, I/O Devices (bölüm 36, v1.10): kademeli yollar, kanonik aygıt ve protokol, PIO, yoklama, kesme, birleştirme, livelock, DMA, giriş/çıkış komutları, belleğe eşleme, sürücü yığını, EIO, aygıt soyutlaması.
  2. OSTEP, Hard Disk Drives (bölüm 37), The Interface: 512 byte'lık sektörler, 4 KB'lık işlemler, yırtık yazma.
  3. Ian Wienand, Computer Science from the Bottom Up, Peripherals and buses: kesme, denetleyici, tablo, durum kaydetme, istisna ve tuzak, iki aşamalı işleme, NMI, DMA.
  4. Ian Wienand, Computer Science from the Bottom Up, Bölüm 1, Everything is a file!: ekran, klavye, yazıcı, CD-ROM'un dosya soyutlamasıyla görülmesi.
  5. Corbet, Rubini, Kroah-Hartman, Linux Device Drivers, 3. baskı, Bölüm 1, An Introduction to Device Drivers: mekanizma ve politika, modüller, karakter/blok/ağ sınıfları, USB örneği.
  6. Corbet, Rubini, Kroah-Hartman, Linux Device Drivers, 3. baskı, Bölüm 3, Char Drivers: ana ve alt numara, /dev girdileri, ls -l örneği.