İçeriğe geç
academia.sh

Ders 13 / 30

İş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.

İçindekiler

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

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat