Bölüm 11: Giriş/Çıkış
Çoktan Seçmeli · Giriş
Soru 1: Hangi Eşleştirme Yanlış?
İşletim sistemleri aygıtları blok, karakter ve ağ aygıtı olarak sınıflandırır. Aşağıdaki eşleştirmelerden hangisi yanlıştır?
C: Fare hareket ve tık olaylarını bir akış olarak üretir; adreslenebilir blokları ve lseek’i yoktur, bu yüzden karakter aygıtıdır (Linux’ta /dev/input/event*). Blok aygıtında her blok numarasıyla bağımsız okunup yazılır ve dosya sistemleri bunların üstüne kurulur. Ağ arabirimleri ayrı bir sınıftır ve /dev’de dosyaları yoktur.
Çoktan Seçmeli · G/Ç Donanımı
Soru 2: Bitmeyen Bekleme Döngüsü
Bellek eşlemeli bir aygıtın durum yazmacını while ((*durum & HAZIR) == 0) ; döngüsüyle okuyan sürücü, aygıt hazır olduğu hâlde döngüden hiç çıkmıyor. En olası neden hangisidir?
D: Aygıt yazmacının değeri CPU’nun haberi olmadan değişir. Sayfa önbelleklenebilir işaretliyse CPU önbellekteki eski değeri, işaretçi volatile değilse derleyici döngü dışına aldığı tek okumayı görür. Çözüm: yazmaç sayfasını önbelleklenemez eşlemek (ioremap) ve volatile kullanmak. Bellek eşlemeli yazmaç sıradan yükleme komutlarıyla okunur; B kapı eşlemeli G/Ç’ye aittir.
Çıktı Sorusu · Programlanmış G/Ç
Soru 3: Yoklamanın CPU’ya Maliyeti
2 GHz’lik bir CPU’da bir yoklama (durumu oku, karşılaştır, veriyi al) 400 tur sürüyor. Aşağıdaki aygıtlar yalnızca yoklamayla izlenirse CPU zamanının yüzde kaçı gider?
- Hareketi kaçırmamak için saniyede 30 kez yoklanan bir fare
- 100 MB/s (1 MB = 10⁶ B) veri üreten ve her yoklamada 16 bayt veren bir disk denetleyicisi
Sonuçlar hangi aktarım yöntemini gerektiriyor?
Cevabı göster
Oran = (yoklama/s × tur/yoklama) / (tur/s).
(a) 30 × 400 = 12 000 tur/s → 12 000 / 2 × 10⁹ = %0,0006: önemsiz.
(b) 100 × 10⁶ / 16 = 6,25 × 10⁶ yoklama/s × 400 = 2,5 × 10⁹ tur/s → %125: CPU’nun tamamı bile yetmez.
Yavaş ve seyrek aygıtta yoklama zararsızdır; yüksek hızlı blok aktarımında ise ne yoklama ne de bayt başına kesme uygundur. Çözüm DMA’dır: CPU yalnızca kurulum ve tamamlanma kesmesiyle uğraşır.
Çoktan Seçmeli · Kesmeler
Soru 4: Kesme Geldiğinde Sıra
Süreç A çalışırken B’nin beklediği disk okuması bitiyor. Adımlar karışık verilmiş:
P: Donanım PC ve PSW’yi çekirdek yığınına kaydeder, çekirdek moduna geçer.
Q: Disk kesme isteği gönderir; CPU o anki komutu bitirir.
R: Vektör numarası IDT’de indis olur, işleyici adresi bulunur.
S: İşleyici aygıtı onaylar (EOI), B’yi hazır kuyruğuna alır.
T: Çizelgeleyici bir süreç seçer, iret ile kullanıcı moduna dönülür.
Doğru sıra hangisidir?
B: Önce aygıt kesme ister ve CPU komut sınırında durur (Q). Donanım dönüş için gereken durumu kaydeder (P), vektörle işleyiciyi bulur (R). İşleyici kısa tutulur: aygıtı onaylar, bekleyen B’yi hazır yapar (S). Sonunda çizelgeleyici A’yı ya da B’yi seçer ve iret ile dönülür (T). C, durumu kaydetmeden işleyiciye atlar; dönüş adresi kaybolurdu.
Çıktı Sorusu · DMA
Soru 5: Sektör Başına Kesme mi, DMA mı?
Bir disk denetleyicisinden 1 MiB veri okunuyor.
- Kesme güdümlü yöntemde her 512 baytlık sektör için bir kesme geliyor; işleyici sektörü belleğe kopyalayarak toplam 4 µs harcıyor.
- DMA ile CPU kurulumu 6 µs’de yapıyor; aktarım sonunda tek bir 4 µs’lik kesme geliyor.
CPU’nun bu okuma için harcadığı süreleri karşılaştırın. DMA hangi durumda kendini geri ödemez?
Cevabı göster
(a) 1 MiB = 1 048 576 B → 1 048 576 / 512 = 2048 kesme × 4 µs = 8192 µs (yaklaşık 8,2 ms).
(b) 6 + 4 = 10 µs. CPU yükü yaklaşık 800 kat azalır. Aktarım sırasında DMA veri yolunu ara ara kullandığından CPU’nun bellek erişimleri biraz bekleyebilir (döngü çalma), ama bu kopyalama maliyetinin yanında küçüktür.
Birkaç baytlık aktarımlarda sabit kurulum maliyeti kazancı aşar; aygıt çok yavaşsa ya da CPU’nun başka işi yoksa kesme güdümlü G/Ç veya yoklama daha basit ve yeterli olabilir.
Çoktan Seçmeli · DMA
Soru 6: Döngü Çalma Nedir?
DMA bağlamında “döngü çalma” (cycle stealing) kavramını en iyi anlatan ifade hangisidir?
A: Döngü çalma bir DMA çalışma modudur: denetleyici her sözcük için veri yolunu birkaç turluğuna alır, CPU tamamen durmaz, yalnızca belleğe erişirken biraz yavaşlar. Karşıtı patlama (burst) modudur: yol bir blok boyunca tutulur, aktarım hızlanır ama CPU daha uzun bekler.
Çıktı Sorusu · G/Ç Yazılımı
Soru 7: Tamponsuz, Tek ve Çift Tampon
Bir aygıttan bir bloğun gelmesi T = 8 ms, sürecin bir bloğu işlemesi C = 5 ms, tampondan kullanıcı alanına kopyalama M = 1 ms sürüyor. Kararlı durumda blok başına süreyi ve 100 blok için yaklaşık toplam süreyi bulun:
- tamponsuz,
- tek tamponla,
- çift tamponla.
Daha fazla tampon eklemek sonucu iyileştirir mi?
Cevabı göster
(a) Tamponsuz: okuma ve işleme sırayla yapılır → T + C = 13 ms → yaklaşık 1300 ms.
(b) Tek tampon: sonraki blok çekirdek tamponuna gelirken önceki işlenir, ama kopyalama sırasında tampon meşguldür → max(T, C) + M = 8 + 1 = 9 ms → yaklaşık 900 ms.
(c) Çift tampon: biri dolarken diğeri kopyalanır, kopyalama da örtüşür (C + M = 6 ≤ T) → max(T, C) = 8 ms → yaklaşık 800 ms.
Artık darboğaz aygıttır (T > C): daha fazla tampon ortalama hızı artırmaz, yalnızca ani patlamaları emer.
Adım Adım Çalıştırma · G/Ç Yazılımı
Soru 8: Dairesel Tampon
Kesme işleyicisi koy ile yazıyor, süreç al ile okuyor. Baş, kuyruk ve tampon nasıl değişir? Hangi çağrı başarısız olur?
N = 6, baş = kuyruk: boş. Bir yuva hep boş kalır (en çok 5 bayt). Çağrılar: koy a, b, c, d; üç kez al; koy e, f, g, h, i.
koy('a'): yuva 0’ye yazılır, kuyruk 1 olur.
koy('b'): yuva 1’ye yazılır, kuyruk 2 olur.
koy('c'): yuva 2’ye yazılır, kuyruk 3 olur.
koy('d'): yuva 3’ye yazılır, kuyruk 4 olur.
al(): baş = 0 ≠ kuyruk → yuva 0’deki a okunur, baş 1 olur. Yuva yeniden kullanılabilir.
al(): baş = 1 ≠ kuyruk → yuva 1’deki b okunur, baş 2 olur. Yuva yeniden kullanılabilir.
al(): baş = 2 ≠ kuyruk → yuva 2’deki c okunur, baş 3 olur. Yuva yeniden kullanılabilir.
koy('e'): yuva 4’ye yazılır, kuyruk 5 olur.
koy('f'): yuva 5’ye yazılır, kuyruk 0 olur. Sona gelince başa sarar (mod 6).
koy('g'): yuva 0’ye yazılır, kuyruk 1 olur. Daha önce okunmuş yuva yeniden kullanılıyor.
koy('h'): yuva 1’ye yazılır, kuyruk 2 olur. Daha önce okunmuş yuva yeniden kullanılıyor.
koy('i'): (kuy + 1) % 6 = 3 = baş → tampon dolu, −1 döner. Üretici beklemeli ya da veriyi düşürmelidir. Tüketilen sıra: a, b, c.
int koy(char c) { if ((kuy + 1) % N == bas) return -1; // dolu tam[kuy] = c; kuy = (kuy + 1) % N; return 0; } int al(char *c) { if (bas == kuy) return -1; // boş *c = tam[bas]; bas = (bas + 1) % N; return 0; }
Çoktan Seçmeli · G/Ç Arayüzleri
Soru 9: Hemen Dön, Bitince Haber Ver
Bir sunucu programı okuma isteğini çekirdeğe verip hemen dönmek, işlem bittiğinde ise bir tamamlanma kaydı almak istiyor (io_uring gibi). Bu hangi G/Ç modelidir?
C: Eş zamansız (tamamlanma) modelinde çağrı işi başlatıp döner; çekirdek iş bitince tamamlanma kuyruğuna kayıt ekler (io_uring CQE, Windows IOCP). Bloke etmeyen modelde çağrı yalnızca “şu an ne varsa” döner ve iş yine sürece kalır; epoll da yalnızca hazır olmayı bildirir. Bedeli, programlamanın karmaşıklaşmasıdır: tamponların ömrü ve hata yolları ayrıca izlenmelidir.
Çıktı Sorusu · Saatler ve Diğer Aygıtlar
Soru 10: Bekleyen Alarmlar ve Saat Sayacı
Saat yazılımı bekleyen alarmları, her girdinin bir öncekine göre farkını tutan bir listede saklıyor. Şu an zaman 5000 tık; alarmlar 5003, 5010, 5010, 5018 ve 5025’te.
- Liste hangi sayıları tutar?
- 10 tık sonra hangi alarmlar tetiklenmiş olur, liste ne olur?
- 8254 PIT 1 193 182 Hz ile sayıyor. 250 Hz’lik tik için sayaç ne yüklenir, gerçek frekans ne olur?
Cevabı göster
(a) Farklar: 5003 − 5000 = 3, 5010 − 5003 = 7, 5010 − 5010 = 0, 5018 − 5010 = 8, 5025 − 5018 = 7 → 3, 7, 0, 8, 7.
(b) Her tikte yalnızca baştaki sayı azaltılır: 3 tikte ilk alarm (5003) tetiklenir; 7 tik daha geçince 5010’daki iki alarm birlikte (ikincisinin farkı 0). Kalan liste 8, 7 (5018 ve 5025). Tik başına iş, alarm sayısından bağımsız olarak sabittir.
(c) 1 193 182 / 250 = 4772,7 → sayaç 4773; gerçek frekans 1 193 182 / 4773 ≈ 249,99 Hz. Linux’ta HZ = 250 tik başına 4 ms demektir; tiksiz çekirdek boşta bu kesmeleri durdurur.
Çıktı Sorusu · Diskler
Soru 11: Bir Disk İsteği Ne Kadar Sürer?
10 000 dev/dk dönen bir HDD’nin ortalama arama süresi 4 ms, ortam hızı 250 MB/s (1 MB = 10⁶ B).
- Rastgele bir konumdan 64 KiB’lık (65 536 B) ardışık veri okumak ortalama ne kadar sürer?
- Aynı miktar veri diske dağılmış 16 adet 4 KiB’lık bloktan okunursa?
- Aktarım hızını 250’den 500 MB/s’ye çıkarmak (b)’yi ne kadar hızlandırır?
Cevabı göster
Erişim süresi = arama + dönme gecikmesi + aktarım. Bir tur 60 000 / 10 000 = 6 ms → ortalama dönme gecikmesi yarım tur = 3 ms.
(a) Aktarım 65 536 / 250 × 10⁶ s = 0,262 ms → 4 + 3 + 0,262 = 7,26 ms.
(b) Blok başına 4 + 3 + 0,016 = 7,016 ms → 16 × 7,016 = 112,3 ms: yaklaşık 15 kat yavaş.
(c) Aktarım payı 16 × 0,016 = 0,26 ms’den 0,13 ms’ye iner: toplamın yalnızca %0,1’i. Küçük rastgele okumada süreye arama ve dönme hâkimdir; yerleşim, önbellek ve kol çizelgeleme bu yüzden önemlidir.
Adım Adım Çalıştırma · Disk Çizelgeleme
Soru 12: SSTF ile Kafa Hareketi
Kafa 84. silindirde. SSTF istekleri hangi sırayla karşılar, toplam kafa hareketi kaç silindir olur?
Silindirler 0–199, kafa 84’te. Bekleyen istekler (geliş sırasıyla): 184, 142, 170, 8, 60, 155, 116, 37. Kırmızı: bekleyen, yeşil: hizmet verilmiş.
84 → 60: 24 silindir, toplam 24. En yakın 60 (24 uzakta), 116 ise 32 uzakta.
60 → 37: 23 silindir, toplam 47.
37 → 8: 29 silindir, toplam 76.
8 → 116: 108 silindir, toplam 184. Alt bölge bitti; kafa en yakın kalan isteğe, uzaktaki 116’ya gider.
116 → 142: 26 silindir, toplam 210.
142 → 155: 13 silindir, toplam 223.
155 → 170: 15 silindir, toplam 238.
170 → 184: 14 silindir, toplam 252. Toplam 252 silindir (FCFS 597).
konum = 84; toplam = 0; while (bekleyen > 0) { r = en_yakin(konum); // en yakın istek toplam += abs(r - konum); konum = r; hizmet_ver(r); }
Çıktı Sorusu · Disk Çizelgeleme
Soru 13: Tarama Algoritmaları
Aynı kuyruk: kafa 84’te ve son olarak 70’e hizmet verdiği için yukarı (büyük numaralara doğru) gidiyor. İstekler 184, 142, 170, 8, 60, 155, 116, 37; silindirler 0–199. FCFS, SCAN, C-SCAN, LOOK ve C-LOOK için kafanın izlediği yolu ve toplam hareketi bulun (C-SCAN ve C-LOOK’ta geri dönüş de sayılsın). SSTF’nin 252’siyle birlikte sıralayın.
Cevabı göster
| algoritma | kafanın yolu | toplam |
|---|---|---|
| FCFS | 184 → 142 → 170 → 8 → 60 → 155 → 116 → 37 | 597 |
| SCAN | 116 → 142 → 155 → 170 → 184 → 199 → 60 → 37 → 8 | 306 |
| C-SCAN | 116 → 142 → 155 → 170 → 184 → 199 → 0 → 8 → 37 → 60 | 374 |
| LOOK | 116 → 142 → 155 → 170 → 184 → 60 → 37 → 8 | 276 |
| C-LOOK | 116 → 142 → 155 → 170 → 184 → 8 → 37 → 60 | 328 |
SCAN: (199 − 84) + (199 − 8) = 306. C-SCAN: 115 + 199 + 60 = 374 (dönüş sayılmazsa 175). LOOK: 100 + 176 = 276. C-LOOK: 100 + 176 + 52 = 328.
Sıralama: SSTF 252 < LOOK 276 < SCAN 306 < C-LOOK 328 < C-SCAN 374 < FCFS 597. LOOK, SCAN’den yalnızca uca (199) boşuna gitmemesiyle ayrılır; C-SCAN ve C-LOOK daha uzun yol alır ama bekleme sürelerini daha eşit dağıtır.
Çoktan Seçmeli · Disk Çizelgeleme
Soru 14: Dakikalardır Bekleyen İstek
Yoğun yük altındaki bir diskte istekler sürekli 90–110 silindirleri arasında geliyor; 190. silindirdeki bir istek dakikalardır bekliyor. Kullanılan algoritma ve sorunun adı nedir?
A: SSTF her adımda kafaya en yakın isteği seçer: toplam hareketi azaltır ama adil değildir; orta bölgeye sürekli istek gelirse uçtaki istek hiç sıra almaz. SCAN, C-SCAN ve LOOK ailesi kafayı bir yönde son isteğe kadar götürdüğü için her isteğe bir tarama içinde hizmet verir. FCFS ise açlıksızdır.
Çoktan Seçmeli · SSD ve NVMe
Soru 15: NVMe’de Neden “none”?
Linux’ta NVMe SSD’ler için varsayılan G/Ç çizelgeleyicisi none’dır (istekleri sıralamaz). Bunun nedeni nedir?
D: Kol çizelgeleme arama süresini azaltmak için vardır. SSD’de erişim süresi konumdan neredeyse bağımsızdır; NVMe’nin çoklu donanım kuyrukları (blk-mq) her çekirdeğe ayrı kuyruk verir. Adalet ya da gecikme hedefi gerekirse mq-deadline, bfq ya da kyber seçilebilir; SATA HDD’lerde mq-deadline yaygın varsayılandır.
Adım Adım Çalıştırma · RAID ve Kararlı Depolama
Soru 16: XOR Eşliği
Eşlik bloğu nasıl hesaplanır, D2’nin diski bozulunca D2 nasıl geri kazanılır ve D1 güncellenince yeni eşlik nasıl bulunur?
Dört veri diskli bir RAID 5 şeridi (8 bitlik örnek bloklar). Eşlik bloğu P henüz hesaplanmadı.
Bit bit XOR: bitler farklıysa 1, aynıysa 0. D0 ⊕ D1 = 11101010.
⊕ D2 = 00001011.
⊕ D3 = 00110001. Her bit konumunda 1’lerin sayısı artık çift.
D2’nin diski bozuldu. Hangi diskin kaybolduğu bilindiği için tek eşlik yeterlidir.
x ⊕ x = 0 olduğundan kayıp blok kalanların XOR’udur: D0 ⊕ D1 ⊕ D3 ⊕ P = 11100001, özgün D2 ile aynı.
D1, Y = 01010101 olacak. Şeridin tamamını okumadan: değişen bitler D1 ⊕ Y = 00001001; P ⊕ bu = 00111000.
D1 ve P yazılır. Küçük yazma = 2 okuma (eski D1, eski P) + 2 yazma: RAID 5’in 4 G/Ç’lik bedeli.
P = D0 ^ D1; P = P ^ D2; P = P ^ D3; // eşlik // D2'nin diski bozuldu D2 = D0 ^ D1 ^ D3 ^ P; // küçük yazma: D1 → Y P = P ^ D1 ^ Y; D1 = Y;
Çoktan Seçmeli · RAID ve Kararlı Depolama
Soru 17: Altı Diskle RAID 6
Elinizde 6 adet 4 TB’lık disk var ve RAID 6 dizisi kuruluyor. Kullanılabilir kapasite ve aynı anda kesinlikle dayanılabilen disk arızası sayısı nedir?
B: RAID 6 her şeritte iki eşlik bloğu (P: XOR, Q: Reed–Solomon) tutar: kapasite (n − 2) × 4 = 16 TB, iki disk kaybına dayanır. 20 TB / 1 disk RAID 5’tir; 12 TB RAID 10’dur ve yalnızca 1 arızayı garanti eder (farklı çiftlerden 3 diske kadar şanslı durum). Büyük disklerde yeniden kurma saatler sürdüğü için ikinci arıza riski RAID 6’yı cazip kılar.
Çıktı Sorusu · RAID ve Kararlı Depolama
Soru 18: Küçük Rastgele Yazmalar
Tek bir disk 120 rastgele IOPS veriyor. 6 diskli dizide küçük rastgele yazma hızı (IOPS) nedir?
- RAID 0
- RAID 10 (3 aynalı çift)
- RAID 4
- RAID 5
- RAID 6
Disk sayısı 12’ye çıkarsa hangisi hiç hızlanmaz?
Cevabı göster
| düzen | yazma başına G/Ç | IOPS |
|---|---|---|
| RAID 0 | 1 | N·R = 720 |
| RAID 10 | 2 (iki kopya) | N·R / 2 = 360 |
| RAID 4 | 4, ikisi hep eşlik diskinde | R / 2 = 60 |
| RAID 5 | 4 (2 oku + 2 yaz), disklere yayılır | N·R / 4 = 180 |
| RAID 6 | 6 (3 oku + 3 yaz) | N·R / 6 = 120 |
RAID 4’te her küçük yazma tek eşlik diskinde bir okuma ve bir yazma ister: dizi o diskin yarı hızına iner ve disk eklemek hiç işe yaramaz (12 diskte yine 60). RAID 5 aynı 4 G/Ç’yi tüm disklere dağıttığı için disk sayısıyla büyür (12 diskte 360).
Klasik Soru · RAID ve Kararlı Depolama
Soru 19: Kararlı Yazma Yarıda Kalırsa
Kararlı depolamada bir blok önce disk 1’e yazılıp geri okunarak doğrulanıyor, sonra aynısı disk 2’ye yapılıyor. Kurtarma sırasında iki kopya karşılaştırılıyor; bozuk blok ECC ile fark ediliyor.
CPU çökmesi (a) disk 1’e yazılırken, (b) disk 1 yazıldıktan sonra ama disk 2’ye başlamadan, (c) disk 2’ye yazılırken olursa kurtarma ne yapar? Sonuç her durumda neden ya tamamen eski ya tamamen yenidir? RAID 1 bunu neden tek başına sağlamaz?
Cevabı göster
- (a) Disk 1’deki blok yarım yazılmıştır, ECC hatası verir; eski değer disk 2’den disk 1’e kopyalanır → eski.
- (b) İki kopya da geçerli ama farklı; kural: disk 1 kazanır, yeni değer disk 2’ye yazılır → yeni.
- (c) Disk 2 bozuk (ECC), disk 1 yeni ve geçerli; yeni değer disk 2’ye kopyalanır → yeni.
Yazma sırası sabit olduğundan herhangi bir anda en az bir kopya ya tamamen eski ya tamamen yeni ve geçerlidir; kurtarma o kopyayı diğerine yayar. RAID 1 iki diske aynı anda yazar ve hangisinin “doğru” olduğuna dair bir sıra tutmaz: bozulan sektöre karşı korur, yazma sırasında çökmeye karşı korumaz. Bugün aynı fikir günlükleme, yazma bariyerleri/FUA ve güç kaybı korumalı SSD’lerle uygulanır.