İçeriğe geç
academia.sh

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ğuson 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 25 kuralı 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: hepsi kuralı 400 çıktı saklar, 365’i hiç kullanılmaz ve son 100 kosum ile aynı 40 isteği karşılar.
  • Kimlik şeması saklamanın üst sınırını belirler: son 10 kosum kuralı çö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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat