Bölüm 16: Linux
Çoktan Seçmeli · Tarihçe
Soru 1: Linux Nasıl Doğdu?
Linux çekirdeğinin ortaya çıkışı için hangisi doğrudur?
B: Linux UNIX kodu içermez, POSIX arayüzünü yeniden gerçekleştirir. Torvalds 1991’de MINIX üzerinde kendi monolitik çekirdeğini geliştirdi ve GNU’nun derleyici, kabuk ve araçlarıyla birleştirdi; bu yüzden tam sistem için “GNU/Linux” adı da kullanılır.
Çıktı Sorusu · Boru Hatları
Soru 2: Boru Hattının Çıktısı
Komutlar sırayla çalıştırılıyor. İkinci ve üçüncü komutlar ne yazdırır? uniq -c’den önce neden sort gerekir?
$ printf "ag\ndisk\nag\ncpu\ndisk\nag\n" > olay.txt $ sort olay.txt | uniq -c | sort -rn | head -2 $ uniq -c olay.txt | head -3
Cevabı göster
3 ag
2 disk 1 ag
1 disk
1 aguniq -c yalnız ardışık aynı satırları sayar. sort aynı satırları yan yana getirir: 3 ag, 1 cpu, 2 disk; sort -rn sayıya göre büyükten küçüğe dizer, head -2 ilk iki satırı alır. Sıralanmamış dosyada her satır ayrı bir grup sayılır. Kabuk ilk hatta 4 süreç ve 3 boru kurar; sort, girdinin sonunu (EOF) görmeden çıktı veremez.
Çoktan Seçmeli · Yönlendirme
Soru 3: Yönlendirmenin Sırası
/yok dizini mevcut değil. Hangi komutta ls’in hata iletisi ekrana yazılır, dosyaya gitmez?
D: yönlendirmeler soldan sağa uygulanır. 2>&1 önce stderr’i stdout’un o anki hedefine (terminal) kopyalar; ardından yalnız stdout dosyaya çevrilir. A’da önce stdout dosyaya gider, sonra stderr ona eşlenir; B ikisini birden, C yalnız stderr’i dosyaya yollar.
Klasik Soru · pipe ve dup2
Soru 4: Boru Uçlarını Kapatmak
Kabuk ls | wc -l satırını pipe, fork, dup2 ve exec ile kurar. Adımları sırayla yazın. Kabuk kendi elindeki yazma ucunu kapatmayı unutursa ne olur?
Cevabı göster
pipe(fd): en küçük boş numaralar, okuma ucu 3, yazma ucu 4.- 1. çocuk:
dup2(4, 1), fazla uçları kapatır,exec("ls"). ls hiçbir şey bilmeden boruya yazar. - 2. çocuk:
dup2(3, 0), fazla uçları kapatır,exec("wc"). - Kabuk iki ucu da kapatır ve iki çocuğu
waitile bekler. - Yazma ucu herhangi bir süreçte açık kaldıkça wc EOF görmez: ls bitse bile wc sonsuza dek bekler, kabuk da onu.
Çoktan Seçmeli · Yüklenebilir Modüller
Soru 5: Modül Yüklemek
Linux’ta yüklenebilir çekirdek modülleri (.ko) için hangisi doğrudur?
C: modprobe /lib/modules/$(uname -r)/modules.dep’i okur; insmod bunu yapmaz. Modül çekirdek ayrıcalığıyla, çekirdeğin adres alanında çalışır: hatası tüm sistemi çökertebilir. Yüklemek için CAP_SYS_MODULE gerekir; Secure Boot açıkken imza da doğrulanır.
Çıktı Sorusu · fork
Soru 6: fork Sonrası Değişkenler
Program ne yazdırır? Çıktı sırası her çalıştırmada aynı mıdır?
int main(void) { int x = 5; pid_t p = fork(); if (p == 0) { x += 10; printf("çocuk %d\n", x); exit(0); } waitpid(p, NULL, 0); x -= 1; printf("ebeveyn %d\n", x); return 0; }
Cevabı göster
çocuk 15 ebeveyn 4
fork sonrası iki sürecin adres alanları ayrıdır (sayfalar yazınca kopyalanır): çocuğun x += 10’u ebeveyni etkilemez, ebeveynin x’i 5’ten 4’e iner. Hangi süreç önce CPU alırsa alsın ebeveyn waitpid’de bloke olduğu için sıra her zaman aynıdır. Çocuk çıkış durumu okunana kadar zombidir.
Adım Adım Çalıştırma · Süreç Ağacı
Soru 7: Kaç Süreç Oluşur?
Program kaç tane x yazdırır, ilk süreç dahil kaç süreç çalışır? Süreç ağacını çizin.
a || b: a sıfırdan farklıysa (doğru) b hiç değerlendirilmez. fork çocuğa 0, ebeveyne pozitif PID döndürür.
İlk fork: P’de sonuç pozitif → || kısa devre yapar, koşul doğru. Ç1’de sonuç 0 → ikinci fork değerlendirilmeli.
Ç1 ikinci fork’u çağırır: Ç1’de sonuç pozitif → koşul doğru; yeni Ç3’te sonuç 0 → koşul yanlış, fork yok.
Koşulu doğru olan P ve Ç1 üçüncü fork’u yapar: P → Ç2, Ç1 → Ç4. Ç2 ve Ç4 fork’un hemen sonrasından devam eder.
Beş sürecin her biri printf’i bir kez çalıştırır: 5 satır. Satırların hangi süreçten geldiği sırası belirsizdir.
int main(void) { if (fork() || fork()) fork(); printf("x\n"); return 0; }
Çoktan Seçmeli · Sinyaller
Soru 8: Yakalanamayan Sinyal
Bir süreç sigaction ile hangi sinyal için işleyici kuramaz ya da onu yok sayamaz?
D: SIGKILL ve SIGSTOP yakalanamaz, engellenemez, yok sayılamaz; yönetici süreci her durumda durdurabilsin diye. kill PID varsayılan olarak SIGTERM (15) gönderir: süreç kaynaklarını temizleyip nazikçe çıkabilir. Önce SIGTERM, gerekirse SIGKILL denenir.
Çoktan Seçmeli · Çizelgeleme Sınıfları
Soru 9: Hangi Sınıf Önce?
Aynı CPU’da üç görev hazır: biri SCHED_DEADLINE, biri SCHED_FIFO (öncelik 50), biri normal (SCHED_OTHER, nice −20). Çizelgeleyici önce hangisini çalıştırır?
A: çizelgeleme sınıfları sırayla sorulur: deadline > gerçek zamanlı (FIFO/RR) > adil (EEVDF) > boşta. Üst sınıfta hazır görev varken alttakiler bekler. nice yalnız adil sınıfın içindeki payı etkiler.
Hesaplama Sorusu · EEVDF
Soru 10: nice ve Sanal Çalışma Süresi
Adil sınıfta ağırlıklar: nice 0 → 1024, nice 5 → 335, nice −5 → 3121. Sanal çalışma süresi artışı Δv = gerçek süre × 1024 / ağırlık. (a) Her görev 6 ms çalışırsa vruntime’ı ne kadar ilerler? (b) Sürekli hazır bir nice 0 ve bir nice 5 görevi tek CPU’yu hangi oranda paylaşır?
Cevabı göster
(a) nice 0: 6 × 1024 / 1024 = 6 ms; nice 5: 6 × 1024 / 335 ≈ 18,34 ms; nice −5: 6 × 1024 / 3121 ≈ 1,97 ms.
(b) Pay ağırlıkla orantılıdır: 1024 / (1024 + 335) ≈ %75,3 ve 335 / 1359 ≈ %24,7.
Düşük ağırlıklı görevin vruntime’ı hızlı ilerlediği için daha seyrek seçilir. EEVDF ayrıca yalnız uygun (v ≤ V) görevler arasından en erken sanal son tarihi seçer.
Hesaplama Sorusu · Sayfa Tablosu Yürüyüşü
Soru 11: Sayfa Tablosu İndisleri
x86-64’te 4 KiB sayfa ve 4 düzeyli sayfa tablosu var; her tablo 512 girdilik. Sanal adres 0x00007F3A5C1E2468 için PGD, PUD, PMD ve PTE indisleri ve sayfa içi ofset nedir? PTE çerçeve numarası 0x1A2B3 ise fiziksel adres ne olur? TLB ıskasında kaç ek bellek okuması gerekir?
Cevabı göster
Ofset 12 bit, her indis 9 bit: 47–39 PGD, 38–30 PUD, 29–21 PMD, 20–12 PTE, 11–0 ofset.
| PGD | PUD | PMD | PTE | ofset |
|---|---|---|---|---|
| 254 | 233 | 224 | 482 | 0x468 |
Örneğin PGD = adres >> 39 = 0xFE = 254. Fiziksel adres = 0x1A2B3 × 4096 + 0x468 = 0x1A2B3468.
TLB ıskasında 4 tablo okuması gerekir (5 düzeyli sayfalamada 5). Dev sayfalar (2 MiB, 1 GiB) yürüyüşü kısaltır.
Adım Adım Çalıştırma · Buddy Ayırıcı
Soru 12: Buddy Ayırıcı
32 sayfalık boş bölgede buddy ayırıcı bu istekleri karşılıyor. Her istek hangi sayfaları alır? Hangi serbest bırakmada blok birleşir?
32 sayfalık bölge tek bir order-5 blok. Her order için ayrı boş liste var (o5: başlangıç 0).
A 3 sayfa ister → 4’e yuvarlanır (order 2). 32 bölünür: 16 + 16, 8 + 8, 4 + 4. A 0–3’ü alır; 4, 8 ve 16’daki yarılar listelere eklenir. 1 sayfa iç parçalanma.
B 8 sayfa (order 3): o3 listesinde 8–15 hazır, bölme gerekmez.
C 2 sayfa (order 1): o1 boş; o2’deki 4–7 bölünür: C 4–5’i alır, 6–7 o1 listesine.
B serbest. Kardeşi 8 ⊕ 8 = 0: 0–7 bloğu boş bir order-3 blok değil (A ve C içinde) → birleşme yok.
A serbest. Kardeşi 0 ⊕ 4 = 4: 4–7 bölünmüş, C kullanıyor → birleşme yok; 0–3 o2 listesine.
C serbest: 4–5 + 6–7 → 4–7; + 0–3 → 0–7; + 8–15 → 0–15; + 16–31 → 0–31. Dört birleşmeyle bellek yine tek blok. Kardeş adresi s ⊕ 2order ile bulunur.
a = alloc_pages(3); /* A */ b = alloc_pages(8); /* B */ c = alloc_pages(2); /* C */ free_pages(b); free_pages(a); free_pages(c);
Çoktan Seçmeli · Aygıt Dosyaları
Soru 13: Major ve Minor
ls -l /dev çıktısında brw-rw---- 1 root disk 8, 1 sda1 satırı var. Hangisi doğrudur?
B: baştaki b blok aygıtı (rastgele erişim, sayfa önbelleği ve G/Ç çizelgeleyicisi), c karakter aygıtıdır. Boyut sütunu yerine “major, minor” görünür: major sürücüyü, minor o sürücünün yönettiği birimi (burada sda’nın 1. bölümü) seçer. Ağ arayüzleri /dev’de yoktur.
Adım Adım Çalıştırma · VFS
Soru 14: Paylaşılan Dosya Konumu
kayit.dat en az 200 bayt. Program ne yazdırır?
open bir struct file oluşturur, ilk boş numara 3 ona bağlanır. read konumu 100’e ilerletir; konum (f_pos) fd tablosunda değil, bu nesnededir.
fork çocuğa tanımlayıcı tablosunun kopyasını verir; iki tablo da aynı struct file’ı gösterir (referans 2).
Çocuğun 40 baytlık okuması ortak konumu 140’a ilerletir. Kabukta (cmd1; cmd2) > log bu sayede üst üste yazmaz.
Çocuk biter (referans 1). Ayrı bir open yeni bir struct file (fd 4) verir: konumu bağımsızdır, inode ortaktır. read 10 bayt ilerletir.
Çıktı 140 10. fork paylaşır, ikinci open paylaşmaz.
int fd = open("kayit.dat", O_RDONLY); read(fd, buf, 100); pid_t p = fork(); if (p == 0) { read(fd, buf, 40); _exit(0); } waitpid(p, NULL, 0); int fd2 = open("kayit.dat", O_RDONLY); read(fd2, buf, 10); printf("%ld %ld\n", lseek(fd, 0, SEEK_CUR), lseek(fd2, 0, SEEK_CUR));
Çıktı Sorusu · Bağlar
Soru 15: Katı ve Sembolik Bağ
Komutlar boş bir dizinde sırayla çalıştırılıyor. Her komut ne yazdırır?
$ echo veri > a.txt $ ln a.txt b.txt # katı bağ $ ln -s a.txt c.txt # sembolik bağ $ stat -c %h a.txt # bağ sayısı $ rm a.txt $ cat c.txt $ echo yeni > a.txt $ cat b.txt; cat c.txt $ stat -c %h b.txt
Cevabı göster
2 cat: c.txt: No such file or directory veri yeni 1
- Katı bağ aynı i-node’a ikinci addır: bağ sayısı 2.
rmyalnız adı siler, sayaç 1’e iner, veri kalır. - Sembolik bağ hedefin yolunu tutar: a.txt silinince bağ sarkar.
- Yeni a.txt yeni bir i-node’dur: c.txt yol üzerinden ona ulaşır (“yeni”), b.txt eski i-node’u göstermeye devam eder (“veri”).
Hesaplama Sorusu · İzin Hesapları
Soru 16: umask ve chmod
umask 033 iken (a) touch not.txt ile oluşan dosyanın, (b) mkdir arsiv ile oluşan dizinin izni nedir? (c) “666 − 033 = 633” hesabı neden yanlıştır? (d) İzni 640 olan bir dosyaya chmod u+x,g+w,o+r uygulanırsa?
Cevabı göster
Yeni dosya 666, yeni dizin 777 ister; umask’taki bitler silinir: istenen & ~umask.
(a) 666 & ~033 = 644 → rw-r--r--. (b) 777 & ~033 = 744 → rwxr--r--: grup ve diğerleri dizini listeleyebilir ama içine giremez.
(c) umask bit temizler, çıkarma yapmaz. 033’ün x bitleri dosyada zaten yoktur; çıkarma 633’ü (rw--wx-wx) verir ve yanlış bitleri açar.
(d) Sembolik mod mevcut bitlere ekler: rw- + x = rwx (7), r-- + w = rw- (6), --- + r = r-- (4) → 764, rwxrw-r--.
Çoktan Seçmeli · Erişim Denetimi
Soru 17: İzin Denetiminin Sırası
proje.txt’nin izni ----rwxr-- (0074), sahibi ali, grubu dev; ali de dev grubunun üyesi. ali, veli (dev üyesi) ve ayse (başka grup) dosyayı okumaya çalışıyor. Kimler okuyabilir?
A: çekirdek ilk eşleşen sınıfa bakar. euid sahibe eşitse yalnız sahip bitleri (---) kullanılır, grup üyeliğine hiç bakılmaz: ali okuyamaz. veli grup bitlerini (rwx), ayse diğer bitlerini (r--) alır; ikisi de okur. Sahip izni chmod ile kendine geri verebilir.
Çoktan Seçmeli · Konteynerler
Soru 18: Ad Alanı mı, cgroup mu?
Bir konteynerin (a) yalnız kendi süreçlerini görmesini ve içeride PID 1 olmasını, (b) en çok 512 MB bellek kullanmasını hangi Linux özellikleri sağlar?
B: ad alanları ne görüleceğini (PID, bağlama, ağ, ana makine adı, kullanıcı eşlemesi), cgroups ne kadar kullanılacağını (cpu.max, memory.max, pids.max) belirler. seccomp sistem çağrılarını, SELinux/AppArmor erişimi kısıtlar. İçerideki PID 1 konakta sıradan bir PID’dir.
Çoktan Seçmeli · Android
Soru 19: Android Kum Havuzu
Android’de bir uygulamanın verisini diğer uygulamalardan ayıran temel mekanizma hangisidir?
C: zygote fork eder, çocuk uygulamanın benzersiz uid’ine, SELinux bağlamına ve seccomp filtresine geçer; dosya izinleri bu uid’e göre denetlenir. Binder, arayanın uid’ini hizmete iletir ki hizmet izni denetleyebilsin. Android’de glibc yoktur, C kütüphanesi Bionic’tir.