Bölüm 5: CPU Çizelgeleme
Giriş
Öğrenme Çıktıları
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.
Bekleme, dönüş ve yanıt sürelerini Gantt şemasından hesaplamak; verim, CPU kullanımı ve adalet hedeflerini tartmak.
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.
Sonraki CPU patlamasını üstel ortalamayla tahmin etmek; yaşlanma, piyango, stride ve adil paylaşımla açlığı önlemek.
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.
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.
Temel Kavramlar
CPU–G/Ç Patlama Döngüsü
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?
1. Çalışıyor → bekliyor: süreç G/Ç ister ya da wait() çağırır. CPU boşalır, seçim zorunludur.
2. Çalışıyor → hazır: saat kesmesi geldi, zaman dilimi doldu. Çalışanı kesmek isteğe bağlıdır.
3. Bekliyor → hazır: G/Ç tamamlandı; uyanan süreç çalışandan daha önemliyse onu kesebilir.
4. Sonlanma: süreç exit() ile biter; CPU boşalır, seçim zorunludur.
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
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.
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
- 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ındakicssütunu;/proc/<pid>/statusiçindekivoluntary_ctxt_switchesvenonvoluntary_ctxt_switches.
| Bileşen | Süreçler arası geçişte |
|---|---|
| Yazmaçlar, PC, SP | kaydedilir / yüklenir |
| Bellek haritası | sayfa tablosu tabanı değişir (x86: CR3) |
| TLB | PCID/ASID varsa boşaltılmaz |
| Önbellekler | boşaltılmaz ama soğuk kalır |
Temel Kavramlar
Ortama Göre Çizelgeleme Hedefleri
| Ortam | Öncelikli hedefler | Uygun yaklaşım |
|---|---|---|
| Tüm sistemler | Adalet (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şimli | Kı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 |
Temel Kavramlar
Çizelgeleme Ölçütleri
| Ölçüt | Tanım | Hedef |
|---|---|---|
| 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 − G | en 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: İ − G | en 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 |
|---|---|---|---|
| P1 | 0 | 8 | 2 |
| P2 | 1 | 4 | 3 |
| P3 | 2 | 9 | 1 |
| P4 | 3 | 5 | 4 |
- 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.
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.
t = 0: kuyrukta yalnızca P1 var; CPU'yu alır ve 8 ms boyunca bırakmaz (kesmesiz).
t = 8: P1 bitti. Kuyruk geliş sırasıyla ilerler → baştaki P2 çalışır (7 ms bekledi).
t = 12: P2 bitti. Kuyruk geliş sırasıyla ilerler → baştaki P3 çalışır (10 ms bekledi).
t = 21: P3 bitti. Kuyruk geliş sırasıyla ilerler → baştaki P4 çalışır (18 ms bekledi).
| Süreç | Geliş | CPU | İlk çalışma | Bitiş | Dönüş | Bekleme | Yanıt |
|---|---|---|---|---|---|---|---|
| P1 | 0 | 8 | 0 | 8 | 8 | 0 | 0 |
| P2 | 1 | 4 | 8 | 12 | 11 | 7 | 7 |
| P3 | 2 | 9 | 12 | 21 | 19 | 10 | 10 |
| P4 | 3 | 5 | 21 | 26 | 23 | 18 | 18 |
| Ort. | 15,25 | 8,75 | 8,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
Uzun iş önde: kısa P2 ve P3, P1'in arkasında bekler. Ortalama bekleme 17 ms.
Aynı işler, farklı geliş sırası: ortalama 3 ms. FCFS'de sonuç geliş sırasına aşırı duyarlıdır.
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); }
Saat t ve toplam bekleme top sıfırlanır. Süreçler geliş sırasındadır.
P1 0'de gelmişti; CPU 0'de boşaldı → bekleme = 0 − 0 = 0.
P1 8 ms çalışır, saat 8 olur; toplam bekleme 0.
P2 1'de gelmişti; CPU 8'de boşaldı → bekleme = 8 − 1 = 7.
P2 4 ms çalışır, saat 12 olur; toplam bekleme 7.
P3 2'de gelmişti; CPU 12'de boşaldı → bekleme = 12 − 2 = 10.
P3 9 ms çalışır, saat 21 olur; toplam bekleme 17.
P4 3'de gelmişti; CPU 21'de boşaldı → bekleme = 21 − 3 = 18.
P4 5 ms çalışır, saat 26 olur; toplam bekleme 35.
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.
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.
t = 0: hepsi hazır; en kısa CPU süresine sahip P4 (3) seçilir.
t = 3: P4 bitti. Hazır: P1 (6), P2 (8), P3 (7) → en kısa P1 (6).
t = 9: P1 bitti. Hazır: P3 (7), P2 (8) → en kısa P3 (7).
t = 16: P3 bitti. Hazır: P2 (8) → en kısa P2 (8).
| Süreç | Geliş | CPU | İlk çalışma | Bitiş | Dönüş | Bekleme | Yanıt |
|---|---|---|---|---|---|---|---|
| P1 | 0 | 6 | 3 | 9 | 9 | 3 | 3 |
| P2 | 0 | 8 | 16 | 24 | 24 | 16 | 16 |
| P3 | 0 | 7 | 9 | 16 | 16 | 9 | 9 |
| P4 | 0 | 3 | 0 | 3 | 3 | 0 | 0 |
| Ort. | 13 | 7 | 7 |
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.
t = 0: yalnızca P1 hazır. SJF kesmesiz: sonradan gelen kısa işler P1'i durduramaz.
t = 8: P1 bitti. Hazır: P2 (4), P3 (9), P4 (5) → en kısa P2 (4).
t = 12: P2 bitti. Hazır: P3 (9), P4 (5) → en kısa P4 (5).
t = 17: P4 bitti. Hazır: P3 (9) → en kısa P3 (9).
| Süreç | Geliş | CPU | İlk çalışma | Bitiş | Dönüş | Bekleme | Yanıt |
|---|---|---|---|---|---|---|---|
| P1 | 0 | 8 | 0 | 8 | 8 | 0 | 0 |
| P2 | 1 | 4 | 8 | 12 | 11 | 7 | 7 |
| P3 | 2 | 9 | 17 | 26 | 24 | 15 | 15 |
| P4 | 3 | 5 | 12 | 17 | 14 | 9 | 9 |
| Ort. | 14,25 | 7,75 | 7,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ı
| A | B | C | D | E | Ort. | ||
|---|---|---|---|---|---|---|---|
| Geliş | 0 | 1 | 2 | 3 | 4 | ||
| CPU | 4 | 3 | 5 | 2 | 4 | ||
| SJF | Bitiş | 4 | 9 | 18 | 6 | 13 | |
| Dönüş | 4 | 8 | 16 | 3 | 9 | 8 | |
| Ağırlıklı | 1 | 2,67 | 3,2 | 1,5 | 2,25 | 2,12 | |
| FCFS | Bitiş | 4 | 7 | 12 | 14 | 18 | |
| Dönüş | 4 | 6 | 10 | 11 | 14 | 9 | |
| Ağırlıklı | 1 | 2 | 2 | 5,5 | 3,5 | 2,8 |
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.
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.
n = 0: gerçek 6, tahmin 10 idi → τ = 0,5·6 + 0,5·10 = 8.
n = 1: gerçek 4, tahmin 8 idi → τ = 0,5·4 + 0,5·8 = 6.
n = 2: gerçek 6, tahmin 6 idi → τ = 0,5·6 + 0,5·6 = 6.
n = 3: gerçek 4, tahmin 6 idi → τ = 0,5·4 + 0,5·6 = 5.
n = 4: gerçek 13, tahmin 5 idi → τ = 0,5·13 + 0,5·5 = 9.
n = 5: gerçek 13, tahmin 9 idi → τ = 0,5·13 + 0,5·9 = 11.
n = 6: gerçek 13, tahmin 11 idi → τ = 0,5·13 + 0,5·11 = 12.
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.
t = 0: yalnızca P1 var ve çalışmaya başlar.
t = 1: P2 gelir (4); çalışan P1 için kalan 7. 4 < 7 → P1 kesilir, P2 çalışır.
t = 2: P3 gelir (9). Çalışan P2 için kalan 3 ≤ 9 → kesme yok.
t = 3: P4 gelir (5). Çalışan P2 için kalan 2 ≤ 5 → kesme yok.
t = 5: P2 bitti. Kalan süreler: P1 7, P3 9, P4 5 → en kısa P4 (5).
t = 10: P4 bitti. Kalan süreler: P1 7, P3 9 → en kısa P1 (7).
t = 17: P1 bitti. Kalan süreler: P3 9 → en kısa P3 (9).
| Süreç | Geliş | CPU | İlk çalışma | Bitiş | Dönüş | Bekleme | Yanıt |
|---|---|---|---|---|---|---|---|
| P1 | 0 | 8 | 0 | 17 | 17 | 9 | 0 |
| P2 | 1 | 4 | 1 | 5 | 4 | 0 | 0 |
| P3 | 2 | 9 | 17 | 26 | 24 | 15 | 15 |
| P4 | 3 | 5 | 5 | 10 | 7 | 2 | 2 |
| Ort. | 13 | 6,5 | 4,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).
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.
t = 0: yalnızca P1 var ve çalışmaya başlar.
t = 1: P2 gelir (öncelik 3). Çalışan P1 önceliği 2 ile daha yüksek → kesme yok.
t = 2: P3 gelir (öncelik 1); çalışan P1 önceliği 2 ile daha düşük → kesilir, P3 çalışır.
t = 3: P4 gelir (öncelik 4). Çalışan P3 önceliği 1 ile daha yüksek → kesme yok.
t = 11: P3 bitti. Hazır: P1 (ö 2), P2 (ö 3), P4 (ö 4) → en yüksek öncelikli P1.
t = 17: P1 bitti. Hazır: P2 (ö 3), P4 (ö 4) → en yüksek öncelikli P2.
t = 21: P2 bitti. Hazır: P4 (ö 4) → en yüksek öncelikli P4.
| Süreç | Geliş | CPU | Öncelik | İlk çalışma | Bitiş | Dönüş | Bekleme | Yanıt |
|---|---|---|---|---|---|---|---|---|
| P1 | 0 | 8 | 2 | 0 | 17 | 17 | 9 | 0 |
| P2 | 1 | 4 | 3 | 17 | 21 | 20 | 16 | 16 |
| P3 | 2 | 9 | 1 | 2 | 11 | 9 | 0 | 0 |
| P4 | 3 | 5 | 4 | 21 | 26 | 23 | 18 | 18 |
| Ort. | 17,25 | 10,75 | 8,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.
t = 0: L'nin önceliği 7, yeni gelen H1'ninki 2 → H1 çalışır. L 4 ms daha bekleyince önceliği 6 olur.
t = 4: L'nin önceliği 6, yeni gelen H2'ninki 2 → H2 çalışır. L 4 ms daha bekleyince önceliği 5 olur.
t = 8: L'nin önceliği 5, yeni gelen H3'ninki 2 → H3 çalışır. L 4 ms daha bekleyince önceliği 4 olur.
t = 12: L'nin önceliği 4, yeni gelen H4'ninki 2 → H4 çalışır. L 4 ms daha bekleyince önceliği 3 olur.
t = 16: L'nin önceliği 3, yeni gelen H5'ninki 2 → H5 çalışır. L 4 ms daha bekleyince önceliği 2 olur.
t = 20: L'nin önceliği 2, H6 ile eşit; eşitlikte önce gelen kazanır → L nihayet çalışır (20 ms bekledi).
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).
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.
t = 0: yalnızca P1 var; en fazla q = 2 ms çalışır, sonra sırayı bırakır.
t = 2: P1 dilimini doldurdu (kalan 6) ve kuyruğun sonuna gider. Arada gelen P2, P3 kuyruğa ondan önce girdi. Sıradaki: P2.
t = 4: P2 dilimini doldurdu (kalan 2) ve kuyruğun sonuna gider. Arada gelen P4 kuyruğa ondan önce girdi. Sıradaki: P3.
t = 6: P3 dilimini doldurdu (kalan 7) ve kuyruğun sonuna gider. Sıradaki: P1.
t = 8: P1 dilimini doldurdu (kalan 4) ve kuyruğun sonuna gider. Sıradaki: P4.
t = 10: P4 dilimini doldurdu (kalan 3) ve kuyruğun sonuna gider. Sıradaki: P2.
t = 12: P2 işini dilim dolmadan bitirdi. Sıradaki: P3.
t = 14: P3 dilimini doldurdu (kalan 5) ve kuyruğun sonuna gider. Sıradaki: P1.
t = 16: P1 dilimini doldurdu (kalan 2) ve kuyruğun sonuna gider. Sıradaki: P4.
t = 18: P4 dilimini doldurdu (kalan 1) ve kuyruğun sonuna gider. Sıradaki: P3.
t = 20: P3 dilimini doldurdu (kalan 3) ve kuyruğun sonuna gider. Sıradaki: P1.
t = 22: P1 işini dilim dolmadan bitirdi. Sıradaki: P4.
t = 23: P4 işini dilim dolmadan bitirdi. Sıradaki: P3.
t = 25: P3 dilimini doldurdu (kalan 1) ama kuyrukta başka süreç yok → yeni dilim alır, bağlam değiştirme olmaz.
| Süreç | Geliş | CPU | İlk çalışma | Bitiş | Dönüş | Bekleme | Yanıt |
|---|---|---|---|---|---|---|---|
| P1 | 0 | 8 | 0 | 22 | 22 | 14 | 0 |
| P2 | 1 | 4 | 2 | 12 | 11 | 7 | 1 |
| P3 | 2 | 9 | 4 | 26 | 24 | 15 | 2 |
| P4 | 3 | 5 | 8 | 23 | 20 | 15 | 5 |
| Ort. | 19,25 | 12,75 | 2 |
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.
t = 0: yalnızca P1 var; en fazla q = 5 ms çalışır, sonra sırayı bırakır.
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.
t = 9: P2 işini dilim dolmadan bitirdi. Sıradaki: P3.
t = 14: P3 dilimini doldurdu (kalan 4) ve kuyruğun sonuna gider. Sıradaki: P4.
t = 19: P4 işini dilim dolmadan bitirdi. Sıradaki: P1.
t = 22: P1 işini dilim dolmadan bitirdi. Sıradaki: P3.
| Süreç | Geliş | CPU | İlk çalışma | Bitiş | Dönüş | Bekleme | Yanıt |
|---|---|---|---|---|---|---|---|
| P1 | 0 | 8 | 0 | 22 | 22 | 14 | 0 |
| P2 | 1 | 4 | 5 | 9 | 8 | 4 | 4 |
| P3 | 2 | 9 | 9 | 26 | 24 | 15 | 7 |
| P4 | 3 | 5 | 14 | 19 | 16 | 11 | 11 |
| Ort. | 17,5 | 11 | 5,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
| Kuantum | Bekleme | Dönüş | Yanıt | Geçiş |
|---|---|---|---|---|
| q = 2 | 12,75 | 19,25 | 2 | 12 |
| q = 3 | 13,5 | 20 | 3 | 9 |
| q = 4 | 11,75 | 18,25 | 4,5 | 7 |
| q = 5 | 11 | 17,5 | 5,5 | 5 |
| q = 6 | 12 | 18,5 | 6,5 | 5 |
| q ≥ 9 (FCFS) | 8,75 | 15,25 | 8,75 | 3 |
Ortalamalar ms cinsinden; geçiş = bağlam değiştirme sayısı.
- 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
- 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.
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)
- Öncelik(A) > Öncelik(B) → A çalışır; eşitse RR.
- Yeni iş en üst kuyruğa girer (önce kısa olduğu varsayılır).
- Bir düzeydeki hakkını (allotment) bitiren iş, kaç kez CPU'yu bırakmış olursa olsun bir alt düzeye iner.
- 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.
t = 0: A gelir ve Q0'a girer; 8 ms'lik dilimiyle çalışır. B (t = 2) ve C (t = 4) Q0'a eklenir.
t = 8: A dilimini doldurdu → Q1'e iner. Q0'da sıradaki B çalışır.
t = 14: B 6 ms'de bitti (dilim dolmadan, Q0'da). Şimdi C, Q0'da 8 ms çalışır.
t = 22: C de Q1'e iner. Q0 boş → Q1'in başındaki A 16 ms'lik dilimle çalışır.
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ı).
t = 29: D 4 ms'de bitti (yanıt 0, bekleme 0). A, Q1'de kalan 13 ms'lik dilimini kullanır.
t = 42: A Q1 dilimini de doldurdu → Q2. C, Q1'de çalışır; 12 ms yeterli.
t = 54: Q0 ve Q1 boş; A Q2'de FCFS ile kalan 6 ms'yi çalışır ve t = 60'ta biter.
| İş | Geliş | CPU | Bitiş | Dönüş | Bekleme | Yanıt |
|---|---|---|---|---|---|---|
| A | 0 | 30 | 60 | 60 | 30 | 0 |
| B | 2 | 6 | 14 | 12 | 6 | 6 |
| C | 4 | 20 | 54 | 50 | 30 | 10 |
| D | 25 | 4 | 29 | 4 | 0 | 0 |
| Ort. | 31,5 | 16,5 | 4 |
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
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).
Ç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).
Ö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ı.
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.
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
- 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ı.
Adım 1: pass değerleri A 0, B 0, C 0 → en küçük A çalışır; pass(A) += 100.
Adım 2: pass değerleri A 100, B 0, C 0 → en küçük B çalışır; pass(B) += 200.
Adım 3: pass değerleri A 100, B 200, C 0 → en küçük C çalışır; pass(C) += 40.
Adım 4: pass değerleri A 100, B 200, C 40 → en küçük C çalışır; pass(C) += 40.
Adım 5: pass değerleri A 100, B 200, C 80 → en küçük C çalışır; pass(C) += 40.
Adım 6: pass değerleri A 100, B 200, C 120 → en küçük A çalışır; pass(A) += 100.
Adım 7: pass değerleri A 200, B 200, C 120 → en küçük C çalışır; pass(C) += 40.
Adım 8: pass değerleri A 200, B 200, C 160 → en küçük C çalışır; pass(C) += 40.
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
t = 0: düşük öncelikli L kaynak R'yi kilitler ve kritik bölgeye (KB) girer.
t = 2: H gelir, L'yi keser; t = 3'te R'yi ister ama R L'de → H bloke olur, L devam eder.
t = 4: orta öncelikli M gelir ve L'yi keser. H, R ile ilgisi olmayan M'yi bekliyor: öncelik ters çevirme.
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ı: 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ı
- 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ı
- 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
Başlangıç: CPU0'ın kuyruğunda 5 iş var, CPU3 boşta. Çekirdek başına kuyrukta dengesizlik kendiliğinden düzelmez.
İtme göçü (push): periyodik dengeleyici yükleri karşılaştırır, aşırı yüklü CPU0'dan CPU3'e 2 iş iter.
CPU2'deki tek iş bitti; CPU2 boşta kaldı.
Çekme göçü (pull): boşta kalan CPU2 en yüklü kuyruktan bir iş çalar. Linux her ikisini de kullanır.
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.
Gerçek Zamanlı Çizelgeleme
Gerçek Zamanlı Sistemler ve Gecikme
Son tarih kaçırılırsa sistem başarısızdır: ABS fren, hava yastığı, endüstriyel robot kontrolü, uçuş denetimi.
Kritik görev önceliklidir ama garanti yoktur; kaçırma kaliteyi düşürür: video akışı, VoIP, oyun, ses çalma.
- Ç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)
- 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.
Ö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
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.
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ı.
EDF: önceliği son tarih belirler. t = 50'de P1'in son tarihi 100, P2'ninki 80 → P2 devam eder ve 60'ta biter.
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.
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);
| Politika | Davranış |
|---|---|
SCHED_FIFO | Sabit öncelik (1–99), dilim yok; bloke olana ya da bırakana kadar. |
SCHED_RR | FIFO + eşit öncelikliler arasında dilim. |
SCHED_OTHER | Varsayılan (Linux'ta EEVDF); ayrıca BATCH, IDLE. |
SCHED_DEADLINE | Linux: çalışma / son tarih / periyot ile EDF. |
- POSIX.1b uzantısı; ayrıcalık ister (
CAP_SYS_NICE), kabuktachrt -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ı
| Sınıf (öncelik sırasıyla) | Politikalar | Seçim |
|---|---|---|
stop | — (çekirdek içi) | CPU durdurma, göç; her şeyi keser |
deadline | SCHED_DEADLINE | EDF + CBS |
rt | SCHED_FIFO, SCHED_RR | 100 öncelik düzeyli dizi + bit eşlem, O(1) |
fair | SCHED_NORMAL, SCHED_BATCH, SCHED_IDLE | CFS (2.6.23–6.5), EEVDF (6.6+) |
ext | SCHED_EXT | BPF 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
- 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:
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).
B 1 ms çalıştı → v = 13, yeni vd = 14. V = 13,33; uygun: A ve B → en erken vd B.
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.
A 3 ms çalıştı → v = 15, yeni vd = 18. V = 14,67; uygun yalnızca B (v = 14) → B.
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 öncelik | REALTIME | HIGH | ABOVE_NORMAL | NORMAL | BELOW_NORMAL | IDLE |
|---|---|---|---|---|---|---|
| zaman-kritik | 31 | 15 | 15 | 15 | 15 | 15 |
| en yüksek | 26 | 15 | 12 | 10 | 8 | 6 |
| normalin üstü | 25 | 14 | 11 | 9 | 7 | 5 |
| normal | 24 | 13 | 10 | 8 | 6 | 4 |
| normalin altı | 23 | 12 | 9 | 7 | 5 | 3 |
| en düşük | 22 | 11 | 8 | 6 | 4 | 2 |
| boşta | 16 | 1 | 1 | 1 | 1 | 1 |
- 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
Ö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.
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.
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.
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
| Algoritma | Bekleme | Dönüş | Yanıt | Geçiş |
|---|---|---|---|---|
| FCFS | 8,75 | 15,25 | 8,75 | 3 |
| SJF | 7,75 | 14,25 | 7,75 | 3 |
| SRTF | 6,5 | 13 | 4,25 | 4 |
| Öncelik (K) | 10,75 | 17,25 | 8,5 | 4 |
| RR q = 2 | 12,75 | 19,25 | 2 | 12 |
| RR q = 5 | 11 | 17,5 | 5,5 | 5 |
Ortalamalar ms cinsinden; K = kesmeli; geçiş = bağlam değiştirme sayısı.
- 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ı
- Kesmesiz bir çizelgeleyici hangi durum geçişlerinde karar verir?
- P1 = 5, P2 = 2, P3 = 1 ms, hepsi t = 0'da ve bu sırayla geliyor. FCFS ve SJF için ortalama bekleme nedir?
- α = 0,5 ve τ0 = 8. Ölçülen patlamalar 4 ve 12 ms ise sonraki tahmin kaçtır?
- 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?
- Ortak kümede SRTF, P1'i neden t = 1'de keser?
- Öncelik ters çevirme nedir, öncelik kalıtımı onu nasıl çözer?
- P1 (p = 40, t = 10) ve P2 (p = 60, t = 30) RM ile çizelgelenebilir mi?
- 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
- Çalışıyor → bekliyor (G/Ç,
wait) ve sonlanma. - FCFS: (0 + 5 + 7) / 3 = 4; SJF (P3, P2, P1): (0 + 1 + 3) / 3 ≈ 1,33 ms.
- τ1 = 0,5·4 + 0,5·8 = 6; τ2 = 0,5·12 + 0,5·6 = 9 ms.
- Büyük: FCFS'ye döner, yanıt kötüleşir. Küçük: geçiş yükü artar. 1 / (4 + 1) = %20.
- P2 gelir (4 ms), P1'in kalanı 7 ms: 4 < 7.
- 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.
- U = 0,25 + 0,5 = 0,75 ≤ 0,828 → evet (simülasyonda da kaçırma yok).
- 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.