Bölüm 16: Linux

Bölüm 16: Linux · Çalışma Soruları
Tarihçe ve kabukÇekirdek ve modüllerSüreçler ve sinyallerÇizelgelemeBellekG/Ç ve dosyalarİzinler ve konteynerlerAndroid
Sercan KÜLCÜ

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

uniq -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 wait ile 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.

P

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.

fork 1PÇ1

İlk fork: P’de sonuç pozitif → || kısa devre yapar, koşul doğru. Ç1’de sonuç 0 → ikinci fork değerlendirilmeli.

fork 1fork 2PÇ1Ç3

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

fork 1fork 3fork 2fork 3PÇ1Ç3Ç2Ç4

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.

fork 1fork 3fork 2fork 3PÇ1Ç3Ç2Ç4

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.

PGDPUDPMDPTEofset
2542332244820x468

Ö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?

3208162432boş listeler o5: 0

32 sayfalık bölge tek bir order-5 blok. Her order için ayrı boş liste var (o5: başlangıç 0).

A 4481608162432boş listeler o2: 4 o3: 8 o4: 16

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.

A 44B 81608162432boş listeler o2: 4 o4: 16

B 8 sayfa (order 3): o3 listesinde 8–15 hazır, bölme gerekmez.

A 4C 22B 81608162432boş listeler o1: 6 o4: 16

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.

A 4C 2281608162432boş listeler o1: 6 o3: 8 o4: 16

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.

4C 2281608162432boş listeler o1: 6 o2: 0 o3: 8 o4: 16

A serbest. Kardeşi 0 ⊕ 4 = 4: 4–7 bölünmüş, C kullanıyor → birleşme yok; 0–3 o2 listesine.

3208162432boş listeler o5: 0

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?

ebeveyn fdçocuk fdfd 3struct file (açık dosya)F1f_pos = 100 · ref 1inode

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.

ebeveyn fdçocuk fdfd 3fd 3struct file (açık dosya)F1f_pos = 100 · ref 2inode

fork çocuğa tanımlayıcı tablosunun kopyasını verir; iki tablo da aynı struct file’ı gösterir (referans 2).

ebeveyn fdçocuk fdfd 3fd 3struct file (açık dosya)F1f_pos = 140 · ref 2inode

Çocuğun 40 baytlık okuması ortak konumu 140’a ilerletir. Kabukta (cmd1; cmd2) > log bu sayede üst üste yazmaz.

ebeveyn fdçocuk fdfd 3fd 4struct file (açık dosya)F1f_pos = 140 · ref 1F2f_pos = 10 · ref 1inode

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

ebeveyn fdçocuk fdfd 3fd 4struct file (açık dosya)F1f_pos = 140 · ref 1F2f_pos = 10 · ref 1inode

Çı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. rm yalnı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.

Son

Bölüm 16: Linux: Çalışma Soruları
Konu anlatımı: Linux sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.