Bölüm 5: CPU Çizelgeleme

İşletim Sistemleri
CPU–G/Ç döngüsüDağıtıcı ve bağlam değiştirmeÇizelgeleme ölçütleri FCFS ve konvoy etkisiSJF, SRTF, üstel ortalamaÖncelik ve yaşlanma Round Robin ve kuantumMLQ ve MLFQPiyango, stride, adil paylaşım Çok işlemcili çizelgelemeGerçek zamanlı: RM ve EDFLinux EEVDF, Windows
Sercan KÜLCÜ · Giresun Üniversitesi · Bilgisayar Mühendisliği

Giriş

Öğrenme Çıktıları

Kavramlar

CPU–G/Ç patlama döngüsünü, çizelgeleme karar noktalarını, kesmeli ve kesmesiz çizelgelemeyi ve dağıtıcının görevini açıklamak.

Ölçütler

Bekleme, dönüş ve yanıt sürelerini Gantt şemasından hesaplamak; verim, CPU kullanımı ve adalet hedeflerini tartmak.

Algoritmalar

FCFS, SJF, SRTF, öncelik, RR, MLQ ve MLFQ algoritmalarını aynı süreç kümesi üzerinde adım adım uygulamak ve karşılaştırmak.

Tahmin ve adalet

Sonraki CPU patlamasını üstel ortalamayla tahmin etmek; yaşlanma, piyango, stride ve adil paylaşımla açlığı önlemek.

Çok işlemci ve gerçek zaman

Yük dengeleme ve işlemci yakınlığını açıklamak; RM ve EDF ile çizelgelenebilirliği kullanım sınırıyla sınamak.

Gerçek sistemler

Linux CFS ve onun yerini alan EEVDF ile Windows öncelik sınıflarını ve dinamik öncelik artırmalarını yorumlamak.

Temel Kavramlar

Çizelgeleme Nedir?

  • Çok programlı sistemde birçok süreç bellekte hazır bekler; CPU boşaldığında hangisinin çalışacağına kısa vadeli çizelgeleyici (CPU scheduler) karar verir.
  • Amaç: CPU'yu boş bırakmamak ve seçilen hedefleri (yanıt, verim, adalet, son tarih) iyileştirmek.
  • Hazır kuyruğu: çalışmaya hazır süreçler. Bekleme kuyrukları: G/Ç ya da bir olayı bekleyenler. Çalışan: her çekirdekte en fazla bir tane.
  • Hazır kuyruğu FIFO olmak zorunda değildir: öncelik kuyruğu, ağaç ya da sırasız liste olabilir.
  • Modern çekirdekler aslında çekirdek iş parçacıklarını çizelgeler; “süreç çizelgeleme” deyimi bu anlamda kullanılır.
yeniHazır kuyruğuP3P7P1P4CPUçıkışzaman doldu (kesme)G/Ç isteğiG/Ç bekleme kuyruğuG/Ç bitti

Temel Kavramlar

CPU–G/Ç Patlama Döngüsü

load, store, addCPU patlamasıdosyadan oku → bekleG/Ç patlamasıstore, incrementCPU patlamasıdosyaya yaz → bekleG/Ç patlamasıload, add, storeCPU patlamasıağdan oku → bekleG/Ç patlaması⋮
08162432CPU patlama süresi (ms)sıklıkçok sayıda kısa patlamaaz sayıda uzun patlama
(a) CPU'ya bağlı(b) G/Ç'ye bağlızaman →dolu: CPU kullanımı · boşluk: G/Ç bekleme

Belirleyici olan G/Ç beklemesinin uzunluğu değil, CPU patlamasının kısalığıdır. Hazır olan G/Ç'ye bağlı süreç hemen çalıştırılırsa diski ve ağı meşgul tutar.

Temel Kavramlar

Çizelgeleme Kararları Ne Zaman Alınır?

yenihazırçalışıyorsonlandıbekliyorkabuldağıtıcı seçtikesme / dilim dolduG/Ç ya da olay bekleG/Ç tamamlandıexit()

1. Çalışıyor → bekliyor: süreç G/Ç ister ya da wait() çağırır. CPU boşalır, seçim zorunludur.

yenihazırçalışıyorsonlandıbekliyorkabuldağıtıcı seçtikesme / dilim dolduG/Ç ya da olay bekleG/Ç tamamlandıexit()

2. Çalışıyor → hazır: saat kesmesi geldi, zaman dilimi doldu. Çalışanı kesmek isteğe bağlıdır.

yenihazırçalışıyorsonlandıbekliyorkabuldağıtıcı seçtikesme / dilim dolduG/Ç ya da olay bekleG/Ç tamamlandıexit()

3. Bekliyor → hazır: G/Ç tamamlandı; uyanan süreç çalışandan daha önemliyse onu kesebilir.

yenihazırçalışıyorsonlandıbekliyorkabuldağıtıcı seçtikesme / dilim dolduG/Ç ya da olay bekleG/Ç tamamlandıexit()

4. Sonlanma: süreç exit() ile biter; CPU boşalır, seçim zorunludur.

yenihazırçalışıyorsonlandıbekliyorkabuldağıtıcı seçtikesme / dilim dolduG/Ç ya da olay bekleG/Ç tamamlandıexit()■ kesmesiz de olur (1, 4)■ yalnızca kesmeli çizelgeleyici karar verir (2, 3)

Yalnızca 1 ve 4'te karar veren çizelgeleyici kesmesiz (işbirlikçi); 2 ve 3'te de karar veren kesmelidir.

Temel Kavramlar

Kesmeli ve Kesmesiz Çizelgeleme

Kesmesiz (non-preemptive)

Seçilen süreç bloke olana, sonlanana ya da CPU'yu gönüllü bırakana (yield) kadar çalışır. Saat kesmesi gerekmez; geçiş azdır.

Örnek: Windows 3.x ve klasik Mac OS (9 ve öncesi) işbirlikçi çoklu görevdi; tek bir hatalı program tüm sistemi kilitleyebiliyordu.

Kesmeli (preemptive)

Süreç, zaman dilimi dolunca ya da daha önemli bir süreç hazır olunca askıya alınır. Saat kesmesi şarttır; tüm genel amaçlı modern işletim sistemleri böyledir.

Bedeli: paylaşılan veride yarış koşulu riski (Bölüm 6) ve daha çok bağlam değiştirme.

  • Çekirdek içi kesme: Linux 2.6'dan beri çekirdek kodu da kesilebilir; kesme yalnızca kilit tutulmadığında yapılır (preempt_count = 0).
  • PREEMPT_RT yamaları 20 yıllık geliştirmeden sonra Linux 6.12 (2024) ile ana çekirdeğe girdi: kesme işleyicileri iş parçacığı olarak çalışır, gecikme mikrosaniyeler düzeyine iner.
  • Toplu işlerde kesmesiz ya da uzun dilimli kesmeli algoritmalar yeterlidir; etkileşimli ve sunucu sistemlerinde kesme zorunludur.

Temel Kavramlar

Görev Dağıtıcı ve Bağlam Değiştirme

P0çekirdekP1çalışıyorPCB0'a kaydetseçPCB1'den yükleçalışıyorkesme / sistem çağrısıkullanıcı kipine dön, PC'ye atladağıtıcı gecikmesi (dispatch latency)
  • Dağıtıcı (dispatcher), çizelgeleyicinin seçtiği sürece CPU'yu verir: bağlam değiştirir, kullanıcı kipine geçer, programdaki doğru adrese atlar.
  • Her geçişte çalıştığı için hızlı olmalıdır; doğrudan maliyet bugün birkaç mikrosaniyedir.
  • Linux'ta ölçüm: vmstat 1 çıktısındaki cs sütunu; /proc/<pid>/status içindeki voluntary_ctxt_switches ve nonvoluntary_ctxt_switches.
BileşenSüreçler arası geçişte
Yazmaçlar, PC, SPkaydedilir / yüklenir
Bellek haritasısayfa tablosu tabanı değişir (x86: CR3)
TLBPCID/ASID varsa boşaltılmaz
Önbelleklerboşaltılmaz ama soğuk kalır

Temel Kavramlar

Ortama Göre Çizelgeleme Hedefleri

OrtamÖncelikli hedeflerUygun yaklaşım
Tüm sistemlerAdalet (benzer süreçlere benzer pay), politika uygulama (ör. güvenlik süreçleri önce), denge (CPU ve G/Ç aygıtları birlikte meşgul)—
Toplu (batch)Verim (iş/saat), kısa dönüş süresi, yüksek CPU kullanımıKesmesiz ya da uzun dilimli kesmeli
EtkileşimliKısa yanıt süresi, orantılılık (kullanıcının beklentisine uygun gecikme)Kesmeli; kısa zaman dilimi
Gerçek zamanlıSon tarihlere uymak (veri kaybı yok), öngörülebilirlik (ses/görüntü kalitesi düşmez)Öncelik / son tarih tabanlı; görevler kısa çalışıp bloke olur
Toplu işler bugün de yaygındır: bordro ve bankacılık gece işleri, bilimsel hesap ve yapay zekâ eğitimi (HPC kuyruk yöneticileri, ör. Slurm), CI derlemeleri. Hedefler çoğu zaman çelişir: yanıt süresini kısaltan sık geçişler verimi düşürür.

Temel Kavramlar

Çizelgeleme Ölçütleri

geliş Ghazır, bekliyorçalışıyorkesildi, bekliyorçalışıyorilk çalışma İbitiş Byanıt = İ − Gdönüş = B − G = CPU süresi + bekleme+ bekleme
ÖlçütTanımHedef
CPU kullanımıCPU'nun meşgul olduğu zaman oranı (gerçek sistemlerde %40–%90)en büyük
Verim (throughput)Birim zamanda tamamlanan süreç sayısıen büyük
Dönüş süresi (turnaround)Sisteme girişten tamamlanmaya kadar geçen süre: B − Gen küçük
Bekleme süresi (waiting)Hazır kuyruğunda geçen toplam süre (G/Ç yoksa: dönüş − CPU süresi)en küçük
Yanıt süresi (response)Girişten ilk kez CPU'ya çıkmaya (ilk tepkiye) kadar geçen süre: İ − Gen küçük

Çizelgeleyici yalnızca hazır kuyruğundaki bekleme süresini etkiler; CPU ve G/Ç süresi programa aittir. Etkileşimli sistemde ortalamadan çok yanıt süresinin varyansını küçültmek önemlidir. Ağırlıklı dönüş = dönüş / CPU süresi.

Temel Algoritmalar

Ortak Süreç Kümesi

SüreçGelişCPU süresiÖncelik
P1082
P2143
P3291
P4354
  • Küçük sayı = yüksek öncelik; eşitlikte önce gelen kazanır.
  • RR'de aynı anda gelen yeni süreç, dilimi biten süreçten önce kuyruğa girer.
  • Süreler ms; bağlam değiştirme süresi 0 kabul edilir; G/Ç yok.
P18 msP24 msP39 msP45 ms0510152025geliş anından itibaren gereken CPU süresi
Sonraki slaytlarda FCFS, SJF, SRTF, öncelik ve RR bu dört süreçle adım adım çalıştırılır; böylece sonuçlar doğrudan karşılaştırılabilir. Kendi süreç kümenizi CPU Çizelgeleme Simülatörü sayfasında deneyin: Gantt şeması ve ölçütler anında hesaplanır.

Temel Algoritmalar

FCFS Adım Adım

İlk gelen ilk hizmet alır (first-come, first-served): hazır kuyruğu FIFO; CPU'yu alan süreç bitene ya da bloke olana kadar bırakmaz. Gerçeklemesi en basit algoritmadır.

P1P2P3P4P10826t = 0CPU: P1 · kalan 8Hazır:(boş)

t = 0: kuyrukta yalnızca P1 var; CPU'yu alır ve 8 ms boyunca bırakmaz (kesmesiz).

P1P2P3P4P1P2081226t = 8CPU: P2 · kalan 4Hazır:P3 · 9P4 · 5

t = 8: P1 bitti. Kuyruk geliş sırasıyla ilerler → baştaki P2 çalışır (7 ms bekledi).

P1P2P3P4P1P2P308122126t = 12CPU: P3 · kalan 9Hazır:P4 · 5

t = 12: P2 bitti. Kuyruk geliş sırasıyla ilerler → baştaki P3 çalışır (10 ms bekledi).

P1P2P3P4P1P2P3P408122126t = 21CPU: P4 · kalan 5Hazır:(boş)

t = 21: P3 bitti. Kuyruk geliş sırasıyla ilerler → baştaki P4 çalışır (18 ms bekledi).

P1P2P3P4P1P2P3P408122126
SüreçGelişCPUİlk çalışmaBitişDönüşBeklemeYanıt
P10808800
P2148121177
P3291221191010
P4352126231818
Ort.15,258,758,75

Ortalama bekleme 8,75, dönüş 15,25, yanıt 8,75 ms · 3 bağlam değiştirme.

Temel Algoritmalar

FCFS: Konvoy Etkisi

Sıra: P1 → P2 → P3 (hepsi t = 0'da hazır)P1P2P30242730Bekleme: P1 = 0, P2 = 24, P3 = 27 → ortalama (0 + 24 + 27) / 3 = 17 ms

Uzun iş önde: kısa P2 ve P3, P1'in arkasında bekler. Ortalama bekleme 17 ms.

Sıra: P2 → P3 → P1P2P3P103630Bekleme: P1 = 6, P2 = 0, P3 = 3 → ortalama (6 + 0 + 3) / 3 = 3 ms

Aynı işler, farklı geliş sırası: ortalama 3 ms. FCFS'de sonuç geliş sırasına aşırı duyarlıdır.

CPUCCdiskCI1I2I3C uzun patlama; I1–I3 hazırda beklerdisk boştaCPU boştadisk yine boştaC: CPU'ya bağlı · I1, I2, I3: G/Ç'ye bağlı (1 ms CPU, 3 ms disk)

Konvoy etkisi: CPU'ya bağlı C CPU'yu bırakmaz; G/Ç'ye bağlı süreçler arkasında birikir ve aygıtlar sırayla boşta kalır.

Düzeltme: CPU'yu sonlanana kadar tutan G/Ç'ye bağlı değil, CPU'ya bağlı süreçtir. FCFS kesmesizdir; açlık yoktur ama etkileşimli sistemler için uygun değildir.

Temel Algoritmalar · Kodu adım adım çalıştır

FCFS Bekleme Süresini Hesaplamak

/* p[] geliş sırasına göre sıralı */
void fcfs(Surec p[], int n) {
  int t = 0, top = 0;
  for (int i = 0; i < n; i++) {
    if (t < p[i].gelis) t = p[i].gelis;
    int bekleme = t - p[i].gelis;
    t += p[i].sure;          /* bitiş */
    top += bekleme;
    printf("%s: %d\n", p[i].ad, bekleme);
  }
  printf("ort = %.2f\n", (double) top / n);
}
026

Saat t ve toplam bekleme top sıfırlanır. Süreçler geliş sırasındadır.

026

P1 0'de gelmişti; CPU 0'de boşaldı → bekleme = 0 − 0 = 0.

P10826

P1 8 ms çalışır, saat 8 olur; toplam bekleme 0.

P10826

P2 1'de gelmişti; CPU 8'de boşaldı → bekleme = 8 − 1 = 7.

P1P2081226

P2 4 ms çalışır, saat 12 olur; toplam bekleme 7.

P1P2081226

P3 2'de gelmişti; CPU 12'de boşaldı → bekleme = 12 − 2 = 10.

P1P2P308122126

P3 9 ms çalışır, saat 21 olur; toplam bekleme 17.

P1P2P308122126

P4 3'de gelmişti; CPU 21'de boşaldı → bekleme = 21 − 3 = 18.

P1P2P3P408122126

P4 5 ms çalışır, saat 26 olur; toplam bekleme 35.

P1P2P3P408122126

Ortalama bekleme = 35 / 4 = 8,75 ms, FCFS Gantt şemasıyla aynı.

Düzeltme: sunumdaki ilk sürüm waitingTime'ı yazdırmadan önce artırdığı için bekleme yerine bitiş zamanını basıyor, geliş zamanlarını da yok sayıyordu.

Temel Algoritmalar

SJF: En Kısa İş Önce

  • En kısa iş önce (shortest-job-first): hazır süreçlerden sonraki CPU patlaması en kısa olan seçilir; eşitlikte FCFS.
  • Tüm işler aynı anda hazırsa ortalama bekleme süresini en aza indirdiği kanıtlanabilir: ilk işin süresi herkesin beklemesine eklenir, o yüzden en kısası öne alınmalıdır (sağdaki formülde a'nın katsayısı en büyük).
  • Gelişler farklı zamanlardaysa kesmesiz SJF optimal değildir; optimal olan kesmeli sürümü SRTF'dir.
  • Sorun: sonraki patlama süresi bilinmez. Toplu sistemde kullanıcı tahmini (ör. Slurm --time), kısa vadeli çizelgede geçmişten tahmin.
  • Uzun işler sürekli gelen kısa işler yüzünden açlık çekebilir.
(a) geliş sırası: dönüş 8, 12, 16, 20 → ort. 14ABCD08121620(b) en kısa önce: dönüş 4, 8, 12, 20 → ort. 11BCDA0481220ort. dönüş = (4a + 3b + 2c + d) / 4

Düzeltme: SJF CPU kullanımını değil, ortalama bekleme ve dönüş süresini en aza indirir; CPU her algoritmada iş olduğu sürece meşguldür.

Temel Algoritmalar

SJF: Hepsi Aynı Anda Hazır

Klasik örnek: dört süreç t = 0'da hazır; CPU süreleri P1 = 6, P2 = 8, P3 = 7, P4 = 3 ms. Aynı küme FCFS ile çalışsaydı ortalama bekleme (0 + 6 + 14 + 21) / 4 = 10,25 ms olurdu.

hepsi t = 0 anında hazırP40324t = 0CPU: P4 · kalan 3Hazır:P1 · 6P2 · 8P3 · 7

t = 0: hepsi hazır; en kısa CPU süresine sahip P4 (3) seçilir.

hepsi t = 0 anında hazırP4P103924t = 3CPU: P1 · kalan 6Hazır:P2 · 8P3 · 7

t = 3: P4 bitti. Hazır: P1 (6), P2 (8), P3 (7) → en kısa P1 (6).

hepsi t = 0 anında hazırP4P1P30391624t = 9CPU: P3 · kalan 7Hazır:P2 · 8

t = 9: P1 bitti. Hazır: P3 (7), P2 (8) → en kısa P3 (7).

hepsi t = 0 anında hazırP4P1P3P20391624t = 16CPU: P2 · kalan 8Hazır:(boş)

t = 16: P3 bitti. Hazır: P2 (8) → en kısa P2 (8).

hepsi t = 0 anında hazırP4P1P3P20391624
SüreçGelişCPUİlk çalışmaBitişDönüşBeklemeYanıt
P10639933
P2081624241616
P3079161699
P40303300
Ort.1377

Ortalama bekleme 7, dönüş 13, yanıt 7 ms · 3 bağlam değiştirme.

Temel Algoritmalar

SJF Ortak Kümede

Ortak kümede kesmesiz SJF: t = 0'da yalnızca P1 vardır ve kesilemez; sonraki her seçimde hazır süreçlerin en kısası alınır.

P1P2P3P4P10826t = 0CPU: P1 · kalan 8Hazır:(boş)

t = 0: yalnızca P1 hazır. SJF kesmesiz: sonradan gelen kısa işler P1'i durduramaz.

P1P2P3P4P1P2081226t = 8CPU: P2 · kalan 4Hazır:P3 · 9P4 · 5

t = 8: P1 bitti. Hazır: P2 (4), P3 (9), P4 (5) → en kısa P2 (4).

P1P2P3P4P1P2P408121726t = 12CPU: P4 · kalan 5Hazır:P3 · 9

t = 12: P2 bitti. Hazır: P3 (9), P4 (5) → en kısa P4 (5).

P1P2P3P4P1P2P4P308121726t = 17CPU: P3 · kalan 9Hazır:(boş)

t = 17: P4 bitti. Hazır: P3 (9) → en kısa P3 (9).

P1P2P3P4P1P2P4P308121726
SüreçGelişCPUİlk çalışmaBitişDönüşBeklemeYanıt
P10808800
P2148121177
P3291726241515
P43512171499
Ort.14,257,757,75

Ortalama bekleme 7,75, dönüş 14,25, yanıt 7,75 ms · 3 bağlam değiştirme.

Temel Algoritmalar

FCFS ve SJF Karşılaştırması

ABCDEOrt.
Geliş01234
CPU43524
SJFBitiş4918613
Dönüş4816398
Ağırlıklı12,673,21,52,252,12
FCFSBitiş47121418
Dönüş461011149
Ağırlıklı1225,53,52,8
Ağırlıklı (normalleştirilmiş) dönüş = dönüş / CPU süresi; 1 ideal. FCFS kısa işleri cezalandırır: A(0, 1), B(1, 100), C(2, 1), D(3, 100) kümesinde 1 ms'lik C, B'nin arkasında 100 ms bekler, ağırlıklı dönüşü 100 olur (D için 1,99).

Düzeltme: sunumdaki tabloda C için ağırlıklı dönüş 3,1 yazıyordu; doğrusu 16 / 5 = 3,2, SJF ortalaması da 2,12'dir.

Temel Algoritmalar

Sonraki CPU Patlamasını Tahmin: Üstel Ortalama

τn+1 = α · tn + (1 − α) · τn,  0 ≤ α ≤ 1

  • tn: n. patlamanın gerçek süresi; τn: onun için yapılmış tahmin; τ0: sabit (ör. sistem ortalaması).
  • α = 0 → geçmiş hiç değişmez; α = 1 → yalnızca son patlama sayılır. Yaygın seçim α = ½.
  • Açılım: τn+1 = αtn + (1−α)αtn−1 + … + (1−α)n+1τ0: eski ölçümlerin ağırlığı üstel azalır.
  • Tanenbaum'un “yaşlandırma” (aging) tahmini aynı fikir: T0, T0/2 + T1/2, T0/4 + T1/4 + T2/2, …
  • Örnek (α = ½, τ0 = 10): t0 = 6 → τ1 = ½·6 + ½·10 = 8.
24681012t646413131310866591112τgerçek patlamatahmin τ

Temel Algoritmalar · Kodu adım adım çalıştır

Üstel Ortalamayı Hesaplamak

double tau = 10.0;      /* τ0 */
const double a = 0.5;  /* α */
int t[] = { 6, 4, 6, 4, 13, 13, 13 };
for (int n = 0; n < 7; n++) {
  printf("%.1f %d\n", tau, t[n]);
  tau = a * t[n] + (1 - a) * tau;
}
printf("sonraki: %.1f\n", tau);

İlk tahmin τ0 = 10, α = 0,5. Henüz hiç patlama ölçülmedi.

6

n = 0: gerçek 6, tahmin 10 idi → τ = 0,5·6 + 0,5·10 = 8.

64

n = 1: gerçek 4, tahmin 8 idi → τ = 0,5·4 + 0,5·8 = 6.

646

n = 2: gerçek 6, tahmin 6 idi → τ = 0,5·6 + 0,5·6 = 6.

6464

n = 3: gerçek 4, tahmin 6 idi → τ = 0,5·4 + 0,5·6 = 5.

646413

n = 4: gerçek 13, tahmin 5 idi → τ = 0,5·13 + 0,5·5 = 9.

64641313

n = 5: gerçek 13, tahmin 9 idi → τ = 0,5·13 + 0,5·9 = 11.

6464131313

n = 6: gerçek 13, tahmin 11 idi → τ = 0,5·13 + 0,5·11 = 12.

6464131313

Patlamalar 13'e sıçradı; tahmin 5 → 9 → 11 → 12 ile birkaç adımda yetişir.

Temel Algoritmalar

SRTF Adım Adım

En kısa kalan süre önce (SRTF / SRTN): SJF'nin kesmeli sürümü. Yeni süreç gelince süresi, çalışanın kalan süresiyle karşılaştırılır.

P1P2P3P4P10126t = 0CPU: P1 · kalan 8Hazır:(boş)

t = 0: yalnızca P1 var ve çalışmaya başlar.

P1P2P3P4P1P201226t = 1CPU: P2 · kalan 4Hazır:P1 · 7

t = 1: P2 gelir (4); çalışan P1 için kalan 7. 4 < 7 → P1 kesilir, P2 çalışır.

P1P2P3P4P1P2P2012326t = 2CPU: P2 · kalan 3Hazır:P1 · 7P3 · 9

t = 2: P3 gelir (9). Çalışan P2 için kalan 3 ≤ 9 → kesme yok.

P1P2P3P4P1P2P2013526t = 3CPU: P2 · kalan 2Hazır:P1 · 7P3 · 9P4 · 5

t = 3: P4 gelir (5). Çalışan P2 için kalan 2 ≤ 5 → kesme yok.

P1P2P3P4P1P2P40151026t = 5CPU: P4 · kalan 5Hazır:P1 · 7P3 · 9

t = 5: P2 bitti. Kalan süreler: P1 7, P3 9, P4 5 → en kısa P4 (5).

P1P2P3P4P1P2P4P1015101726t = 10CPU: P1 · kalan 7Hazır:P3 · 9

t = 10: P4 bitti. Kalan süreler: P1 7, P3 9 → en kısa P1 (7).

P1P2P3P4P1P2P4P1P3015101726t = 17CPU: P3 · kalan 9Hazır:(boş)

t = 17: P1 bitti. Kalan süreler: P3 9 → en kısa P3 (9).

P1P2P3P4P1P2P4P1P3015101726
SüreçGelişCPUİlk çalışmaBitişDönüşBeklemeYanıt
P1080171790
P21415400
P3291726241515
P435510722
Ort.136,54,25

Ortalama bekleme 6,5, dönüş 13, yanıt 4,25 ms · 4 bağlam değiştirme.

Düzeltme: sunumda “başlama süresi P1 = 10” deniyordu; P1 t = 0'da başlar, 1'de kesilir, 10'da kaldığı yerden devam eder. Ortalama bekleme 6,5 ms doğrudur.

Temel Algoritmalar

Öncelik Çizelgeleme

  • Her sürece bir öncelik sayısı verilir; en yüksek öncelikli hazır süreç çalışır. Bu derste küçük sayı = yüksek öncelik (Linux ve Windows'ta yönler farklıdır, dikkat).
  • Öncelik iç (bellek, açık dosya, ölçülen G/Ç/CPU oranı) ya da dış (önem, ücret, politika) etkenlerden gelir. SJF, önceliği “tahmini sonraki patlama” olan özel bir durumdur; tüm öncelikler eşitse algoritma FCFS'ye döner.
  • Kesmeli ya da kesmesiz olabilir; aynı öncelik düzeyindekiler arasında RR uygulanabilir (b).
(a) Kesmesiz öncelik · P1 (10, ö 3), P2 (1, ö 1), P3 (2, ö 4), P4 (1, ö 5), P5 (5, ö 2), hepsi t = 0P2P5P1P3P4016161819Bekleme: P1 6, P2 0, P3 16, P4 18, P5 1 → ortalama 41 / 5 = 8,2 ms(b) Öncelik + RR (q = 2) · P1 (4, ö 3), P2 (5, ö 2), P3 (8, ö 2), P4 (7, ö 1), P5 (3, ö 3)P4P2P3P2P3P2P3P1P5P1P5079111315162022242627Bekleme: P1 22, P2 11, P3 12, P4 0, P5 24 → ortalama 13,8 ms

Temel Algoritmalar

Kesmeli Öncelik Ortak Kümede

Kesmeli öncelik, ortak küme (P1 ö 2, P2 ö 3, P3 ö 1, P4 ö 4). Yeni gelen süreç çalışandan daha yüksek öncelikliyse onu keser.

P1P2P3P4P10126t = 0CPU: P1 · kalan 8Hazır:(boş)

t = 0: yalnızca P1 var ve çalışmaya başlar.

P1P2P3P4P1P101226t = 1CPU: P1 · kalan 7Hazır:P2 · ö 3 · 4

t = 1: P2 gelir (öncelik 3). Çalışan P1 önceliği 2 ile daha yüksek → kesme yok.

P1P2P3P4P1P302326t = 2CPU: P3 · kalan 9Hazır:P1 · ö 2 · 6P2 · ö 3 · 4

t = 2: P3 gelir (öncelik 1); çalışan P1 önceliği 2 ile daha düşük → kesilir, P3 çalışır.

P1P2P3P4P1P3P30231126t = 3CPU: P3 · kalan 8Hazır:P1 · ö 2 · 6P2 · ö 3 · 4P4 · ö 4 · 5

t = 3: P4 gelir (öncelik 4). Çalışan P3 önceliği 1 ile daha yüksek → kesme yok.

P1P2P3P4P1P3P102111726t = 11CPU: P1 · kalan 6Hazır:P2 · ö 3 · 4P4 · ö 4 · 5

t = 11: P3 bitti. Hazır: P1 (ö 2), P2 (ö 3), P4 (ö 4) → en yüksek öncelikli P1.

P1P2P3P4P1P3P1P20211172126t = 17CPU: P2 · kalan 4Hazır:P4 · ö 4 · 5

t = 17: P1 bitti. Hazır: P2 (ö 3), P4 (ö 4) → en yüksek öncelikli P2.

P1P2P3P4P1P3P1P2P40211172126t = 21CPU: P4 · kalan 5Hazır:(boş)

t = 21: P2 bitti. Hazır: P4 (ö 4) → en yüksek öncelikli P4.

P1P2P3P4P1P3P1P2P40211172126
SüreçGelişCPUÖncelikİlk çalışmaBitişDönüşBeklemeYanıt
P10820171790
P21431721201616
P3291211900
P43542126231818
Ort.17,2510,758,5

Ortalama bekleme 10,75, dönüş 17,25, yanıt 8,5 ms · 4 bağlam değiştirme.

Temel Algoritmalar

Açlık ve Yaşlanma

Açlık (starvation): yüksek öncelikli işler sürekli gelirse düşük öncelikli iş hiç çalışamaz. Yaşlanma (aging): beklerken önceliği adım adım artırılır. Kural: hazırda geçen her 4 ms için öncelik sayısı 1 azalır. L (3 ms, ö 7) t = 0'da gelir; her 4 ms'de bir yeni H (4 ms, ö 2) gelir. Kesmesiz öncelik.

H1 + LH10428t = 0L'nin önceliği:7t=06t=45t=84t=123t=162t=20H'lerin önceliği: 2

t = 0: L'nin önceliği 7, yeni gelen H1'ninki 2 → H1 çalışır. L 4 ms daha bekleyince önceliği 6 olur.

H1 + LH2H1H204828t = 4L'nin önceliği:7t=06t=45t=84t=123t=162t=20H'lerin önceliği: 2

t = 4: L'nin önceliği 6, yeni gelen H2'ninki 2 → H2 çalışır. L 4 ms daha bekleyince önceliği 5 olur.

H1 + LH2H3H1H2H30481228t = 8L'nin önceliği:7t=06t=45t=84t=123t=162t=20H'lerin önceliği: 2

t = 8: L'nin önceliği 5, yeni gelen H3'ninki 2 → H3 çalışır. L 4 ms daha bekleyince önceliği 4 olur.

H1 + LH2H3H4H1H2H3H4048121628t = 12L'nin önceliği:7t=06t=45t=84t=123t=162t=20H'lerin önceliği: 2

t = 12: L'nin önceliği 4, yeni gelen H4'ninki 2 → H4 çalışır. L 4 ms daha bekleyince önceliği 3 olur.

H1 + LH2H3H4H5H1H2H3H4H504812162028t = 16L'nin önceliği:7t=06t=45t=84t=123t=162t=20H'lerin önceliği: 2

t = 16: L'nin önceliği 3, yeni gelen H5'ninki 2 → H5 çalışır. L 4 ms daha bekleyince önceliği 2 olur.

H1 + LH2H3H4H5H6H1H2H3H4H5L0481216202328t = 20L'nin önceliği:7t=06t=45t=84t=123t=162t=20H'lerin önceliği: 2

t = 20: L'nin önceliği 2, H6 ile eşit; eşitlikte önce gelen kazanır → L nihayet çalışır (20 ms bekledi).

H1H2H3H4H5LH6048121620232728Yaşlanma olmasaydı: H akışı sürdükçe L'nin önceliği 7'de kalır ve L hiç çalışamaz (açlık).

Yaşlanma sınırsız beklemeyi sınırlı hale getirir: en kötü durumda L, öncelik farkı × 4 ms = 20 ms bekler.

Round Robin

Round Robin (RR)

  • Round Robin (döngüsel, sıralı): FCFS + kesme. Her süreç en fazla bir zaman dilimi (kuantum, q) çalışır, sonra kuyruğun sonuna gider.
  • n süreç ve q dilimde hiçbir süreç (n − 1) · q'dan uzun beklemez: yanıt süresi sınırlıdır, açlık yoktur.
  • Dönüş süresi genellikle SJF'den kötü, yanıt süresi daha iyidir.
  • G/Ç'ye bağlı süreç dilimin küçük kısmını kullanıp kuyruğun sonuna döner; CPU'ya bağlılar daha çok pay alır (bu yüzden MLFQ ve sanal RR gibi iyileştirmeler var).
(a) çalıştırılabilir süreçlerBFDGAgeçerli: B(b) B dilimini kullandıktan sonraFDGABB kuyruğun sonuna, F çalışır
Örnek: q = 20 · P1 53, P2 17, P3 68, P4 24 (hepsi t = 0)P1P2P3P4P1P3P1P302037577797117134162Bekleme: P1 81, P2 20, P3 94, P4 97 → ort. 73 ms · yanıt ort. 28,5 ms (SJF'de bekleme ort. 38)

Round Robin

RR Adım Adım: q = 2

Ortak küme, q = 2 ms. Küçük dilim: süreçler sık sık yer değiştirir; herkes kısa sürede ilk kez CPU'ya çıkar.

P1P2P3P4P10226t = 0CPU: P1 · kalan 8Hazır:(boş)

t = 0: yalnızca P1 var; en fazla q = 2 ms çalışır, sonra sırayı bırakır.

P1P2P3P4P1P202426t = 2CPU: P2 · kalan 4Hazır:P3 · 9P1 · 6

t = 2: P1 dilimini doldurdu (kalan 6) ve kuyruğun sonuna gider. Arada gelen P2, P3 kuyruğa ondan önce girdi. Sıradaki: P2.

P1P2P3P4P1P2P3024626t = 4CPU: P3 · kalan 9Hazır:P1 · 6P4 · 5P2 · 2

t = 4: P2 dilimini doldurdu (kalan 2) ve kuyruğun sonuna gider. Arada gelen P4 kuyruğa ondan önce girdi. Sıradaki: P3.

P1P2P3P4P1P2P3P10246826t = 6CPU: P1 · kalan 6Hazır:P4 · 5P2 · 2P3 · 7

t = 6: P3 dilimini doldurdu (kalan 7) ve kuyruğun sonuna gider. Sıradaki: P1.

P1P2P3P4P1P2P3P1P4024681026t = 8CPU: P4 · kalan 5Hazır:P2 · 2P3 · 7P1 · 4

t = 8: P1 dilimini doldurdu (kalan 4) ve kuyruğun sonuna gider. Sıradaki: P4.

P1P2P3P4P1P2P3P1P4P202468101226t = 10CPU: P2 · kalan 2Hazır:P3 · 7P1 · 4P4 · 3

t = 10: P4 dilimini doldurdu (kalan 3) ve kuyruğun sonuna gider. Sıradaki: P2.

P1P2P3P4P1P2P3P1P4P2P30246810121426t = 12CPU: P3 · kalan 7Hazır:P1 · 4P4 · 3

t = 12: P2 işini dilim dolmadan bitirdi. Sıradaki: P3.

P1P2P3P4P1P2P3P1P4P2P3P1024681012141626t = 14CPU: P1 · kalan 4Hazır:P4 · 3P3 · 5

t = 14: P3 dilimini doldurdu (kalan 5) ve kuyruğun sonuna gider. Sıradaki: P1.

P1P2P3P4P1P2P3P1P4P2P3P1P402468101214161826t = 16CPU: P4 · kalan 3Hazır:P3 · 5P1 · 2

t = 16: P1 dilimini doldurdu (kalan 2) ve kuyruğun sonuna gider. Sıradaki: P4.

P1P2P3P4P1P2P3P1P4P2P3P1P4P30246810121416182026t = 18CPU: P3 · kalan 5Hazır:P1 · 2P4 · 1

t = 18: P4 dilimini doldurdu (kalan 1) ve kuyruğun sonuna gider. Sıradaki: P3.

P1P2P3P4P1P2P3P1P4P2P3P1P4P3P1024681012141618202226t = 20CPU: P1 · kalan 2Hazır:P4 · 1P3 · 3

t = 20: P3 dilimini doldurdu (kalan 3) ve kuyruğun sonuna gider. Sıradaki: P1.

P1P2P3P4P1P2P3P1P4P2P3P1P4P3P1P402468101214161820222326t = 22CPU: P4 · kalan 1Hazır:P3 · 3

t = 22: P1 işini dilim dolmadan bitirdi. Sıradaki: P4.

P1P2P3P4P1P2P3P1P4P2P3P1P4P3P1P4P30246810121416182022232526t = 23CPU: P3 · kalan 3Hazır:(boş)

t = 23: P4 işini dilim dolmadan bitirdi. Sıradaki: P3.

P1P2P3P4P1P2P3P1P4P2P3P1P4P3P1P4P3P30246810121416182022232526t = 25CPU: P3 · kalan 1Hazır:(boş)

t = 25: P3 dilimini doldurdu (kalan 1) ama kuyrukta başka süreç yok → yeni dilim alır, bağlam değiştirme olmaz.

P1P2P3P4P1P2P3P1P4P2P3P1P4P3P1P4P302468101214161820222326
SüreçGelişCPUİlk çalışmaBitişDönüşBeklemeYanıt
P10802222140
P2142121171
P32942624152
P43582320155
Ort.19,2512,752

Ortalama bekleme 12,75, dönüş 19,25, yanıt 2 ms · 12 bağlam değiştirme.

Round Robin

RR Adım Adım: q = 5

Ortak küme, q = 5 ms. Daha büyük dilim: geçiş sayısı azalır, ama ilk yanıtı bekleme süresi uzar.

P1P2P3P4P10526t = 0CPU: P1 · kalan 8Hazır:(boş)

t = 0: yalnızca P1 var; en fazla q = 5 ms çalışır, sonra sırayı bırakır.

P1P2P3P4P1P205926t = 5CPU: P2 · kalan 4Hazır:P3 · 9P4 · 5P1 · 3

t = 5: P1 dilimini doldurdu (kalan 3) ve kuyruğun sonuna gider. Arada gelen P2, P3, P4 kuyruğa ondan önce girdi. Sıradaki: P2.

P1P2P3P4P1P2P30591426t = 9CPU: P3 · kalan 9Hazır:P4 · 5P1 · 3

t = 9: P2 işini dilim dolmadan bitirdi. Sıradaki: P3.

P1P2P3P4P1P2P3P4059141926t = 14CPU: P4 · kalan 5Hazır:P1 · 3P3 · 4

t = 14: P3 dilimini doldurdu (kalan 4) ve kuyruğun sonuna gider. Sıradaki: P4.

P1P2P3P4P1P2P3P4P105914192226t = 19CPU: P1 · kalan 3Hazır:P3 · 4

t = 19: P4 işini dilim dolmadan bitirdi. Sıradaki: P1.

P1P2P3P4P1P2P3P4P1P305914192226t = 22CPU: P3 · kalan 4Hazır:(boş)

t = 22: P1 işini dilim dolmadan bitirdi. Sıradaki: P3.

P1P2P3P4P1P2P3P4P1P305914192226
SüreçGelişCPUİlk çalışmaBitişDönüşBeklemeYanıt
P10802222140
P21459844
P32992624157
P4351419161111
Ort.17,5115,5

Ortalama bekleme 11, dönüş 17,5, yanıt 5,5 ms · 5 bağlam değiştirme.

Round Robin

Kuantum Seçimi: Ödünleşim

KuantumBeklemeDönüşYanıtGeçiş
q = 212,7519,25212
q = 313,52039
q = 411,7518,254,57
q = 51117,55,55
q = 61218,56,55
q ≥ 9 (FCFS)8,7515,258,753

Ortalamalar ms cinsinden; geçiş = bağlam değiştirme sayısı.

ort. yanıt (ms)22334,545,556,568,759bağlam değiştirme1229374555639kuantum q (ms)
  • q küçüldükçe yanıt iyileşir (q = 2'de 2 ms) ama bağlam değiştirme artar (12 geçiş); her geçiş gerçek sistemde CPU zamanı yer.
  • Ortalama bekleme ve dönüş, q ile tekdüze değişmez (q = 3, q = 2'den kötü). q ≥ 9 (en uzun patlama) olunca RR tam olarak FCFS olur.

Round Robin

Kuantum ve Bağlam Değiştirme

q = 120 geçişq = 61 geçişq = 19 geçiş061010 ms'lik tek süreç
91011121311111,5210,75311,5412,25510,5610,57kuantum q · P1 6, P2 3, P3 1, P4 7ort. dönüş
  • Kayıp oranı = s / (q + s): q = 4 ms, geçiş s = 1 ms ise CPU'nun %20'si boşa gider; q = 100 ms'de ≈ %1 ama sistem ağır yanıt verir.
  • Bugün geçiş birkaç µs, tipik dilim 1–100 ms (Linux EEVDF temel dilimi 0,75 ms × (1 + log₂ CPU), 8+ çekirdekte 3 ms; Windows istemcide ≈ 2 saat tıkı). Kural: CPU patlamalarının ≈ %80'i q'dan kısa olmalı.
  • Dönüş süresi q ile tekdüze iyileşmez (sağda). q = 4 ile P1 24, P2 3, P3 3 kümesinde ortalama bekleme 17 / 3 ≈ 5,67 ms (FCFS'de 17).

Çok Düzeyli Kuyruklar

Çok Düzeyli Kuyruk (MLQ)

  • Hazır kuyruğu sınıflara bölünür; her süreç türüne göre (ör. ön plan / arka plan) kalıcı olarak bir kuyruğa atanır.
  • Her kuyruğun kendi algoritması vardır: ön plan için RR (kısa q), arka plan için FCFS.
  • Kuyruklar arası çizelgeleme: sabit öncelik (üst kuyruk boşalmadan alt kuyruk çalışmaz → açlık) ya da zaman paylaşımı (ör. CPU'nun %80'i ön plana, %20'si arka plana).
  • Yükü düşüktür ama esnek değildir: süreç kuyruk değiştiremez.
en yüksek öncelikgerçek zamanlı süreçlersistem süreçlerietkileşimli süreçlertoplu (batch) süreçleren düşük öncelikCPU

Düzeltme: sunum MLQ ile MLFQ'yu tek başlıkta birleştiriyordu. Sabit atamalı olan MLQ'dur; süreçlerin davranışına göre kuyruk değiştirdiği yapı geri beslemeli MLFQ'dur (sonraki slayt).

Çok Düzeyli Kuyruklar

Çok Düzeyli Geri Beslemeli Kuyruk (MLFQ)

Q0 · q = 8 msdilimi doldurdu → alt kuyrukQ1 · q = 16 msdilimi doldurdu → alt kuyrukQ2 · FCFSCPUyeni işQ0 boşsa Q1, Q0 ve Q1 boşsa Q2 çalışır
  1. Öncelik(A) > Öncelik(B) → A çalışır; eşitse RR.
  2. Yeni iş en üst kuyruğa girer (önce kısa olduğu varsayılır).
  3. Bir düzeydeki hakkını (allotment) bitiren iş, kaç kez CPU'yu bırakmış olursa olsun bir alt düzeye iner.
  4. Her S sürede bir tüm işler en üst kuyruğa taşınır (öncelik yükseltme): açlığı önler, davranışı değişen işe yeni şans verir.

Parametreler: kuyruk sayısı, her kuyruğun algoritması ve dilimi, alt/üst kuyruğa geçiş kuralı, yeni işin giriş kuyruğu. Kurallar OSTEP (Bölüm 8) düzenlemesidir; kısa işler üstte biter, uzun CPU işleri aşağı süzülür.

Çok Düzeyli Kuyruklar

MLFQ Adım Adım

Üç kuyruk: Q0 (q = 8), Q1 (q = 16), Q2 (FCFS). İşler: A (0, 30), B (2, 6), C (4, 20), D (25, 4). Kesilen iş kuyruğunun başına döner ve dilimini tamamlar.

ABCDA0860t = 0CPU: A · Q0 · q 8Q0 (8)Q1 (16)Q2 (FCFS)

t = 0: A gelir ve Q0'a girer; 8 ms'lik dilimiyle çalışır. B (t = 2) ve C (t = 4) Q0'a eklenir.

ABCDA·Q0B081460t = 8CPU: B · Q0 · q 8Q0 (8)C · 20Q1 (16)A · 22Q2 (FCFS)

t = 8: A dilimini doldurdu → Q1'e iner. Q0'da sıradaki B çalışır.

ABCDA·Q0B·Q0C08142260t = 14CPU: C · Q0 · q 8Q0 (8)Q1 (16)A · 22Q2 (FCFS)

t = 14: B 6 ms'de bitti (dilim dolmadan, Q0'da). Şimdi C, Q0'da 8 ms çalışır.

ABCDA·Q0B·Q0C·Q0A0814222560t = 22CPU: A · Q1 · q 16Q0 (8)Q1 (16)C · 12Q2 (FCFS)

t = 22: C de Q1'e iner. Q0 boş → Q1'in başındaki A 16 ms'lik dilimle çalışır.

ABCDA·Q0B·Q0C·Q0AD081422252960t = 25CPU: D · Q0 · q 8Q0 (8)Q1 (16)A · 19C · 12Q2 (FCFS)

t = 25: D gelir ve Q0'a girer: üst kuyruk olduğu için A'yı keser. A, Q1'in başına döner (13 ms dilimi kaldı).

ABCDA·Q0B·Q0C·Q0ADA08142225294260t = 29CPU: A · Q1 · kalan q 13Q0 (8)Q1 (16)C · 12Q2 (FCFS)

t = 29: D 4 ms'de bitti (yanıt 0, bekleme 0). A, Q1'de kalan 13 ms'lik dilimini kullanır.

ABCDA·Q0B·Q0C·Q0ADA·Q1C0814222529425460t = 42CPU: C · Q1 · q 16Q0 (8)Q1 (16)Q2 (FCFS)A · 6

t = 42: A Q1 dilimini de doldurdu → Q2. C, Q1'de çalışır; 12 ms yeterli.

ABCDA·Q0B·Q0C·Q0ADA·Q1C·Q1A0814222529425460t = 54CPU: A · Q2 · FCFSQ0 (8)Q1 (16)Q2 (FCFS)

t = 54: Q0 ve Q1 boş; A Q2'de FCFS ile kalan 6 ms'yi çalışır ve t = 60'ta biter.

ABCDA·Q0B·Q0C·Q0ADA·Q1C·Q1A·Q20814222529425460
İşGelişCPUBitişDönüşBeklemeYanıt
A0306060300
B26141266
C42054503010
D25429400
Ort.31,516,54

Kısa B ve D üst kuyrukta hızla biter (yanıt 6 ve 0); uzun A aşağı süzülür. Ortalama yanıt 4 ms.

Çok Düzeyli Kuyruklar

MLFQ Uygulamada

Oyun oynama (gaming)

Dilim bitmeden hemen önce G/Ç yapan bir iş, “bloke olan üstte kalır” kuralıyla CPU'yu tekeline alabilir. Çözüm: düzeydeki toplam kullanımı saymak (kural 3).

Açlık ve davranış değişimi

Çok sayıda etkileşimli iş uzun işleri aç bırakır; uzun işin sonradan etkileşimli olması da fark edilmez. Çözüm: periyodik öncelik yükseltme (kural 4).

Tarihçe: CTSS (1962)

Öncelik sınıfları 1, 2, 4, 8 dilim çalışır; dilimini bitiren iş bir alt sınıfa iner. Terminalde Enter'a basılınca süreç en üst sınıfa taşınıyordu; kullanıcılar bunu fark edip Enter'a basarak işlerini hızlandırdı.

Bugün

Solaris TS sınıfı (tabloyla ayarlanan dilim ve öncelik), FreeBSD ULE, Windows'un dinamik öncelikleri ve macOS MLFQ fikrini kullanır. Linux 2.6.23'ten beri öncelik sezgileri yerine adil paylaşım (CFS, sonra EEVDF) kullanır.

Orantılı Pay ve Öncelik Sorunları

Garantili ve Adil Paylaşım

Garantili çizelgeleme: n kullanıcı (ya da süreç) varsa her birine CPU'nun 1/n'i söz verilir. Her biri için oran = aldığı CPU / hak ettiği CPU hesaplanır; en düşük oranlı çalışır. Oranı 0,5 olan (payının yarısını almış) öne geçer, 2,0 olan bekler.

Adil paylaşım (fair-share): pay süreçlere değil kullanıcılara ya da gruplara verilir; çok süreç açan kullanıcı daha fazla CPU alamaz.

Bugün: Linux cgroup v2 cpu.weight ile grup çizelgeleme; systemd her kullanıcıyı bir user-UID.slice içine koyar, Kubernetes CPU istekleri de ağırlığa çevrilir.

süreç başına RR: kullanıcı 1 %80 alırABCDEABCDEkullanıcı başına %50AEBECEDEAEkullanıcı 1'e 2/3 payABECDEABECmavi: kullanıcı 1 (A, B, C, D) · turuncu: kullanıcı 2 (E)

Düzeltme: sunumda garantili çizelgeleme “önceden belirlenmiş programa göre, gerçek zamanlı sistemler için” diye tanımlanıyordu; Tanenbaum'daki anlamı yukarıdaki pay garantisidir. Katı/yumuşak gerçek zaman konusu Gerçek Zamanlı bölümüne taşındı.

Orantılı Pay ve Öncelik Sorunları

Piyango Çizelgeleme

A: 100 bilet0B: 50100C: 250 bilet150400çekiliş: 300 → C kazanırOlasılıklar: A 100/400 = %25 · B %12,5 · C %62,5
  • Her sürece bilet verilir; her dilimde rastgele bir bilet çekilir, sahibi çalışır. Uzun vadede pay = bilet / toplam bilet.
  • Gerçeklemesi basittir: rastgele sayı + listede birikimli toplam (Waldspurger ve Weihl, 1994).
  • Yeni süreç bilet alır almaz şansa sahiptir: duyarlıdır; öncelik “daha çok bilet” demektir.
  • Bilet devri: sunucuyu bekleyen istemci biletlerini sunucuya verir. Bilet para birimi ve güvenilen ortamda enflasyon.
  • Olasılıksaldır: kısa vadede adaletsiz olabilir (eşit biletli iki iş 10 dilimde 7–3 bölüşebilir). Deterministik eşdeğeri stride çizelgelemedir.

Düzeltme: sunum piyangoyu “uygulaması karmaşık, önceliği dikkate almaz” diye özetliyordu; aksine en basit algoritmalardandır ve öncelik bilet sayısıyla ifade edilir.

Orantılı Pay ve Öncelik Sorunları

Stride Çizelgeleme Adım Adım

Adım = büyük sayı / bilet (10 000 / bilet): A 100, B 200, C 40. Her dilimde en küçük pass değerli süreç çalışır, pass değerine adımını ekler; eşitlikte A, B, C sırası.

A · 100 bilet · adım 100pass = 0B · 50 bilet · adım 200pass = 0C · 250 bilet · adım 40pass = 0sıra:A

Adım 1: pass değerleri A 0, B 0, C 0 → en küçük A çalışır; pass(A) += 100.

A · 100 bilet · adım 100pass = 100B · 50 bilet · adım 200pass = 0C · 250 bilet · adım 40pass = 0sıra:AB

Adım 2: pass değerleri A 100, B 0, C 0 → en küçük B çalışır; pass(B) += 200.

A · 100 bilet · adım 100pass = 100B · 50 bilet · adım 200pass = 200C · 250 bilet · adım 40pass = 0sıra:ABC

Adım 3: pass değerleri A 100, B 200, C 0 → en küçük C çalışır; pass(C) += 40.

A · 100 bilet · adım 100pass = 100B · 50 bilet · adım 200pass = 200C · 250 bilet · adım 40pass = 40sıra:ABCC

Adım 4: pass değerleri A 100, B 200, C 40 → en küçük C çalışır; pass(C) += 40.

A · 100 bilet · adım 100pass = 100B · 50 bilet · adım 200pass = 200C · 250 bilet · adım 40pass = 80sıra:ABCCC

Adım 5: pass değerleri A 100, B 200, C 80 → en küçük C çalışır; pass(C) += 40.

A · 100 bilet · adım 100pass = 100B · 50 bilet · adım 200pass = 200C · 250 bilet · adım 40pass = 120sıra:ABCCCA

Adım 6: pass değerleri A 100, B 200, C 120 → en küçük A çalışır; pass(A) += 100.

A · 100 bilet · adım 100pass = 200B · 50 bilet · adım 200pass = 200C · 250 bilet · adım 40pass = 120sıra:ABCCCAC

Adım 7: pass değerleri A 200, B 200, C 120 → en küçük C çalışır; pass(C) += 40.

A · 100 bilet · adım 100pass = 200B · 50 bilet · adım 200pass = 200C · 250 bilet · adım 40pass = 160sıra:ABCCCACC

Adım 8: pass değerleri A 200, B 200, C 160 → en küçük C çalışır; pass(C) += 40.

A · 100 bilet · adım 100pass = 200B · 50 bilet · adım 200pass = 200C · 250 bilet · adım 40pass = 160sıra:ABCCCACC

8 dilimde A 2, B 1, C 5 kez çalıştı: tam olarak 100 : 50 : 250 = 2 : 1 : 5 oranı. Piyangoda bu oran ancak uzun vadede tutar.

Stride, piyangonun deterministik hali (Waldspurger, 1995). Dezavantajı küresel durum: yeni gelen sürecin pass değeri 0 olursa CPU'yu tekeline alır; bu yüzden mevcut en küçük pass ile başlatılır. Linux CFS'in vruntime fikri buna çok yakındır.

Orantılı Pay ve Öncelik Sorunları

Öncelik Ters Çevirme

Öncelik kalıtımı yokHMLKB0246810121416lock(R)

t = 0: düşük öncelikli L kaynak R'yi kilitler ve kritik bölgeye (KB) girer.

Öncelik kalıtımı yokHMLKBKBbekler0246810121416lock(R)H: lock(R)

t = 2: H gelir, L'yi keser; t = 3'te R'yi ister ama R L'de → H bloke olur, L devam eder.

Öncelik kalıtımı yokHMLKBKBR'yi bekliyor0246810121416lock(R)H: lock(R)M gelir

t = 4: orta öncelikli M gelir ve L'yi keser. H, R ile ilgisi olmayan M'yi bekliyor: öncelik ters çevirme.

Öncelik kalıtımı yokHMLKBKBKBR'yi bekliyor0246810121416lock(R)H: lock(R)M gelirunlock(R)

M t = 10'da biter, L kritik bölgeyi t = 11'de bırakır; H ancak o zaman çalışır: 8 ms bekledi. M uzadıkça bekleme sınırsız uzar.

Öncelik kalıtımı varHMLKBKBbekler0246810121416lock(R)L ← H önceliğiunlock(R)

Öncelik kalıtımı: H bloke olunca L geçici olarak H'nin önceliğini alır (turuncu kenar); t = 4'te gelen M araya giremez. H yalnızca 2 ms bekler.

Sunumdaki adlandırma: P1 = L, PRT3 = M, PRT2 = H. Gerçek örnek: Mars Pathfinder (1997) bu yüzden sürekli yeniden başladı; VxWorks'te öncelik kalıtımı açılarak düzeltildi. POSIX: PTHREAD_PRIO_INHERIT; Linux rt_mutex ve futex PI kilitleri. Diğer çözüm: öncelik tavanı (priority ceiling).

Çok İşlemcili Çizelgeleme

İş Parçacığı Çizelgeleme: PCS ve SCS

  • Çekirdek, süreçleri değil çekirdek iş parçacıklarını çizelgeler. Kullanıcı iş parçacıklarını bir kütüphane yönetir (Bölüm 4).
  • PCS (process-contention scope): N:1 ve M:N modellerinde kütüphane, kullanıcı iş parçacıklarını kendi süreci içindeki LWP'ler üzerinde yarıştırır.
  • SCS (system-contention scope): çekirdek, sistemdeki tüm iş parçacıkları arasında seçim yapar. 1:1 modelli Linux, Windows ve macOS yalnızca SCS kullanır.
  • Güncel PCS örneği: Java 21 sanal iş parçacıkları ve Go goroutine'leri, çalışma zamanının kendi çizelgeleyicisiyle az sayıda taşıyıcı iş parçacığına eşlenir.
pthread_attr_t attr;
int scope;
pthread_attr_init(&attr);
pthread_attr_getscope(&attr, &scope);
if (scope == PTHREAD_SCOPE_PROCESS)
  printf("PCS\n");
/* Linux ve macOS yalnızca SYSTEM */
pthread_attr_setscope(&attr,
                      PTHREAD_SCOPE_SYSTEM);
pthread_create(&tid, &attr, runner, NULL);

Çok İşlemcili Çizelgeleme

Çok İşlemcili Çizelgeleme Yaklaşımları

(a) ortak hazır kuyruğuT0T1T2T3T4kilitçekirdek 0çekirdek 1çekirdek 2çekirdek 3(b) çekirdek başına kuyrukçekirdek 0çekirdek 1çekirdek 2çekirdek 3
  • Asimetrik (AMP): tek bir ana işlemci tüm çizelgeleme ve G/Ç'yi yapar; basit ama darboğaz.
  • Simetrik (SMP): her işlemci kendi kendini çizelgeler; tüm modern sistemler.
  • (a) Ortak kuyruk: yük kendiliğinden dengelenir ama kilit çekişmesi ve zayıf önbellek yakınlığı.
  • (b) Çekirdek başına kuyruk: kilit yok denecek kadar azdır, iş parçacığı aynı çekirdekte kalır, önbellek sıcak olur. Linux, Windows ve FreeBSD bunu kullanır.
  • Bedeli: kuyruklar dengesizleşebilir → yük dengeleme gerekir.

Çok İşlemcili Çizelgeleme

Çok Çekirdek ve Donanım İş Parçacıkları

tek iş parçacıklı çekirdekbellek beklerbellek beklerbellek beklerSMT çekirdek: iş parçacığı 0MMMMMiş parçacığı 1MMMMMMzaman →mavi: hesaplama (C) · kesikli: bellek beklemesi (M)
  • Bellek beklemesi (memory stall): önbellek ıskalarında çekirdek zamanın %50'ye varan kısmını veri beklerken geçirebilir.
  • SMT (Intel Hyper-Threading, AMD SMT): bir çekirdekte 2 donanım iş parçacığı; biri beklerken diğeri yürür. İşletim sistemi her donanım iş parçacığını ayrı bir mantıksal CPU olarak görür.
  • İki düzeyli çizelgeleme: işletim sistemi hangi yazılım iş parçacığının hangi mantıksal CPU'da çalışacağını, çekirdek donanımı hangi donanım iş parçacığının o an yürüyeceğini seçer.
  • Kardeş mantıksal CPU'lar yürütme birimlerini paylaşır: boş fiziksel çekirdek varken iki yoğun işi aynı çekirdeğe koymak kötü bir karardır.

Çok İşlemcili Çizelgeleme

Yük Dengeleme

CPU0CPU1CPU2CPU3boşta

Başlangıç: CPU0'ın kuyruğunda 5 iş var, CPU3 boşta. Çekirdek başına kuyrukta dengesizlik kendiliğinden düzelmez.

CPU0CPU1CPU2CPU3itme (push): 2 iş

İtme göçü (push): periyodik dengeleyici yükleri karşılaştırır, aşırı yüklü CPU0'dan CPU3'e 2 iş iter.

CPU0CPU1CPU2boştaCPU3

CPU2'deki tek iş bitti; CPU2 boşta kaldı.

CPU0CPU1CPU2CPU3çekme (pull): 1 iş

Çekme göçü (pull): boşta kalan CPU2 en yüklü kuyruktan bir iş çalar. Linux her ikisini de kullanır.

CPU0CPU1CPU2CPU3

Denge sağlandı; ama taşınan işin önbelleği yeni CPU'da soğuktur. Linux önce SMT kardeşleri ve ortak önbellek içinde, NUMA düğümleri arasında daha seyrek dengeler (scheduling domains).

Çok İşlemcili Çizelgeleme

İşlemci Yakınlığı, NUMA ve Heterojen Çekirdekler

  • İşlemci yakınlığı (affinity): iş parçacığını önbelleği sıcak olan CPU'da tutmak. Yumuşak: çizelgeleyici dener ama garanti etmez. Katı: izin verilen CPU kümesi (sched_setaffinity(), taskset -c 0-3).
  • NUMA: iş parçacığını belleğinin bulunduğu düğümde çalıştırmak; Linux otomatik NUMA dengelemesi sayfaları ve görevleri yaklaştırır.
  • Yük dengeleme ile yakınlık çelişir: göç dengeyi sağlar ama önbelleği ve yerelliği bozar.
NUMA düğümü 0CPU 0CPU 1bellek 0NUMA düğümü 1CPU 2CPU 3bellek 1ara bağlantıyerel (hızlı)uzak (yavaş)
Heterojen çok işlemci: ARM big.LITTLE / DynamIQ, Intel 12. nesilden beri P/E çekirdekleri (Thread Director donanım ipuçları verir), Apple M serisi. Linux EAS (Energy Aware Scheduling) işi, performans hedefini karşılayan en az enerji harcayan çekirdeğe koyar; arka plan işleri verimli çekirdeklere gider.

Gerçek Zamanlı Çizelgeleme

Gerçek Zamanlı Sistemler ve Gecikme

Katı (hard) gerçek zaman

Son tarih kaçırılırsa sistem başarısızdır: ABS fren, hava yastığı, endüstriyel robot kontrolü, uçuş denetimi.

Yumuşak (soft) gerçek zaman

Kritik görev önceliklidir ama garanti yoktur; kaçırma kaliteyi düşürür: video akışı, VoIP, oyun, ses çalma.

olaykesme gecikmesiISRçakışmalardağıtımgerçek zamanlı süreçdağıtım gecikmesiolay gecikmesi (event latency)
  • Çakışmalar: çekirdekte çalışan herhangi bir işin kesilmesi ve düşük öncelikli sürecin tuttuğu kaynağın bırakılması. Bu yüzden kesmeli, öncelik tabanlı çekirdek gerekir; katı garanti için ayrıca kabul denetimi (admission control).
  • Algoritmalar statik (öncelikler önceden hesaplanır, ör. RM) ya da dinamik (kararlar çalışma anında, ör. EDF) olabilir.

Gerçek Zamanlı Çizelgeleme

Periyodik Görevler ve Hız Monoton (RM)

tp (periyot) = d (son tarih)periyot 1periyot 2periyot 3
  • Periyodik görev: 0 ≤ t ≤ d ≤ p; kullanım U = t / p.
  • Hız monoton (rate-monotonic, RM): statik öncelik = 1 / p; kısa periyot yüksek öncelik. Statik öncelikli algoritmalar içinde optimaldir.
  • Liu–Layland sınırı: ΣU ≤ n(21/n − 1) ise RM tüm son tarihleri karşılar. n = 1: 1 · n = 2: ≈ 0,828 · n = 3: ≈ 0,780 · n → ∞: ln 2 ≈ 0,693. Yeterli koşuldur, gerekli değil.
RM: P1 (p = 50, t = 20) önce · P2 (p = 100, t = 35)P1P2P1P1P2P10205070100120150170200

Örnek: U = 20/50 + 35/100 = 0,40 + 0,35 = 0,75 ≤ 0,828 → RM ile çizelgelenebilir. Silberschatz Şekil 5.21'den yeniden hesaplanmıştır.

Gerçek Zamanlı Çizelgeleme

RM ve EDF Adım Adım

RMEDFP1P202550160▼ son tarihler: mavi P1 (50, 100, 150) · yeşil P2 (80, 160)

U = 25/50 + 35/80 = 0,5 + 0,4375 = 0,94 > 0,828: RM için garanti yok. RM: P1 (kısa periyot) önce, 0–25; P2 25–50.

RMEDFP1P2P1P2025507580✗ P2 t = 80'de son tarihini kaçırdı (5 ms eksik)▼ son tarihler: mavi P1 (50, 100, 150) · yeşil P2 (80, 160)

t = 50: P1'in yeni işi gelir ve statik önceliği yüksek olduğu için P2'yi keser. P2 75–80'de 5 ms daha çalışır ama süre biter: son tarih kaçırıldı.

RMEDFP1P2P1P2025507580✗ P2 t = 80'de son tarihini kaçırdı (5 ms eksik)P1P202560160▼ son tarihler: mavi P1 (50, 100, 150) · yeşil P2 (80, 160)

EDF: önceliği son tarih belirler. t = 50'de P1'in son tarihi 100, P2'ninki 80 → P2 devam eder ve 60'ta biter.

RMEDFP1P2P1P2025507580✗ P2 t = 80'de son tarihini kaçırdı (5 ms eksik)P1P2P1P2P1P2P10256085100125145150160▼ son tarihler: mavi P1 (50, 100, 150) · yeşil P2 (80, 160)

t = 80'de P2'nin yeni işinin son tarihi 160, P1'inki 100 → P1 85'e kadar sürer. 100'de P1 (150) yine önce. Tüm son tarihler karşılanır.

RMEDFP1P2P1P2025507580✗ P2 t = 80'de son tarihini kaçırdı (5 ms eksik)P1P2P1P2P1P2P10256085100125145150160▼ son tarihler: mavi P1 (50, 100, 150) · yeşil P2 (80, 160)

EDF'de koşul ΣU ≤ 1 (kesmeli, bağımsız görevler, d = p): 0,94 ≤ 1 ve 400 ms'lik hiperperiyot boyunca hiç kaçırma yok. Bedeli: dinamik öncelik ve aşırı yükte öngörülemez kayıplar.

Orantılı pay (proportional share) çizelgeleme: toplam T pay dağıtılır; N pay alan uygulama CPU'nun N/T'sini alır, kabul denetimi toplamı aşan isteği reddeder. Linux SCHED_DEADLINE (3.14+) EDF ile CBS bant genişliği korumasını birleştirir.

Gerçek Zamanlı Çizelgeleme

POSIX Gerçek Zamanlı Çizelgeleme

pthread_attr_t attr;
struct sched_param sp;
int policy;
pthread_attr_init(&attr);
pthread_attr_getschedpolicy(&attr, &policy);
/* kalıtım kapatılmazsa politika yok sayılır */
pthread_attr_setinheritsched(&attr,
                      PTHREAD_EXPLICIT_SCHED);
pthread_attr_setschedpolicy(&attr, SCHED_FIFO);
sp.sched_priority = 50;          /* 1..99 */
pthread_attr_setschedparam(&attr, &sp);
pthread_create(&tid, &attr, runner, NULL);
PolitikaDavranış
SCHED_FIFOSabit öncelik (1–99), dilim yok; bloke olana ya da bırakana kadar.
SCHED_RRFIFO + eşit öncelikliler arasında dilim.
SCHED_OTHERVarsayılan (Linux'ta EEVDF); ayrıca BATCH, IDLE.
SCHED_DEADLINELinux: çalışma / son tarih / periyot ile EDF.
  • POSIX.1b uzantısı; ayrıcalık ister (CAP_SYS_NICE), kabukta chrt -f 50 ./prog. Linux RT işlere saniyenin en fazla 0,95 s'sini verir (sched_rt_runtime_us).

Düzeltme: sunumdaki pthread_attr_getsched_policy / setsched_policy adları yanlıştı; doğrusu pthread_attr_getschedpolicy ve pthread_attr_setschedpolicy.

İşletim Sistemi Örnekleri

Linux: Çizelgeleme Sınıfları

gerçek zamanlı (SCHED_FIFO / RR)normal (nice)099100139nice −20nice +19← yüksek öncelikdüşük öncelik →
Sınıf (öncelik sırasıyla)PolitikalarSeçim
stop— (çekirdek içi)CPU durdurma, göç; her şeyi keser
deadlineSCHED_DEADLINEEDF + CBS
rtSCHED_FIFO, SCHED_RR100 öncelik düzeyli dizi + bit eşlem, O(1)
fairSCHED_NORMAL, SCHED_BATCH, SCHED_IDLECFS (2.6.23–6.5), EEVDF (6.6+)
extSCHED_EXTBPF ile yazılan çizelgeleyici (sched_ext, 6.12+)
idle—hiç iş yoksa boşta döngüsü

Düzeltme: sunumda “iki çizelgeleme sınıfı (varsayılan, gerçek zamanlı)” yazıyordu; bugünkü çekirdekte yukarıdaki sınıflar vardır. Tarihçe: O(n) (2.4) → O(1) (2.6.0, 2003) → CFS (2.6.23, 2007) → EEVDF (6.6, 2023).

İşletim Sistemi Örnekleri

Linux CFS: Sanal Çalışma Süresi

41226812305580en soldaki = en küçük vruntime → sonraki
  • Completely Fair Scheduler (2.6.23–6.5): sabit dilim yerine her görevin sanal çalışma süresi (vruntime) tutulur; en küçüğü çalışır.
  • vruntime += Δ × 1024 / ağırlık. Ağırlık nice'tan gelir: nice 0 → 1024, nice 5 → 335, nice −5 → 3121; her nice adımı ≈ ×1,25 (≈ %10 CPU farkı).
  • Örnek: CPU'ya bağlı A (nice 0) ve B (nice 5): A 1024 / 1359 ≈ %75, B ≈ %25 alır. B 10 ms çalışınca vruntime'ı 10 × 1024 / 335 ≈ 30,6 ms artar.
  • Uyuyan G/Ç'ye bağlı görevin vruntime'ı az artar; uyanınca hemen öne geçer (yine de geride kalmışlara sınırlı avantaj verilir).
  • Ağaç: ekleme O(log n), en soldaki önbellekte → seçim O(1).

İşletim Sistemi Örnekleri

EEVDF: CFS'in Halefi

EEVDF (Earliest Eligible Virtual Deadline First, Stoica 1995; Linux 6.6+): görev, payından geride ya da tam payındaysa (gecikme lag ≥ 0, yani v ≤ V) uygundur; sanal son tarih vd = v + dilim / ağırlık. Uygunlar içinde vd en erken olan çalışır. Üç eşit ağırlıklı görev:

1011121314151617181920sanal zaman (ms)A · dilim 3vd = 15 · uygunB · dilim 1vd = 13 · uygunC · dilim 3vd = 18 · uygun değilV = 13

v: A 12, B 12, C 15 → V = ortalama = 13. C önde (v > V, negatif gecikme): uygun değil. A ve B uygun; vd: A 15, B 13 → B (kısa dilim, erken son tarih).

1011121314151617181920sanal zaman (ms)A · dilim 3vd = 15 · uygunB · dilim 1vd = 14 · uygunC · dilim 3vd = 18 · uygun değilV = 13,33

B 1 ms çalıştı → v = 13, yeni vd = 14. V = 13,33; uygun: A ve B → en erken vd B.

1011121314151617181920sanal zaman (ms)A · dilim 3vd = 15 · uygunB · dilim 1vd = 15 · uygun değilC · dilim 3vd = 18 · uygun değilV = 13,67

B 14'e ilerledi; V = 13,67. Artık yalnızca A uygun (B ve C ortalamanın önünde) → A 3 ms'lik dilimini çalışır.

1011121314151617181920sanal zaman (ms)A · dilim 3vd = 18 · uygun değilB · dilim 1vd = 15 · uygunC · dilim 3vd = 18 · uygun değilV = 14,67

A 3 ms çalıştı → v = 15, yeni vd = 18. V = 14,67; uygun yalnızca B (v = 14) → B.

1011121314151617181920sanal zaman (ms)A · dilim 3vd = 18 · uygunB · dilim 1vd = 16 · uygunC · dilim 3vd = 18 · uygunV = 15

V = 15: üçü de uygun. vd: A 18, B 16, C 18 → B. Kısa dilim isteyen B daha sık ama kısa çalışır; uygunluk koşulu sayesinde uzun vadede payı yine eşittir.

CFS'teki gecikme sezgileri yerine iki net ölçüt (uygunluk ve son tarih) gelir; gecikmeye duyarlı görev sched_setattr() ile kısa dilim isteyebilir (6.12+). Ağırlıklar nice ile CFS'tekiyle aynıdır.

İşletim Sistemi Örnekleri

Windows Çizelgeleme ve Öncelikleri

Göreli öncelikREALTIMEHIGHABOVE_NORMALNORMALBELOW_NORMALIDLE
zaman-kritik311515151515
en yüksek2615121086
normalin üstü251411975
normal241310864
normalin altı23129753
en düşük22118642
boşta1611111
  • Kesmeli, öncelik tabanlı: en yüksek öncelikli hazır iş parçacığı çalışır; bloke olana, dilimi bitene ya da daha yüksek öncelikli biri gelene kadar. 32 düzey: 1–15 değişken, 16–31 gerçek zamanlı, 0 sayfa sıfırlama (zero-page) iş parçacığı. Her düzey için bir kuyruk; iş yoksa boşta (idle) iş parçacığı.
  • Değişken sınıfta dinamik artırma: G/Ç tamamlanınca (klavye/fare için daha çok), ön plan penceresi ve GUI uyanmalarında öncelik geçici yükselir, her dilimde 1 azalır, 15'i aşmaz; ≈ 4 saniye aç kalan iş parçacığı bir dilimlik 15'e çıkarılır. Dilim istemcide ≈ 2, sunucuda 12 saat tıkı.

Değerlendirme ve Özet

Algoritmaları Değerlendirme

Deterministik modelleme

Önceden verilen bir iş yükü için her algoritmanın sonucu hesaplanır (bu bölümdeki Gantt şemaları). Kesin ve basittir ama yalnızca o girdi için geçerlidir.

Kuyruk modelleri

Geliş ve servis dağılımlarından ortalamalar. Little yasası: n = λ × W. Saniyede λ = 7 süreç gelir, her biri ortalama W = 2 s kalırsa kuyrukta ortalama n = 14 süreç vardır.

Simülasyon

Sistemin programlanmış modeli, rastgele üretilmiş ya da gerçek sistemden kaydedilmiş iz (trace) verisiyle çalıştırılır. Doğrudur ama saatler sürebilir.

Gerçekleme

Algoritma gerçek çekirdekte denenir. Bugün sched_ext ile BPF çizelgeleyicileri çekirdeği yeniden derlemeden yüklenip üretimde A/B test edilebiliyor. Bedeli: kullanıcı davranışı da algoritmaya uyum sağlar.

Değerlendirme ve Özet

Ortak Kümede Karşılaştırma

AlgoritmaBeklemeDönüşYanıtGeçiş
FCFS8,7515,258,753
SJF7,7514,257,753
SRTF6,5134,254
Öncelik (K)10,7517,258,54
RR q = 212,7519,25212
RR q = 51117,55,55

Ortalamalar ms cinsinden; K = kesmeli; geçiş = bağlam değiştirme sayısı.

FCFS8,758,75SJF7,757,75SRTF6,54,25Öncelik (K)10,758,5RR q = 212,752RR q = 5115,5ort. beklemeort. yanıt (ms)
  • SRTF ortalama beklemede en iyisidir (6,5) ama sürelerin bilinmesini ister; RR q = 2 yanıtta en iyisidir (2) ama en çok geçişi yapar.
  • Öncelik bekleme süresini değil önemi optimize eder. Tek bir “en iyi” algoritma yoktur: seçim, hedefe (yanıt, verim, adalet, son tarih) bağlıdır.

Değerlendirme ve Özet

Kontrol Soruları

  1. Kesmesiz bir çizelgeleyici hangi durum geçişlerinde karar verir?
  2. P1 = 5, P2 = 2, P3 = 1 ms, hepsi t = 0'da ve bu sırayla geliyor. FCFS ve SJF için ortalama bekleme nedir?
  3. α = 0,5 ve τ0 = 8. Ölçülen patlamalar 4 ve 12 ms ise sonraki tahmin kaçtır?
  4. RR'de kuantum çok büyük ya da çok küçük seçilirse ne olur? q = 4 ms, geçiş 1 ms ise kayıp oranı nedir?
  5. Ortak kümede SRTF, P1'i neden t = 1'de keser?
  6. Öncelik ters çevirme nedir, öncelik kalıtımı onu nasıl çözer?
  7. P1 (p = 40, t = 10) ve P2 (p = 60, t = 30) RM ile çizelgelenebilir mi?
  8. CFS'de nice 0 ve nice 5 olan iki CPU'ya bağlı görev CPU'yu nasıl paylaşır? EEVDF'de “uygun” görev ne demektir?
Cevaplar
  1. Çalışıyor → bekliyor (G/Ç, wait) ve sonlanma.
  2. FCFS: (0 + 5 + 7) / 3 = 4; SJF (P3, P2, P1): (0 + 1 + 3) / 3 ≈ 1,33 ms.
  3. τ1 = 0,5·4 + 0,5·8 = 6; τ2 = 0,5·12 + 0,5·6 = 9 ms.
  4. Büyük: FCFS'ye döner, yanıt kötüleşir. Küçük: geçiş yükü artar. 1 / (4 + 1) = %20.
  5. P2 gelir (4 ms), P1'in kalanı 7 ms: 4 < 7.
  6. Yüksek öncelikli iş, düşüğün tuttuğu kilidi beklerken orta öncelikli iş araya girer; kalıtımla kilidi tutan geçici olarak bekleyenin önceliğini alır.
  7. U = 0,25 + 0,5 = 0,75 ≤ 0,828 → evet (simülasyonda da kaçırma yok).
  8. 1024 : 335 → ≈ %75 / %25. Uygun: v ≤ V, yani payını almamış ya da tam almış (lag ≥ 0).

Değerlendirme ve Özet

Kaynaklar

  • A. Silberschatz, P. B. Galvin, G. Gagne, Operating System Concepts, 10. baskı, Wiley, 2018 — Bölüm 5: CPU Scheduling.
  • A. S. Tanenbaum, H. Bos, Modern Operating Systems, 4. baskı (2014) / 5. baskı (2022), Pearson — Bölüm 2.4: Scheduling.
  • R. H. Arpaci-Dusseau, A. C. Arpaci-Dusseau, Operating Systems: Three Easy Pieces (OSTEP), ostep.org — Bölüm 7–10: Scheduling, MLFQ, Lottery, Multiprocessor.
  • P. Yosifovich, A. Ionescu, M. Russinovich, D. Solomon, Windows Internals, 7. baskı, Kısım 1, 2017 — Bölüm 4: Thread scheduling.
  • Linux çekirdek belgeleri: sched-eevdf.rst, sched-design-CFS.rst, sched-deadline.rst, sched-ext.rst; sched(7) kılavuz sayfası.
  • I. Stoica, H. Abdel-Wahab, “Earliest Eligible Virtual Deadline First”, 1995; C. L. Liu, J. W. Layland, “Scheduling Algorithms for Multiprogramming in a Hard-Real-Time Environment”, JACM, 1973; C. A. Waldspurger, W. E. Weihl, “Lottery Scheduling”, OSDI 1994.

Son

Bölüm 5: CPU Çizelgeleme
Sonraki bölüm: Senkronizasyon
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.