Ders 04 / 21
Yapı Çıktısı Yönetimi
Hattın ürettiği çıktının sürüm kimliği ve saklama kuralı: altı kimlik şemasının benzersizliği ve kaynağa geri dönebilme oranı ölçülür, yedi saklama kuralı taranarak geri alınabilir sürüm penceresi, kesintisiz derinlik ve boşuna saklanan çıktı birlikte sayılır.
İçindekiler
Önceki ders sekiz kapıyı ölçtü ve 713 koşumun ürettiği şeyi hiç saymadı: paketleme kapısının çıkardığı yapı çıktısı. Yeşil biten her koşumun sonunda ortada bir paket vardır ve üretime giden şey odur. Bu paketin iki sorusu vardır ve ikisi de bir kapı sorusudur.
Birincisi kimlik: paket neye göre adlandırılıyor, o addan geriye paketi üreten kaynağa dönülebiliyor mu? İkincisi saklama: paket ne kadar süre duruyor, üretimde bir arıza çıktığında dönülecek sürüm hâlâ orada mı? İkisi bağlıdır: silinen bir çıktı ancak kimliğinden kaynağa dönülebiliyorsa yeniden üretilebilir. Yapı çıktısı deposunun bayt cinsinden büyümesi Temel Kavramlar konusunda, taşınabilir etiketin çözümü İmajlar konusunda ölçüldü; burada o ölçümler tekrarlanmaz, depo boyu saklanan çıktı sayısı olarak sayılır.
Çıktı Geçmişi
Model, bölgesel ölçüm ağının hattının yirmi iş gününde ürettiği çıktı geçmişidir. Ağ da geçmiş de kurgudur. Süreler model dakikasıdır.
HT19 — yirmi iş gününde 400 yapı çıktısı üretilir, 24 dakikada bir. Koşumların yüzde 70’i ana daldan, kalanı özellik dallarındandır; özellik dallarının yüzde 85’i iş bitince silinir. Koşumların yüzde 6’sı aynı işlemenin yeniden koşturulmasıdır. Her on beşinci koşum bir sürüm etiketi taşır.
HT20 — altı kimlik şeması karşılaştırılır. Şemanın taşıdığı bilgi tek bir alanla yazılır: kimlik metni işleme özetini içeriyor mu.
HT21 — bir kimlikten kaynağa dönebilmek için üç koşul birlikte gerekir: kimlik benzersiz olmalı, işlemeyi taşımalı ya da hat kaydı hâlâ bulunmalı (0,92 olasılık), ve işleme depoda erişilebilir olmalı. Silinmiş dalın işlemesi erişilemez.
HT22 — yirmi iş gününde 40 geri alma olayı olur. Hedefin kaç üretim çıktısı geride olduğu şu ağırlıklarla çekilir: 1 adım geri 50, 2 adım 18, 3 adım 10, 5 adım 7, 10 adım 6, 25 adım 5, 60 adım 4.
HT23 — saklanan bir çıktıdan geri alma 6 model dakikasıdır; çıktı silinmişse kaynaktan yeniden üretim 55 dakikadır ve yalnız kimlik kaynağa çözülüyorsa mümkündür. Çözülmüyorsa istek karşılanamaz.
HT24 — depo boyu saklanan çıktı sayısıyla ölçülür, bayt cinsinden değil.
// gecmis.mjs — hattin yirmi is gununde urettigi yapi ciktilarinin kurgu gecmisi const uretec = (tohum) => () => { tohum = (tohum * 1664525 + 1013904223) >>> 0; return tohum / 4294967296; }; export const CIKTI = 400, ARA = 24; // HT19: 24 dakikada bir cikti, 9600 dakikalik pencere export const KAYIT = 0.92; // HT21: hat kaydinin hala bulunma olasiligi const onalti = (r, n) => Array.from({ length: n }, () => '0123456789abcdef'[Math.floor(r() * 16)]).join(''); export const gecmisUret = (tohum) => { const r = uretec(tohum); const dallar = new Map(); const liste = []; let isleme = onalti(r, 12), surum = [1, 4, 0]; for (let i = 0; i < CIKTI; i++) { const yeniden = r() < 0.06; // HT19: ayni islemenin yeniden kosturulmasi if (!yeniden) isleme = onalti(r, 12); const anaDal = r() < 0.70; const dal = anaDal ? 'ana' : `ozellik-${Math.floor(r() * 40)}`; if (!dallar.has(dal)) dallar.set(dal, { silindi: anaDal ? false : r() < 0.85 }); if (i % 15 === 0 && i > 0) surum = [surum[0], surum[1], surum[2] + 1]; liste.push({ no: i + 1, isleme, dal, anaDal, t: i * ARA, surum: surum.join('.'), etiketli: i % 15 === 0, erisilebilir: !dallar.get(dal).silindi, // silinmis dalin islemesi depoda kalmaz kayit: r() < KAYIT }); } return liste; }; // HT20: kimlik semalari. isleme = kimlik islemeyi tasiyor mu, uret = kimlik metni. export const semalar = [ { ad: 'tasinabilir etiket', isleme: false, uret: () => 'son' }, { ad: 'kosum numarasi', isleme: false, uret: (c) => `${c.no}` }, { ad: 'anlamsal surum', isleme: false, uret: (c) => c.surum }, { ad: 'dal + kosum numarasi', isleme: false, uret: (c) => `${c.dal}-${c.no}` }, { ad: 'anlamsal surum + isleme', isleme: true, uret: (c) => `${c.surum}+${c.isleme.slice(0, 7)}` }, { ad: 'isleme + kosum numarasi', isleme: true, uret: (c) => `${c.isleme.slice(0, 7)}-${c.no}` }, ]; // HT21: kaynaga donus icin kimlik benzersiz olmali, islemeyi tasimali ya da hat kaydi // bulunmali, ve isleme depoda erisilebilir olmali. export const coz = (sema, gecmis) => { const sayac = new Map(); for (const c of gecmis) sayac.set(sema.uret(c), (sayac.get(sema.uret(c)) ?? 0) + 1); let benzersiz = 0, kaynak = 0, kaynakAna = 0, ana = 0; const cozulur = new Set(); for (const c of gecmis) { const tek = sayac.get(sema.uret(c)) === 1; if (tek) benzersiz++; const donus = tek && (sema.isleme || c.kayit) && c.erisilebilir; if (donus) { kaynak++; cozulur.add(c.no); } if (c.anaDal) { ana++; if (donus) kaynakAna++; } } return { benzersiz, kaynak, kaynakAna, ana, cozulur, cakisan: gecmis.length - benzersiz, uzunluk: sema.uret(gecmis[gecmis.length - 1]).length }; };
// kimlik.mjs — sema basina benzersizlik ve kimlikten kaynaga geri donebilme orani import { gecmisUret, semalar, coz, CIKTI } from './gecmis.mjs'; const gecmis = gecmisUret(30719); const s = (x, w) => String(x).padStart(w); const y = (a, b) => `${(100 * a / b).toFixed(1)}`; const silinen = gecmis.filter((c) => !c.erisilebilir).length; console.log(`cikti ${CIKTI}, ana dal ${gecmis.filter((c) => c.anaDal).length}, ` + `silinmis dalda kalan ${silinen}, yeniden kosum ${CIKTI - new Set(gecmis.map((c) => c.isleme)).size}`); console.log(`\n${'sema'.padEnd(26)}${s('uzunluk', 9)}${s('cakisan', 9)}${s('kaynaga donus', 15)}${s('ana dalda', 11)}`); for (const sema of semalar) { const c = coz(sema, gecmis); console.log(`${sema.ad.padEnd(26)}${s(c.uzunluk, 9)}${s(c.cakisan, 9)}` + `${s(`${c.kaynak} (${y(c.kaynak, CIKTI)}%)`, 15)}${s(`${y(c.kaynakAna, c.ana)}%`, 11)}`); }
cikti 400, ana dal 274, silinmis dalda kalan 103, yeniden kosum 28 sema uzunluk cakisan kaynaga donus ana dalda tasinabilir etiket 3 400 0 (0.0%) 0.0% kosum numarasi 3 0 269 (67.3%) 90.9% anlamsal surum 6 400 0 (0.0%) 0.0% dal + kosum numarasi 7 0 269 (67.3%) 90.9% anlamsal surum + isleme 14 50 261 (65.3%) 87.6% isleme + kosum numarasi 11 0 297 (74.3%) 100.0%
Kimlik Neyi Taşıyor
İlk iki satır kimliğin benzersizlik koşulunu ayırır. Taşınabilir etiket her koşumda yeniden yazılır: 400 çıktının 400’ü aynı kimliği paylaşır ve hiçbirinden kaynağa dönülemez. Anlamsal sürüm de aynı durumdadır: her on beşinci koşumda artan bir sayı, aradaki on dört çıktıyı ayırt edemez.
Koşum numarası benzersizdir ve kaynağa dönüş yüzde 67,3’e çıkar. Kalan boşluğun iki kaynağı vardır: kimlik işlemeyi taşımadığı için bakılan hat kaydı yüzde 92 olasılıkla durur, ve silinmiş dallardaki 103 çıktının işlemesi depoda erişilemez. İkinci kısıt ana dal satırında elenir — koşum numarası için ana dalda dönüş yüzde 90,9’dur, yani yüzde 100’e kalan 9,1 puan tamamen kaybolan hat kaydından gelir.
İşleme özetini taşıyan son şema bu boşluğu kapatır: ana dalda yüzde 100. Kimlik kaynağı kendi içinde taşıdığında dışarıdaki bir kayda ihtiyaç kalmaz. Genel oranın yine de yüzde 74,3’te kalması silinmiş özellik dallarındandır ve bu bir kimlik sorunu değildir. Beşinci şema bir ara durumdur: anlamsal sürüm ile işleme özeti birleştirildiğinde 50 çıktı çakışır, çünkü aynı işlemenin yeniden koşturulması aynı kimliği üretir. Kimlik kaynağı gösterir ama hangi koşumun ürettiğini göstermez; koşum numarasının eklenmesi tam da bunu çözer.
Saklama Kuralı Bir Kapıdır
Saklama kuralı hangi çıktının geri alınabilir kaldığına karar verir, yani bir kapıdır ve aynı üç sayıyla ölçülür. Aşağıdaki tarama yedi kuralı iki kimlik şeması altında koşturur.
// saklama.mjs — saklama kurali tarandiginda geri alinabilir surum penceresi ve depo boyu import { gecmisUret, semalar, coz, CIKTI, ARA } from './gecmis.mjs'; const GUN_DK = 480, DOGRUDAN_DK = 6, YENIDEN_DK = 55; // HT23: geri alma ve yeniden uretim const uretec = (tohum) => () => { tohum = (tohum * 1664525 + 1013904223) >>> 0; return tohum / 4294967296; }; // HT22: yirmi is gununde 40 geri alma olayi; hedefin kac uretim ciktisi geride oldugu. const DERINLIK = [[1, 50], [2, 18], [3, 10], [5, 7], [10, 6], [25, 5], [60, 4]]; const olaylar = (tohum, uretimler) => { const r = uretec(tohum), top = DERINLIK.reduce((a, d) => a + d[1], 0); return Array.from({ length: 40 }, () => { const T = 1200 + r() * (CIKTI * ARA - 1200); let x = r() * top, k = 1; for (const [d, w] of DERINLIK) { x -= w; if (x <= 0) { k = d; break; } } const gecmisi = uretimler.filter((c) => c.t < T); return { T, k, hedef: gecmisi[gecmisi.length - k] ?? null }; }); }; const kurallar = [ { ad: 'son 10 kosum', tut: (c, n) => c.no > n - 10 }, { ad: 'son 25 kosum', tut: (c, n) => c.no > n - 25 }, { ad: 'son 50 kosum', tut: (c, n) => c.no > n - 50 }, { ad: 'son 100 kosum', tut: (c, n) => c.no > n - 100 }, { ad: 'son 7 gun', tut: (c, n, T) => T - c.t <= 7 * GUN_DK }, { ad: 'etiketli + son 25', tut: (c, n) => c.etiketli || c.no > n - 25 }, { ad: 'hepsi', tut: () => true }, ]; const gecmis = gecmisUret(30719); const uretimler = gecmis.filter((c) => c.anaDal); const olay = olaylar(60417, uretimler); const son = CIKTI * ARA; const olc = (kural, cozulur) => { let dogrudan = 0, yeniden = 0, olmaz = 0, dk = 0; for (const o of olay) { if (o.hedef === null) { olmaz++; continue; } const n = gecmis.filter((c) => c.t < o.T).length; if (kural.tut(o.hedef, n, o.T)) { dogrudan++; dk += DOGRUDAN_DK; } else if (cozulur.has(o.hedef.no)) { yeniden++; dk += YENIDEN_DK; } else olmaz++; } const saklanan = gecmis.filter((c) => kural.tut(c, CIKTI, son)).length; const kalanUretim = uretimler.filter((c) => kural.tut(c, CIKTI, son)); // kesintisiz derinlik: en son uretim ciktisindan geriye dogru bosluksuz saklanan sayisi let kesintisiz = 0; for (let i = uretimler.length - 1; i >= 0 && kural.tut(uretimler[i], CIKTI, son); i--) kesintisiz++; // bosuna saklanan: hicbir geri alma olayinin hedefi olmayan cikti const hedefler = new Set(olay.filter((o) => o.hedef).map((o) => o.hedef.no)); const bosuna = gecmis.filter((c) => kural.tut(c, CIKTI, son) && !hedefler.has(c.no)).length; return { dogrudan, yeniden, olmaz, dk, saklanan, kesintisiz, bosuna, pencere: kalanUretim.length ? (son - kalanUretim[0].t) / GUN_DK : 0 }; }; const s = (x, w) => String(x).padStart(w); console.log(`uretim ciktisi ${uretimler.length}, geri alma olayi ${olay.length}, ` + `en derin hedef ${Math.max(...olay.map((o) => o.k))} surum geride`); console.log(`\n${'saklama kurali'.padEnd(20)}${s('saklanan', 10)}${s('pencere gun', 13)}${s('kesintisiz derinlik', 21)}${s('bosuna saklanan', 17)}`); for (const k of kurallar) { const m = olc(k, new Set()); console.log(`${k.ad.padEnd(20)}${s(m.saklanan, 10)}${s(m.pencere.toFixed(2), 13)}${s(m.kesintisiz, 21)}${s(m.bosuna, 17)}`); } for (const ad of ['tasinabilir etiket', 'isleme + kosum numarasi']) { const sema = semalar.find((x) => x.ad === ad); const { cozulur } = coz(sema, gecmis); console.log(`\nkimlik semasi: ${ad} (kaynaga donen ${cozulur.size} cikti)`); console.log(`${'saklama kurali'.padEnd(20)}${s('dogrudan', 10)}${s('yeniden uretim', 16)}${s('karsilanamaz', 14)}${s('kurtarma dk', 13)}`); for (const k of kurallar) { const m = olc(k, cozulur); console.log(`${k.ad.padEnd(20)}${s(m.dogrudan, 10)}${s(m.yeniden, 16)}${s(m.olmaz, 14)}${s(m.dk, 13)}`); } }
uretim ciktisi 274, geri alma olayi 40, en derin hedef 60 surum geride saklama kurali saklanan pencere gun kesintisiz derinlik bosuna saklanan son 10 kosum 10 0.50 8 10 son 25 kosum 25 1.25 17 23 son 50 kosum 50 2.50 31 47 son 100 kosum 100 5.00 67 89 son 7 gun 140 7.00 98 125 etiketli + son 25 50 20.00 17 44 hepsi 400 20.00 274 365 kimlik semasi: tasinabilir etiket (kaynaga donen 0 cikti) saklama kurali dogrudan yeniden uretim karsilanamaz kurtarma dk son 10 kosum 35 0 5 210 son 25 kosum 37 0 3 222 son 50 kosum 38 0 2 228 son 100 kosum 40 0 0 240 son 7 gun 40 0 0 240 etiketli + son 25 37 0 3 222 hepsi 40 0 0 240 kimlik semasi: isleme + kosum numarasi (kaynaga donen 297 cikti) saklama kurali dogrudan yeniden uretim karsilanamaz kurtarma dk son 10 kosum 35 5 0 485 son 25 kosum 37 3 0 387 son 50 kosum 38 2 0 338 son 100 kosum 40 0 0 240 son 7 gun 40 0 0 240 etiketli + son 25 37 3 0 387 hepsi 40 0 0 240
İlan Edilen Pencere ile Kesintisiz Derinlik
İkinci tablonun en öğretici satırı etiketli + son 25‘tir. Bu kural 50 çıktı saklar ve
20 günlük bir pencere ilan eder: en eski saklanan üretim çıktısı pencerenin başındadır.
Aynı 50 çıktıyı saklayan son 50 kosum kuralının penceresi yalnız 2,5 gündür. Sekiz kat
geniş pencere daha iyi görünür. Geri alma olayları tersini söyler: etiketli kural 37 isteği
doğrudan karşılar, son 50 kosum ise 38’ini.
Farkı kesintisiz derinlik sütunu açıklar. Etiketli kuralın penceresi deliklidir; geriye
doğru boşluksuz saklanan üretim çıktısı yalnız 17 tanedir, son 50 kosum kuralında 31.
Geri alma isteği “yirmi gün öncesine dön” demez, “üç sürüm geriye dön” der; aradaki sürüm
silinmişse pencerenin uzunluğu işe yaramaz. Saklama kuralı pencereyle değil, kesintisiz
derinlikle savunulur.
bosuna saklanan sütunu kapının yanlış tutmasıdır. hepsi kuralı 400 çıktı saklar, 365’i
hiçbir geri alma olayının hedefi olmaz ve son 100 kosum kuralına göre tek bir istek fazla
karşılamaz: dört kat depo, sıfır marjinal kazanç. son 100 kosum ile son 50 kosum
arasındaki fark ise 2 istektir.
Kimlik ile Saklamanın Kesiştiği Yer
Son iki tablo iki kapıyı birleştirir. Taşınabilir etiket şemasında son 10 kosum kuralı beş
isteği karşılayamaz: çıktı silinmiştir ve kimlikten kaynağa dönülemediği için yeniden de
üretilemez. Aynı saklama kuralı, işleme özeti taşıyan kimlikle koşturulduğunda karşılanamayan
istek sıfıra iner; beş istek 55’er dakikalık yeniden üretimle karşılanır ve kurtarma süresi
210 dakikadan 485 dakikaya çıkar.
Takas açıktır. Sıkı saklama kuralı depoyu 400’den 10’a indirir ve 245 dakika ek kurtarma süresi ödetir — ama yalnız kimlik şeması buna izin veriyorsa. Kimlik çözülmüyorsa aynı sıkılık beş isteği tamamen kaybettirir. Kimlik şeması, saklama kuralının ne kadar sıkılabileceğinin üst sınırını belirler.
Saklama kapısının dört sayısı böylece yazılabilir. son 50 kosum kuralı için: tuttuğu
38 geri alma isteği, yalnız kendisinin tuttuğu — son 25 yerine seçildiğinde — 1 istek,
kaçırdığı 2 istek, yanlış tuttuğu 47 çıktı, eklediği 50 çıktılık depo ve 338
dakikalık kurtarma süresi.
Özet
- Taşınabilir etiket ve anlamsal sürüm şemalarında 400 çıktının tamamı çakışır ve kaynağa dönüş oranı sıfırdır; koşum numarası benzersizdir ve yüzde 67,3, işleme özeti taşıyan şema yüzde 74,3 verir.
- Ana dal satırı kısıtı ayırır: koşum numarası yüzde 90,9’da kalır (kayıp hat kaydı), işleme taşıyan kimlik yüzde 100’e çıkar. Genel orandaki boşluk silinmiş özellik dallarındandır ve hiçbir kimlik şeması onu kapatmaz.
- İlan edilen pencere yanıltıcıdır:
etiketli + son 25kuralı 20 günlük pencere gösterir ama kesintisiz derinliği 17’dir ve aynı depoyla 2,5 günlük pencere veren kuraldan bir istek az karşılar. - Depoyu dört katına çıkarmanın marjinali sıfır olabilir:
hepsikuralı 400 çıktı saklar, 365’i hiç kullanılmaz veson 100 kosumile aynı 40 isteği karşılar. - Kimlik şeması saklamanın üst sınırını belirler:
son 10 kosumkuralı çözülebilir kimlikle sıfır karşılanamayan istek ve 485 dakika, çözülemeyen kimlikle beş karşılanamayan istek üretir.
Sonraki Adım
Buraya kadarki dört ders hattın neyi tuttuğunu saydı ve süreyi hep bir bedel kalemi olarak yazdı: kapının eklediği dakika, beklemenin ödettiği dakika, yeniden üretimin aldığı dakika. Sürenin kendisi ise hiç hedef alınmadı. Oysa ilk dersin tablosu bir şey söylemişti — koşum ucuzladıkça en iyi birleştirme aralığı daha sık olana kayıyor, yani hattın süresini kısaltmak yalnız bekleyeni rahatlatmakla kalmıyor, kapıların ekonomisini de değiştiriyor. Sonraki ders bu süreye doğrudan bakar: aşamalar arasında yeniden kullanılabilen iş nedir, paralel koşturmanın sınırı nerededir ve hangi noktadan sonra kaynak eklemek hattı kısaltmamaya başlar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.