Bölüm 10: Dosya Sistemleri
Çoktan Seçmeli · Giriş
Soru 1: Disk Ne Sunar?
Bir disk (HDD ya da SSD) işletim sistemine kendiliğinden neler sunar, dosya sistemi bunun üzerine neler kurar? Aşağıdakilerden hangisi dosya sisteminin sağladığı bir soyutlamadır?
A: Disk yalnızca numaralı bloklar sunar: “k. bloğu oku / yaz”. ECC ve bozuk sektörlerin yeniden eşlenmesi de disk denetleyicisinin içinde yapılır. Adlandırma, dizinler, öznitelikler, koruma ve blokların dosyalara dağıtılması dosya sisteminin işidir.
Adım Adım Çalıştırma · Dosya Kavramı
Soru 2: fork Sonrası Dosya Konumu
Program hatasız çalışıyor. Ne yazdırır? Açık dosya tablosundaki girdileri ve konumlarını izleyin.
harf.txt’nin içeriği 0123456789 (10 bayt). Süreçte yalnız 0, 1, 2 açık (terminal).
open en küçük boş numarayı (3) verir; sistem genelindeki tabloda konumu 0 olan E1 girdisi kurulur.
3 bayt okunur (012); E1’in konumu 3 olur.
fork tanımlayıcı tablosunu kopyalar: çocuğun fd 3’ü de aynı E1 girdisini gösterir; konum ortak, referans sayısı 2.
Çocuk ortak konumdan (3) okur: 34. E1’in konumu 5 olur; bu değişiklik ebeveyn için de geçerlidir.
Çocuk yazdırır.
exit çocuğun tanımlayıcılarını kapatır: E1’in referans sayısı 1’e iner, konum 5 olarak kalır. wait döner.
Aynı dosyayı ikinci kez açmak yeni bir girdi (E2) ve ayrı bir konum (0) verir; fd2 = 4.
fd2 dosyanın başından okur: 01. E1 etkilenmez.
Ebeveyn fd’den okur: konum çocuğun bıraktığı 5’tir → 567, konum 8. Çıktı: cocuk: 34, yeni: 01, ebeveyn: 567.
char b[4]; int n; int fd = open("harf.txt", O_RDONLY); read(fd, b, 3); if (fork() == 0) { n = read(fd, b, 2); b[n] = 0; printf("cocuk: %s\n", b); exit(0); } wait(NULL); int fd2 = open("harf.txt", O_RDONLY); n = read(fd2, b, 2); b[n] = 0; printf("yeni: %s\n", b); n = read(fd, b, 3); b[n] = 0; printf("ebeveyn: %s\n", b);
Çıktı Sorusu · Dosya Kavramı
Soru 3: Bayt Bayt mı, Blok Blok mu?
6 MiB’lık (6 291 456 bayt) bir dosya aşağıdaki döngüyle kopyalanıyor. (a) BUF = 1 ve (b) BUF = 4096 için kaç read ve kaç write çağrısı yapılır? Her çağrının çekirdeğe geçiş maliyeti 0,3 µs ise yalnızca bu ek yük ne kadar sürer?
char buf[BUF]; ssize_t n; while ((n = read(in, buf, BUF)) > 0) write(out, buf, n);
Cevabı göster
Son read 0 döndürür (dosya sonu) ve döngü biter: read sayısı = veri okuması + 1.
(a) 6 291 456 + 1 = 6 291 457 read, 6 291 456 write → 12 582 913 çağrı × 0,3 µs ≈ 3,77 s.
(b) 6 291 456 / 4096 = 1536 tam blok → 1537 read, 1536 write → 3073 çağrı ≈ 0,92 ms.
Fark yaklaşık 4000 kat. 4096 bayt sayfa ve blok boyutuna da denk geldiğinden sayfa önbelleği ve disk de verimli çalışır. Gerçek kodda write’ın kısa yazması ve −1 dönüşleri de denetlenmelidir.
Çoktan Seçmeli · Dizinler
Soru 4: Bu Göreli Yol Nereye Çıkar?
Çalışma dizini /home/elif/odev/os. cat ../../notlar/./bolum10.txt komutu hangi dosyayı açar?
D: Göreli yol çalışma dizininden başlar: ilk .. → /home/elif/odev, ikinci .. → /home/elif, notlar → /home/elif/notlar, . bulunulan dizindir, sonra bolum10.txt. A tek bir .. uygulanmış gibi, B üç .. uygulanmış gibi davranır; C ise .. bileşenlerini yok sayar.
Adım Adım Çalıştırma · Dizinler
Soru 5: Yol Çözümleme
/home/ali/os/rapor.txt dosyasının ilk veri bloğu okunacak. Önbellekte yalnız kök i-node’u var ve her dizin tek bloğa sığıyor. En az kaç disk okuması gerekir?
Yol mutlak: arama kökten başlar. Kök i-node’u bağlama sırasında belleğe alınmıştır, disk okuması gerekmez.
Dizin bloğu 50 okunur, içinde home aranır → i-node 14. (Okuma 1)
i-node 14 okunur: bir dizin, içeriği blok 120’de; dizinde x izni de denetlenir. (Okuma 2)
Dizin bloğu 120 okunur, içinde ali aranır → i-node 37. (Okuma 3)
i-node 37 okunur: bir dizin, içeriği blok 301’de; dizinde x izni de denetlenir. (Okuma 4)
Dizin bloğu 301 okunur, içinde os aranır → i-node 88. (Okuma 5)
i-node 88 okunur: bir dizin, içeriği blok 512’de; dizinde x izni de denetlenir. (Okuma 6)
Dizin bloğu 512 okunur, içinde rapor.txt aranır → i-node 105. (Okuma 7)
i-node 105 okunur: dosyanın kendisi; izinler ve ilk blok adresi (900) buradan. (Okuma 8)
İlk veri bloğu (900) okunur. Toplam 9 disk okuması: 4 bileşen × 2 + 1. İkinci açılışta dentry ve i-node önbelleği bunların çoğunu kaldırır.
ino = 2; // kök i = inode_bellek(ino); for (k = 0; k < 4; k++) { d = blok_oku(i.blok[0]); // dizin içeriği ino = ara(d, ad[k]); i = inode_oku(ino); } v = blok_oku(i.blok[0]); // ilk veri bloğu
Çoktan Seçmeli · Dizinler
Soru 6: Ad Yeniden Oluşturulunca
echo eski > veri.txt, ln veri.txt kati, ln -s veri.txt sembol, rm veri.txt ve son olarak echo yeni > veri.txt çalıştırılıyor. cat kati ve cat sembol ne yazdırır?
A: Katı bağ eski dosyanın i-node’unu gösterir; rm yalnız bir adı silip bağ sayısını 1’e indirdiği için veri “eski” olarak durur. Sembolik bağ ise yalnızca “veri.txt” yolunu saklar: o ada yeni bir dosya (yeni i-node) oluşturulunca sembol artık onu açar. veri.txt yeniden oluşturulmasaydı sembol askıda kalırdı (ENOENT).
Çıktı Sorusu · Dizinler
Soru 7: Bağ Sayılarını Okumak
Boş bir dizinde aşağıdaki komutlar çalıştırılıyor (ext4). stat satırları ne yazdırır? (%h bağ sayısı, %n ad.) Ardından rm d/a yapılırsa d/b ve d/c ne olur?
$ mkdir d $ echo x > d/a $ ln d/a d/b $ ln -s a d/c $ mkdir d/e $ stat -c '%h %n' d d/a d/b d/c d/e
Cevabı göster
3 d 2 d/a 2 d/b 1 d/c 2 d/e
d: üst dizindeki girdi + kendi.girdisi = 2; alt dizine’nin..girdisi de d’yi gösterir → 3.d/aved/baynı i-node’un iki adıdır: 2.d/csembolik bağın kendi i-node’udur (stat bağı izlemez): 1.d/e: d’deki girdi + kendi.= 2.
rm d/a sonrasında d/b’nin bağ sayısı 1 olur ve veri durur; d/c “a” adını aradığı için askıda kalır.
Çıktı Sorusu · Koruma
Soru 8: Sekizli İzinler ve umask
Aşağıdakileri bulun.
chmod 754 betik.shsonrası izinler sembolik olarak nasıl görünür?ls -lçıktısında-rwsr-xr-xgörünen dosyanın sekizli izni nedir?umask 027iken yeni bir dosya (varsayılan 666) ve yeni bir dizin (varsayılan 777) hangi izinleri alır?drwxrwxrwtizinli/tmp’de neden herkes dosya oluşturabildiği hâlde başkasının dosyasını silemez?
Cevabı göster
(a) 7 = rwx, 5 = r-x, 4 = r-- → rwxr-xr--.
(b) s, sahibin x yerinde setuid’in de açık olduğunu gösterir: setuid = 4 → 4755.
(c) umask bitleri kapatır: 666 & ~027 = 640 (rw-r-----), 777 & ~027 = 750 (rwxr-x---). Diğerleri hiçbir şeye erişemez.
(d) Sondaki t, sticky bitidir (1777): dizinde w hakkı olan herkes girdi ekleyebilir, ama bir girdiyi yalnızca dosyanın sahibi (ya da dizinin sahibi, root) silebilir ya da yeniden adlandırabilir.
Çoktan Seçmeli · Koruma
Soru 9: Sahip Neden Yazamıyor?
-r--rw-rw- 1 ali ogr 120 rapor.txt. Kullanıcı ali, ogr grubunun da üyesidir. ali dosyaya yazmaya çalışırsa ne olur?
B: Denetim sırası: sahip mi? → sahip hakları; değilse grupta mı? → grup hakları; değilse diğerleri. İlk eşleşen kullanılır, sonraki sınıflara bakılmaz. ali sahip olduğu için r-- uygulanır ve yazma reddedilir (EACCES). Sahip isterse chmod ile kendine w verebilir; D’deki “her zaman yazar” yalnızca root için doğrudur.
Çoktan Seçmeli · Disk Düzeni
Soru 10: 3 TiB Disk ve MBR
512 bayt sektörlü 3 TiB’lık yeni bir disk MBR bölüm tablosuyla bölümleniyor. Ne olur?
B: MBR bölüm girdileri başlangıç ve uzunluğu 32 bitlik sektör numarasıyla tutar: 2³² × 512 B = 2 TiB. Geri kalan 1 TiB’a bölüm tanımlanamaz. GPT 64 bit LBA kullanır, varsayılan olarak 128 bölüm tanır ve UEFI standardının parçasıdır; 2 TiB üzeri diskler için gereklidir.
Çıktı Sorusu · Disk Düzeni
Soru 11: i-node 100 Diskte Nerede?
Bir dosya sisteminde blok 4 KiB, i-node 256 bayt ve i-node numaraları 0’dan başlıyor. Süperbloğa göre i-node tablosu blok 6’dan başlıyor. Disk 512 baytlık sektörlerle adresleniyor.
- Bir blokta kaç i-node vardır?
- i-node 100 hangi blokta, blok içinde hangi baytta başlar?
- Hangi sektörde, sektör içinde hangi baytta başlar?
Cevabı göster
(a) 4096 / 256 = 16 i-node / blok (bir sektörde 2).
(b) Tablo başından ofset: 100 × 256 = 25 600 = 6 × 4096 + 1024 → tablonun 6. bloğu; disk bloğu = 6 + 6 = blok 12, blok içinde 1024. bayt (o bloğun 4. i-node’u: 100 mod 16 = 4).
(c) Bayt adresi 12 × 4096 + 1024 = 50 176 → 50 176 / 512 = sektör 98, içinde 0. bayt.
Süperbloktaki “i-node tablosu nerede” bilgisi olmadan bu hesap yapılamaz; ext4 ayrıca tabloyu blok gruplarına böler.
Adım Adım Çalıştırma · Tahsis Yöntemleri
Soru 12: FAT Zincirini İzlemek
Küme boyutu 4 KiB. sunum.pptx’in ilk kümesi 5. Dosya hangi kümelerde duruyor ve 9000. bayt hangi kümede? Kümeler 0’dan sayılıyor.
FAT bellekte; 0 boş, — ayrılmış küme. sunum.pptx’in dizin girdisi ilk kümeyi 5 olarak veriyor. 9000. bayt 9000 / 4096 = 2 → mantıksal küme 2.
n = 0: küme 5 dosyanın 0. kümesi. FAT[5] = 9 → sonraki 9.
n = 1: küme 9 dosyanın 1. kümesi. FAT[9] = 2 → sonraki 2.
n = 2: küme 2 dosyanın 2. kümesi — hedef (9000. bayt burada). FAT[2] = 11 → sonraki 11.
n = 3: küme 11 dosyanın 3. kümesi. FAT[11] = EOF → sonraki yok (dosya sonu).
k = EOF, döngü biter. Zincir 5 → 9 → 2 → 11: 4 küme (en fazla 16 KiB), diskte dağınık. 9000. bayt küme 2’de, içinde 9000 − 2 × 4096 = 808. bayt.
k = 5; // ilk küme n = 0; while (k != EOF) { if (n == 9000 / 4096) hedef = k; n++; k = FAT[k]; // bellekteki tablo }
Klasik Soru · Tahsis Yöntemleri
Soru 13: Aynı Blok, Dört Yöntem
1000 bloklu bir dosyanın mantıksal 699. bloğu (0’dan sayarak) okunacak. Dizin girdisi ve i-node bellekte, başka hiçbir şey önbellekte değil. Blok 4 KiB, işaretçi 4 bayt, i-node’da 12 doğrudan, 1 tek, 1 çift, 1 üç dolaylı işaretçi var. Her yöntemde kaç disk okuması gerekir?
- Bitişik tahsis
- Bağlı liste (işaretçi blok içinde)
- FAT (tablo bellekte)
- i-node
Cevabı göster
| yöntem | okuma | neden |
|---|---|---|
| bitişik | 1 | adres = başlangıç + 699 |
| bağlı liste | 700 | 0…698 okunmadan sonraki adres bilinmez |
| FAT | 1 | 699 adım bellekte izlenir, sonra tek okuma |
| i-node | 2 | 699 − 12 = 687 < 1024 → tek dolaylı blok + veri |
Bağlı liste rastgele erişimde O(n) disk okumasıdır; FAT işaretçileri belleğe taşıyarak bunu O(n) bellek adımına indirir ama tablo disk boyutuyla büyür. i-node tablosu yalnızca açık dosyalar için bellektedir; bitişik tahsis en hızlısıdır ama dış parçalanma üretir ve dosya büyüyemez.
Çıktı Sorusu · Tahsis Yöntemleri
Soru 14: Dolaylı Bloklar
Bir i-node’da 10 doğrudan, 1 tek dolaylı ve 1 çift dolaylı işaretçi var. Blok 2 KiB, blok adresi 4 bayt.
- Bir dosya en fazla kaç bayt olabilir? Hangi kısım baskındır?
- 5 000 000 numaralı bayt dosyanın kaçıncı mantıksal bloğunda, hangi işaretçi yoluyla bulunur? i-node bellekteyse kaç disk okuması gerekir?
Cevabı göster
Blok başına işaretçi: 2048 / 4 = 512.
(a) 10 + 512 + 512² = 10 + 512 + 262 144 = 262 666 blok × 2048 = 537 939 968 bayt (yaklaşık 513 MiB). Çift dolaylı kısım (512 MiB) baskındır; doğrudan bloklar yalnız 20 KiB, tek dolaylı 1 MiB kapsar.
(b) ⌊5 000 000 / 2048⌋ = 2441, blok içi 832. bayt. 0–9 doğrudan, 10–521 tek dolaylı; 2441 ≥ 522 → çift dolaylı, sıra 2441 − 522 = 1919 = 3 × 512 + 383: birinci düzeyin 3., ikinci düzeyin 383. girdisi. Okumalar: çift dolaylı blok + tek dolaylı blok + veri = 3.
Çoktan Seçmeli · Dizin Gerçekleştirmesi
Soru 15: Büyük Bir Dizinde Arama
100 000 girdili bir dizinde bir ad aranıyor. Dizin girdilerini tutma yöntemleriyle ilgili hangisi doğrudur?
A: Doğrusal liste basittir ama her arama baştan taranır. Hash, adın özetiyle kovayı seçer; çakışmalar zincirle çözülür ve kova sayısı sabitse büyüyen dizinde zincirler uzar. Hash sırayı korumaz (B yanlış). ext4 htree, NTFS/XFS/Btrfs B+ ağacı kullanır: O(log n) arama ve sıralı listeleme birlikte. Listede silme için girdi boş işaretlenir ya da son girdi taşınır.
Çıktı Sorusu · Boş Alan Yönetimi
Soru 16: Biteşlem ve Sayma
(a) 512 GiB’lık bir disk 4 KiB bloklara bölünmüş. Boş alanı izleyen biteşlem kaç bayt ve kaç blok tutar?
(b) 32 bloklu küçük bir diskte boş bloklar: 3–6, 10–11, 20–24 ve 30. Bunları sayma yöntemiyle (başlangıç, uzunluk) ve biteşlemle (1 = boş, blok 0 en solda) gösterin. Disk çok doluyken hangi gösterim küçük kalır?
Cevabı göster
(a) 512 GiB / 4 KiB = 2³⁹ / 2¹² = 2²⁷ = 134 217 728 blok → 2²⁷ bit = 2²⁴ bayt = 16 MiB = 16 MiB / 4 KiB = 4096 blok (diskin %0,003’ü).
(b) Sayma: (3, 4) (10, 2) (20, 5) (30, 1).
Biteşlem: 00011110 00110000 00001111 10000010
Biteşlem disk ne kadar dolu olursa olsun sabit boyuttadır ve bitişik boş blok bulmayı kolaylaştırır. Liste ve sayma yalnızca boş blokları tuttuğu için disk doluyken küçülür; sayma ayrıca boş alan bitişik parçalar hâlindeyken çok kısadır.
Çoktan Seçmeli · Performans
Soru 17: write() Döndü, Veri Nerede?
Bir program write() ile bir kaydı yazdı ve çağrı başarıyla döndü; iki saniye sonra elektrik kesildi ve kayıt kayboldu. Neden ve kaydı kalıcı kılmanın doğru yolu nedir?
D: Geri yazmalı (write-back) önbellek kirli sayfaları biriktirir; Linux 30 saniyeden eski kirli sayfaları arka planda yazar. fsync (ya da O_SYNC) verinin kalıcı depolamaya ulaşmasını bekler. close() tek başına diske yazmayı garanti etmez. Güvenli kaydetme kalıbı: geçici dosyaya yaz → fsync → rename.
Çıktı Sorusu · Tutarlılık ve Kurtarma
Soru 18: fsck Sayaçları
fsck tüm i-node’ları ve boş blok listesini okuyup her blok için iki sayaç tuttu. Hangi bloklarda sorun var, her biri ne anlama gelir ve nasıl düzeltilir? Hangisi en tehlikelisidir?
| blok | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|---|
| kullanımda | 1 | 0 | 1 | 1 | 0 | 2 | 1 | 0 | 0 | 1 |
| boş listede | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 2 | 0 |
Cevabı göster
Tutarlı durumda her blok için kullanımda + boş = 1’dir. Üç blok bu kuralı bozuyor:
- Blok 7 (0, 0): eksik blok. Zararsız ama alan kaybı; boş listeye eklenir.
- Blok 8 (0, 2): boş listede iki kez. Aynı blok iki dosyaya verilebilirdi; boş liste yeniden kurulur. (Biteşlem kullanılsaydı bu durum oluşamazdı.)
- Blok 5 (2, 0): iki dosya aynı veri bloğunu kullanıyor. En tehlikelisi: blok kopyalanıp dosyalardan birine ayrı blok verilir, kullanıcı bilgilendirilir.
Ayrıca kullanımda ve boş listede aynı anda görünen blok (1, 1) olsaydı boş listeden çıkarılırdı.
Çoktan Seçmeli · Tutarlılık ve Kurtarma
Soru 19: Günlük Nerede Kesildi?
Günlüklemeli bir dosya sisteminde bir işlem şu sırayla yürür: (1) TxB ve değişen meta veri blokları günlüğe, (2) işlem sonu kaydı TxE günlüğe, (3) blokların son yerlerine yazılması, (4) günlük kaydının serbest bırakılması. Elektrik (2) bittikten sonra, (3) sırasında kesiliyor. Açılışta ne olur?
C: TxE diskteyse işlem kesinleşmiştir: kurtarma sırasında günlükteki bloklar son yerlerine yeniden yazılır (redo). Aynı içeriği iki kez yazmak zararsızdır, işlemler eşgüçlüdür. TxE yazılmadan kesilseydi işlem yok sayılırdı (A). Her iki durumda da dosya sistemi tutarlı kalır ve açılış fsck gerektirmeden saniyeler sürer.
Çoktan Seçmeli · VFS ve Ağ
Soru 20: Aynı read(), Farklı Kod
Bir süreç biri ext4’te, biri NFS’te duran iki dosyayı aynı read() çağrısıyla okuyor. Çekirdek doğru kodu nasıl seçer?
C: Bağlama sırasında her dosya sistemi VFS’ye kendi işlem tablolarını verir; open sırasında oluşan file nesnesi bu tabloyu taşır. read çağrısında VFS yalnızca file->f_op->read_iter işaretçisini çağırır: ext4 dosyasında ext4’ün işlevi, NFS dosyasında ağ üzerinden RPC çalışır. Uygulama farkı görmez; ek maliyet yalnızca bir dolaylı çağrıdır.