---
title: 'İşler ve Zamanlanmış İşler'
source: 'https://academia.sh/tr/kurslar/orkestrasyon/isler-ve-zamanlanmis-isler'
course: 'Konteyner Orkestrasyonu'
language: tr
updated: '2026-08-17T18:09:08+00:00'
license: 'CC BY-SA 4.0'
---

# İşler ve Zamanlanmış İşler

Bitmesi beklenen görevlerin küme nesnesiyle modellenmesi: iş nesnesinin tamamlanma güvencesi deneme sınırına göre sayılır, paralellik ile tamamlanma sayısı ayarlarının tur ve boş yuva sonuçları taranır, zamanlanmış işte kaçırılan koşum ölçülür ve üst üste binme için atla, sıraya al ve paralel koş politikaları ayrı ayrı karşılaştırılır.

Kopya kümesi ve sıralı küme aynı varsayımı paylaşıyor: kapsüller bitmez. İstenen kopya sayısı bir
hedeftir, bir kapsül sonlanırsa bu bir sapmadır ve uzlaştırıcı onu yeniden yaratır. Ölçüm ağının
gecelik toplu işi bu varsayıma uymuyor. O iş her gece başlar, günün okumalarını on iki sayaç
kümesinde doğrular, faturalama girdisini üretir ve **biter**. Bitmesi beklenen davranıştır; kopya
kümesine verilseydi uzlaştırıcı onu her gece sonsuz kez yeniden başlatırdı.

Bu yüzden ikinci bir nesne türü gerekiyor: **iş nesnesi**. İş nesnesinin hedefi çalışan kapsül
sayısı değil, **tamamlanmış koşum sayısıdır**. Sonlanma sapma değil, hedefin kendisidir. Üstüne bir
takvim eklenince **zamanlanmış iş** çıkar: belirli anlarda iş nesnesi üreten bir nesne.

Devredilen karar burada üç parçalıdır: iş bitti mi, bitmediyse yeniden denenecek mi, bir sonraki
koşum ne zaman ve önceki hâlâ sürüyorsa ne yapılacak. Sayılan dört şey: deneme sınırı tamamlanmayı
ne kadar satın alıyor, paralellik hangi turu ve hangi israfı veriyor, üç çakışma politikası neyi
feda ediyor, kaçırılan koşum telafi edilebiliyor mu.

## Bitmesi Beklenen İş

Uzlaştırıcı iki nesnede de aynı döngüyü koşar — istenen durum, gerçek durum, fark, düzeltme — ama
"istenen durum" başka bir şeydir. Kopya kümesinde istenen durum bir **an** hakkındadır: şu anda üç
kapsül çalışıyor olmalı. İş nesnesinde istenen durum bir **geçmiş** hakkındadır: on iki dilim
tamamlanmış olmalı. Birinci durum sürekli denetlenir, ikincisi bir kez sağlanır ve bir daha bozulmaz.

- **TN43** — İş nesnesi, deneme sayacı, paralellik yuvaları ve gece takvimi `node` içinde kurulan
  bir modeldir; gerçek bir küme koşturulmuyor.
- **TN44** — Ölçüm ağı kurgudur. Gecelik toplu iş 30 gece koşuyor ve her koşum on iki sayaç
  kümesine (dilime) bölünüyor.
- **TN45** — Bir denemenin başarısız olma olasılığı 0,5; başarısızlık kaynağı modelde tek sınıftır
  (girdi dosyası hazır değil). Deneme sınırı 1, 3 ve 6 değerleriyle taranıyor.
- **TN46** — Her dilim bir tur sürüyor; paralellik eş zamanlı yuva sayısıdır. Bir dilim ikinci
  denemeye kalırsa toplam süreye bir tur ekleniyor.
- **TN47** — Zamanlanmış işin aralığı 24 saat. Koşum süreleri üreteçten geliyor: yaklaşık dörtte
  bir olasılıkla 30–54 saat, ötekiler 3–7 saat.
- **TN48** — Denetleyici üç gece kapalı kalıyor. Başlangıç penceresi 0, 1 ve 3 gece değerleriyle
  taranıyor. Tohum `20260813`.

```js
// olcum/isler.mjs — is nesnesinin tamamlanma guvencesi ve zamanlanmis isin cakisma politikalari.
// MODEL: is nesnesi, deneme sayaci, paralellik yuvalari ve gece takvimi node icinde kurulan
// modeldir; gercek bir kume kosturulmuyor. Sayilar modelin sayilaridir.
const GECE = 30, DILIM = 12, ARALIK = 24, TOHUM = 20260813, P_HATA = 0.5;
let s = TOHUM % 2147483647;
const rast = () => (s = (s * 48271) % 2147483647) / 2147483647;

// --- 1. tamamlanma guvencesi: deneme siniri ---
console.log(`${"deneme siniri".padEnd(14)}${"tamamlanan gece".padStart(16)}${"basarisiz gece".padStart(16)}` +
  `${"toplam deneme".padStart(15)}${"bosa giden deneme".padStart(19)}${"kalan artik kapsul".padStart(20)}`);
for (const sinir of [1, 3, 6]) {
  s = TOHUM % 2147483647;
  let tamam = 0, deneme = 0, bosa = 0;
  for (let g = 0; g < GECE; g += 1) {
    let d = 0, ok = false;
    while (d < sinir && !ok) { d += 1; deneme += 1; if (rast() >= P_HATA) ok = true; else bosa += 1; }
    if (ok) tamam += 1;
  }
  console.log(`${String(sinir).padEnd(14)}${String(tamam).padStart(16)}${String(GECE - tamam).padStart(16)}` +
    `${String(deneme).padStart(15)}${String(bosa).padStart(19)}${String(bosa).padStart(20)}`);
}

// --- 2. paralellik ve tamamlanma sayisi ---
console.log(`\n${"paralellik".padEnd(11)}${"tamamlanma sayisi".padStart(18)}${"tur".padStart(5)}${"kapsul-tur".padStart(12)}` +
  `${"bos yuva".padStart(10)}${"bir dilim 2 deneme".padStart(20)}${"artis".padStart(8)}`);
for (const p of [1, 3, 5, 6, 12]) {
  const tur = Math.ceil(DILIM / p), gecikmeli = tur + 1;
  console.log(`${String(p).padEnd(11)}${String(DILIM).padStart(18)}${String(tur).padStart(5)}${String(DILIM).padStart(12)}` +
    `${String(p * tur - DILIM).padStart(10)}${String(gecikmeli).padStart(20)}${`%${Math.round((gecikmeli / tur - 1) * 100)}`.padStart(8)}`);
}

// --- 3. ust uste binme: uc politika ---
s = TOHUM % 2147483647;
const SURE = Array.from({ length: GECE }, () => (rast() < 0.25 ? 30 + Math.floor(rast() * 25) : 3 + Math.floor(rast() * 5)));
console.log(`\n${GECE} gecenin kosum sureleri (saat): ${SURE.join(",")}`);

function politika(ad) {
  const bas = new Array(GECE).fill(null), bit = new Array(GECE).fill(null);
  let bitis = 0, baslayan = 0, atlanan = 0, gecikme = 0;
  for (let g = 0; g < GECE; g += 1) {
    const t = g * ARALIK;
    if (ad === "atla" && bitis > t) { atlanan += 1; continue; }
    const b = ad === "siraya al" ? Math.max(t, bitis) : t;
    bas[g] = b; bit[g] = b + SURE[g]; bitis = bit[g]; gecikme += b - t; baslayan += 1;
  }
  let enFazla = 0, enKuyruk = 0;
  for (let g = 0; g < GECE; g += 1) {
    const t = g * ARALIK;
    enFazla = Math.max(enFazla, bas.filter((b, i) => b !== null && b <= t && bit[i] > t).length);
    enKuyruk = Math.max(enKuyruk, bas.filter((b, i) => b !== null && b > t && i * ARALIK <= t).length);
  }
  const son = GECE * ARALIK;
  return { baslayan, atlanan, gecikme, enFazla, enKuyruk,
    kalan: bas.filter((b) => b !== null && b >= son).length,
    saat: bas.reduce((a, b, i) => a + (b === null ? 0 : bit[i] - b), 0) };
}
const P = {};
console.log(`${"politika".padEnd(13)}${"baslayan".padStart(10)}${"atlanan".padStart(9)}${"en fazla es zamanli".padStart(21)}` +
  `${"en fazla kuyruk".padStart(17)}${"ort. gecikme (saat)".padStart(21)}${"kapsul-saat".padStart(13)}`);
for (const ad of ["atla", "siraya al", "paralel kos"]) {
  const r = politika(ad); P[ad] = r;
  console.log(`${ad.padEnd(13)}${String(r.baslayan).padStart(10)}${String(r.atlanan).padStart(9)}${String(r.enFazla).padStart(21)}` +
    `${String(r.enKuyruk).padStart(17)}${(r.gecikme / r.baslayan).toFixed(2).padStart(21)}${String(r.saat).padStart(13)}`);
}
console.log(`islenmeyen gece: atla ${GECE - P["atla"].baslayan}, siraya al ${GECE - P["siraya al"].baslayan}, ` +
  `paralel kos ${GECE - P["paralel kos"].baslayan}; sondan sonraya sarkan kosum ${P["siraya al"].kalan}`);

// --- 4. kacirilan kosum: denetleyici gece 10-12 arasi kapali ---
const KACAN = 3;
console.log(`\n${"baslangic penceresi".padEnd(20)}${"telafi edilen".padStart(15)}${"dusurulen".padStart(11)}` +
  `${"atla ile kosan".padStart(16)}${"siraya al ile kosan".padStart(21)}${"paralel ile kosan".padStart(19)}`);
for (const pencere of [0, 1, 3]) {
  const telafi = Math.min(pencere, KACAN);
  console.log(`${String(pencere).padEnd(20)}${String(telafi).padStart(15)}${String(KACAN - telafi).padStart(11)}` +
    `${String(Math.min(telafi, 1)).padStart(16)}${String(telafi).padStart(21)}${String(telafi).padStart(19)}`);
}
console.log(`bilgi kalemi: gece basina 4 (planli an, kosum suresi, deneme sayaci, acik kosum sayisi) = ${GECE * 4} (tohum ${TOHUM})`);
```

```
deneme siniri  tamamlanan gece  basarisiz gece  toplam deneme  bosa giden deneme  kalan artik kapsul
1                           19              11             30                 11                  11
3                           27               3             49                 22                  22
6                           29               1             54                 25                  25

paralellik  tamamlanma sayisi  tur  kapsul-tur  bos yuva  bir dilim 2 deneme   artis
1                          12   12          12         0                  13      %8
3                          12    4          12         0                   5     %25
5                          12    3          12         3                   4     %33
6                          12    2          12         0                   3     %50
12                         12    1          12         0                   2    %100

30 gecenin kosum sureleri (saat): 5,4,7,5,6,5,5,4,7,31,3,3,5,3,50,4,51,6,5,3,5,7,47,5,3,37,6,5,3,5
politika       baslayan  atlanan  en fazla es zamanli  en fazla kuyruk  ort. gecikme (saat)  kapsul-saat
atla                 25        5                    1                0                 0.00          266
siraya al            30        0                    1                2                 4.23          335
paralel kos          30        0                    2                0                 0.00          335
islenmeyen gece: atla 5, siraya al 0, paralel kos 0; sondan sonraya sarkan kosum 0

baslangic penceresi   telafi edilen  dusurulen  atla ile kosan  siraya al ile kosan  paralel ile kosan
0                                 0          3               0                    0                  0
1                                 1          2               1                    1                  1
3                                 3          0               1                    3                  3
bilgi kalemi: gece basina 4 (planli an, kosum suresi, deneme sayaci, acik kosum sayisi) = 120 (tohum 20260813)
```

## Tamamlanma Güvencesi: Deneme Sınırı

Tek denemede iş nesnesi 30 gecenin **19'unu** tamamlıyor, 11 gece başarısız. Deneme sınırı üçe
çıkınca tamamlanan gece 27'ye, altıya çıkınca 29'a yükseliyor. Güvence satın alınabiliyor, ama
doğrusal değil: birinci artış 8 gece kazandırıyor, ikinci artış yalnız 2 gece.

Bedel öbür sütunlarda. Toplam deneme 30'dan 49'a, oradan 54'e çıkıyor; boşa giden deneme 11'den
22'ye, oradan 25'e. Yani sınırı 3'ten 6'ya çıkarmak 2 gece kazandırırken 5 boşa giden deneme
ekliyor — kazanılan her gece için iki buçuk boşa koşum. Bu koşumlar kaynak tüketiyor ve
zamanlanmış işin penceresini de yiyor.

Son sütun sessiz bir maliyettir. Başarısız denemenin kapsülü silinmez; günlüğü okunabilsin diye
tutulur. Sınır 6'da geriye **25 artık kapsül** kalıyor ve bunları kimse toplamıyor. İş nesnesinin
bir saklama süresi bildirmesi gerekiyor, yoksa otuz gecenin sonunda küme, çoktan anlamını yitirmiş
başarısız kapsüllerle dolu olur.

"Başarısız gece" ne demek olduğu da ayrıca söylenmelidir. Sınır 1'de 11 gecenin verisi hiç
doğrulanmadı; iş nesnesi bunu bir durum alanında bildirir, ama **bildirmek işlemek değildir**.
Devredilen karar yalnız "yeniden dene" kararıdır; "denemeler tükendi, veri eksik kaldı" kararının
sahibi hâlâ dışarıdadır.

## Paralellik ve Tamamlanma Sayısı

İkinci tablo iki ayarın birlikte ne verdiğini gösteriyor. Tamamlanma sayısı 12 sabit — on iki
dilimin hepsi işlenmeli. Paralellik 1'den 12'ye çıktıkça tur sayısı 12'den 1'e iniyor ve
**kapsül-tur toplamı hiç değişmiyor**: her durumda 12. Paralellik toplam işi azaltmıyor, yalnız onu
zamana yayıyor.

Değişen iki şey var. Birincisi boş yuva: paralellik 5 iken üç turun sonuncusunda 15 yuvanın 12'si
dolu, **3 yuva boş** kalıyor. Tamamlanma sayısını bölmeyen paralellik değerleri israf üretiyor.
İkincisi ve daha önemlisi son iki sütun: bir dilim ikinci denemeye kalırsa toplam süre bir tur
uzuyor ve bu bir turun **oranı** paralellikle birlikte büyüyor. Paralellik 1'de artış %8, 12'de
**%100**. Tam paralellikte iş, en yavaş dilimin süresine eşittir; tek bir yavaş dilim toplam süreyi
ikiye katlar.

Tamamlanma sayısı bildirilmediğinde nesne başka bir kipe geçer: kapsüller bir iş kuyruğunu tüketir
ve kuyruk boşalınca kendileri sonlanır. Tur sayısı aynı kalır, ama **bitiş kararı kapsülün
içindedir**. Küme yalnız kapsülün sonlanmasını görür; kaç dilimin işlendiğini bilmez. Devredilen
kararın burada geri alındığı nokta budur: tamamlanma sayısı bildirilirse güvenceyi küme verir,
bildirilmezse uygulama verir.

## Üst Üste Binme: Üç Politika

Üçüncü tablo gecelik işin gerçek sorusudur. Otuz gecenin koşum sürelerinde dört gece 31, 50, 51 ve
47 saat — yani 24 saatlik aralıktan uzun. Önceki koşum bitmeden yenisi geliyor.

**Atla** politikası çakışan koşumu başlatmıyor: 25 koşum başladı, **5 gece atlandı**. Eş zamanlılık
1'de kalıyor, kuyruk yok, gecikme yok ve kaynak tüketimi 266 kapsül-saatle en düşük. Bedel doğrudan
veri kapsamasıdır: beş gecenin okumaları hiç doğrulanmadı ve bu politika onları geri getirmiyor.

**Sıraya al** politikası hiçbir geceyi atlamıyor: 30 koşum, işlenmeyen gece 0. Karşılığında koşumlar
planlı anlarından ortalama **4,23 saat** geç başlıyor ve kuyrukta bir noktada iki koşum birden
bekliyor. Eş zamanlılık yine 1 — tek koşucu güvencesi korunuyor. Kritik nokta gecikmenin
**birikmemesidir**: uzun geceler dağınık olduğu için kuyruk boşalıyor ve otuzuncu gecenin sonrasına
sarkan koşum kalmıyor. Uzun koşumlar art arda gelseydi bu sütun kontrolsüz büyürdü.

**Paralel koş** politikası da 30 koşumun hepsini başlatıyor, gecikme sıfır, ama eş zamanlılık **2'ye
çıkıyor**. İki koşum aynı anda aynı sayaç kümelerini okuyup aynı faturalama girdisini yazıyor. Küme
açısından bir sorun yok — iki kapsül de sağlıklı; sorun uygulamanın veri katmanındadır ve küme onu
göremez. Kaynak tarafında da sıraya al ile aynı 335 kapsül-saat harcanıyor.

Üç politikanın ortak yanı şudur: hiçbiri koşum süresini **bilmiyor**. Politika koşum başlamadan önce
seçiliyor, süre koşumdan sonra öğreniliyor. Sistem bilmediği için biri veri kapsamasını, biri
zamanlamayı, biri de tekillik güvencesini feda ediyor.

Ölçüm ağı için doğru seçim tabloda okunur. Faturalama girdisi eksik geceye tahammül etmiyor, bu
yüzden atlanın 5 gecesi kabul edilemez. Aynı geceyi iki koşumun birden yazması da kabul edilemez,
çünkü faturalama girdisi eklemeli yazılıyor ve iki koşum aynı okumaları iki kez ekler. Geriye sıraya
al kalıyor ve onun bedeli tabloda görünüyor: ortalama 4,23 saatlik gecikme, tepe noktada iki koşumluk
kuyruk. Bu bedel yalnız kuyruk boşaldığı sürece ödenebilir; uzun geceler art arda gelirse gecikme
birikir ve gecelik iş bir noktada gündüze taşar. Yani politika seçimi bir kez yapılıp bırakılan bir
ayar değil, koşum süresi dağılımı değiştikçe yeniden bakılması gereken bir karardır.

## Kaçırılan Koşum

Son tablo denetleyicinin üç gece kapalı kaldığı durumu ölçüyor. Başlangıç penceresi 0 gece iken
kaçan üç koşumun **hiçbiri** telafi edilmiyor; pencere 1 gece iken biri koşuyor, ikisi düşürülüyor;
pencere 3 gece iken üçü de sıraya giriyor.

Telafi edilmek koşmak demek değil. Pencere 3'te üç koşum aynı anda uygun hâle geliyor ve o an
çakışma politikası devreye giriyor: **atla** politikasıyla yalnız biri koşuyor, ikisi yine
düşüyor; sıraya al ile üçü ardışık koşuyor; paralel koş ile üçü aynı anda başlıyor. Yani iki ayar
birbirini iptal edebiliyor — geniş pencere ile sıkı çakışma politikası bir arada seçilirse telafi
kâğıt üzerinde açık, sonuçta kapalıdır.

Bu dersin devir bilançosu şudur: karar gece başına dört kaleme dayanıyor — planlı an, koşum süresi,
deneme sayacı, açık koşum sayısı; otuz gece için **120 kalem**. Bunlardan üçü ölçümle gelir, biri
(koşum süresi) ancak koşum bittikten sonra bilinir. Sistemin bilmediği tek kalem bu ve üç politika
arasındaki bütün fark oradan çıkıyor.

## Özet

- İş nesnesinin hedefi çalışan kapsül sayısı değil tamamlanmış koşum sayısıdır; sonlanma sapma
  değil hedefin kendisidir.
- Deneme sınırı 1 → 3 → 6 arttıkça tamamlanan gece 19 → 27 → 29, boşa giden deneme 11 → 22 → 25.
  Son artış 2 gece kazandırıp 5 boşa koşum ekliyor; geriye 25 artık kapsül kalıyor.
- Paralellik toplam işi değiştirmiyor (her durumda 12 kapsül-tur), turu 12'den 1'e indiriyor;
  paralellik 5'te 3 boş yuva doğuyor ve tek bir yavaş dilimin maliyeti %8'den %100'e çıkıyor.
- Tamamlanma sayısı bildirilmezse güvence kümeden uygulamaya geçiyor: küme yalnız sonlanmayı görür,
  kaç dilimin işlendiğini bilmez.
- Üç çakışma politikası üç ayrı şeyi feda ediyor: atla 5 geceyi işlemiyor (266 kapsül-saat), sıraya
  al ortalama 4,23 saat geciktiriyor, paralel koş eş zamanlılığı 2'ye çıkarıp aynı veriye iki yazar
  salıyor (335 kapsül-saat).
- Başlangıç penceresi 0 → 1 → 3 gece ile telafi 0 → 1 → 3; ama telafi edilen koşumların kaçının
  gerçekten koştuğunu çakışma politikası belirliyor (atla ile 1).

## Sonraki Adım

Gecelik iş küme nesnesi hâline geldi: bitişi tanımlı, denemesi sınırlı, takvimi bildirilmiş.
Ölçülen bütün sayılar tek bir uygulamanın kendi hesabındaydı — 335 kapsül-saat, eş zamanlı iki
koşum, on iki paralel dilim. Oysa küme yalnız ölçüm ağının değil. Aynı düğümlerde iki uygulama daha
koşuyor ve gecelik iş on iki dilimi birden açtığında onların isteklerine ne oluyor sorusu hiç
sorulmadı. Kapsül, kopya kümesi, sürüm nesnesi, servis nesnesi, birim, iş nesnesi — hepsi tek bir
adlandırma uzayında duruyor ve hepsi aynı kaynak havuzundan yiyor. Sonraki ders üç kiracıyı tek bir
kümede toplayıp şunları sayıyor: kota olmadan bir kiracı ötekini kaç istek boyunca aç bırakıyor,
kota konunca kaç istek reddediliyor, kotaların toplamı kümenin kaç birimini boşta bırakıyor ve
varsayılan istek değerleri bu üç sayıyı nasıl kaydırıyor.
