İçeriğe geç
academia.sh

Ders 28 / 30

Denetleyici Kalıbı

Bir önceki dersin kaynak türü için gerçekten koşan bir denetleyici yazılır: istenen durumu okur, gerçek durumu okur, farkı kapatır ve ikinci turda sıfır iş yapar. Elle işletimde bir olayın kaç adım ve kaç dakika sürdüğü ile denetleyicide kaç tur sürdüğü karşılaştırılır; kodlanmış işletim bilgisi madde madde sayılır ve kodlanmamış tek maddenin ürettiği salınım seksen tur boyunca ölçülür.

İçindekiler

Bir önceki ders okuma hattı türünü tanımladı ve şemanın bir bildirimin geçerli olduğunu söylediğini, doğru olduğunu söylemediğini ölçtü. Kabul edilmiş bildirim kümede tek başına hiçbir şey yapmıyor: gerçek durumu ona benzetecek bir şey gerekiyor ve bugün o şey nöbetçi bir insan.

Denetleyici kalıbı, bu nöbetin kendisini koda taşımaktır. Uzlaşma döngüsünün mekaniği — istenen durum, gerçek durum, fark, düzeltme ve etkisizlik — M22/K01’in Altyapı Sağlama Modelleri dersinde ölçüldü; burada tekrarlanmaz. Bu dersin konusu döngünün kendisi değil, döngünün içine ne yazıldığıdır: nöbetçinin kafasındaki işletim bilgisinin kaç maddesi koda geçti, kaçı geçmedi, ve geçmeyenin bedeli ne.

Devredilen karar açıktır: bir olaya ne yapılacağına insan değil denetleyici karar verir. Ölçüm yine bölgesel ölçüm ağı üzerindedir ve kurgudur; gerçek küme koşturulmaz, ölçülen şey node ile kurulmuş bir modeldir.

OI43. Denetleyici bir önceki dersin okuma hattı türü için yazılır; istenen durum o bildirimden gelir — dört işçi ve 960 saniyelik gecikme sınırı. OI44. Bir tur bir dakika model zamanıdır; turda 80 okuma gelir, çalışan işçi başına 40 okuma işlenir. OI45. Seksen tur koşulur ve hedef servis 10.–59. turlar arasında bakımdadır; pencere önceden yazılıdır, rastgelelik yoktur. OI46. Denetleyicinin kodlanmış bilgisi beş maddedir ve madde madde listelenir. OI47. Elle işletim tarifi dokuz adımdır; adım süreleri önceden yazılıdır ve bir modeldir. OI48. Yeniden başlatma bir turda biter ve kırk okumayı kuyruğa geri koyar.

Denetleyicinin Bildiği Şey

// dunya.mjs — okuma hattinin kurgu dunyasi ve denetleyicinin kodlanmis bilgisi.
export const ISTENEN = { isci: 4, durum: "calisiyor", sinir: 960 };   // 07'deki bildirimden

export const yeniDunya = () => ({ durum: "durdu", isci: 0, kuyruk: 400, gecikme: 300,
  hedef: "acik", inat: 0, bekleme: 3 });

export function ilerle(d) {                          // bir tur = bir dakika model zamani
  const kapasite = d.durum === "calisiyor" && d.hedef === "acik" ? d.isci * 40 : 0;
  const onceki = d.gecikme;
  d.kuyruk = Math.max(0, d.kuyruk + 80 - kapasite);   // turda 80 okuma gelir
  d.gecikme = Math.round((d.kuyruk / 80) * 60);
  d.inat = d.gecikme >= onceki ? d.inat + 1 : 0;
}

export const KURAL = [                               // denetleyiciye kodlanmis isletim bilgisi
  { ad: "durmus hat baslatilir",
    f: (d, i) => d.durum === "durdu" && ((d.durum = "calisiyor"), true) },
  { ad: "isci sayisi bildirilene tamamlanir",
    f: (d, i) => d.isci < i.isci && ((d.isci = i.isci), true) },
  { ad: "gecikme sinir ustundeyse isci artirilir",
    f: (d, i) => d.gecikme > i.sinir && d.isci < 8 && (d.isci++, true) },
  { ad: "gecikme sinir altindaysa fazla isci geri alinir",
    f: (d, i) => d.gecikme <= i.sinir && d.isci > i.isci && (d.isci--, true) },
  { ad: "inat eden gecikmede hat yeniden baslatilir",
    f: (d, i) => d.gecikme > i.sinir && d.inat >= d.bekleme &&
      ((d.inat = 0), (d.isci = i.isci), (d.kuyruk += 40), true) },
];
export const KODLANMAMIS = { ad: "hedef bakimdayken dokunulmaz", f: (d) => d.hedef === "bakim" };

export function denetle(d, i, kural, geriCekilme = false) {
  if (kural.bekle && kural.bekle(d)) { d.inat = 0; return []; }   // altinci madde eklendiginde
  const islem = [];
  for (const k of kural.liste) if (k.f(d, i)) islem.push(k.ad);
  if (geriCekilme && islem.includes("inat eden gecikmede hat yeniden baslatilir"))
    d.bekleme = Math.min(d.bekleme * 2, 48);          // artan yeniden deneme araligi
  return islem;
}

Beş kural, nöbetçinin kafasındaki beş cümledir. İlk ikisi bildirimden okunabilir: hat çalışmalı, işçi sayısı dört olmalı. Son üçü bildirimden okunamaz — bunlar bildirimin değil, hattı işleten kişinin bilgisidir: gecikme sınırı aşılınca ne yapılır, gecikme normale dönünce ne yapılır, ve gecikme inat ederse ne yapılır. Denetleyici kalıbının anlattığı devir tam olarak bu üç cümledir.

Dünya modelinin de tutmayı seçtiği kalemler sayılıdır. Denetleyicinin okuyabildiği dört kalem vardır — durum, işçi sayısı, kuyruk boyu ve ondan türeyen gecikme. Beşinci bir kalem daha modelde durur ve hattın davranışını doğrudan belirler: hedef servisin açık mı bakımda mı olduğu. O kalem dünyada vardır ama hiçbir kuralda geçmez; denetleyici onu okumaz. Bu ders boyunca ölçülen her sapmanın kaynağı bu tek satırdır.

Etkisizlik ve Elle İşletimle Karşılaştırma

// olc.mjs — etkisizlik, elle isletimle karsilastirma, kodlanmamis bilginin bedeli, geri cekilme.
import { ISTENEN, yeniDunya, ilerle, KURAL, KODLANMAMIS, denetle } from "./dunya.mjs";

const TUR = 80, BAKIM = [10, 59];
const kosum = (kural, geriCekilme = false) => {
  const d = yeniDunya();
  const s = { islem: 0, yenidenBaslatma: 0, isciDegisimi: 0, enYuksekKuyruk: 0, asimTuru: 0,
    ilkTur: 0, ikinciTur: 0, olcum: 0, iz: [] };
  for (let t = 0; t < TUR; t++) {
    d.hedef = t >= BAKIM[0] && t <= BAKIM[1] ? "bakim" : "acik";
    const i = denetle(d, ISTENEN, kural, geriCekilme);
    s.olcum += 3;                                    // her turda uc kalem okunur
    s.islem += i.length;
    if (t === 0) s.ilkTur = i.length;
    if (t === 1) s.ikinciTur = i.length;
    s.yenidenBaslatma += i.filter((x) => x.startsWith("inat")).length;
    s.isciDegisimi += i.filter((x) => x.includes("isci")).length;
    ilerle(d);
    if (t >= 30 && t < 50) s.iz.push(d.isci);
    s.enYuksekKuyruk = Math.max(s.enYuksekKuyruk, d.kuyruk);
    if (d.gecikme > ISTENEN.sinir) s.asimTuru++;
  }
  return s;
};

const eksik = { liste: KURAL }, tam = { liste: KURAL, bekle: KODLANMAMIS.f };
const a = kosum(eksik), b = kosum(tam), c = kosum(eksik, true);
console.log(`kodlanmis bilgi ${KURAL.length} madde; kodlanmamis 1 madde: ${KODLANMAMIS.ad}`);
console.log(`etkisizlik: 1. turda ${a.ilkTur} islem, 2. turda ${a.ikinciTur} islem`);
console.log(`\n${TUR} tur, hedef ${BAKIM[0]}-${BAKIM[1]} arasi bakimda`);
console.log("kosum                       islem  yeniden baslatma  isci degisimi  en yuksek kuyruk  asim turu  okuma");
const yaz = (ad, s) => console.log(`${ad.padEnd(26)} ${String(s.islem).padStart(4)}` +
  `${String(s.yenidenBaslatma).padStart(17)}${String(s.isciDegisimi).padStart(15)}` +
  `${String(s.enYuksekKuyruk).padStart(18)}${String(s.asimTuru).padStart(11)}${String(s.olcum).padStart(7)}`);
yaz("5 madde (eksik bilgi)", a); yaz("5 madde + geri cekilme", c); yaz("6 madde (bakim bilinir)", b);
console.log(`\nbakim ortasinda isci sayisi izi (tur 30-49)`);
console.log(`  5 madde : ${a.iz.join(" ")}`);
console.log(`  6 madde : ${b.iz.join(" ")}`);

const ELLE = [["uyari kutugu acilir", 2], ["hattin durumu okunur", 3], ["kuyruk boyu okunur", 3],
  ["isci sayisi okunur", 2], ["hedef servisin durumu sorulur", 8], ["bakim penceresi dogrulanir", 6],
  ["karar verilir", 4], ["islem uygulanir", 3], ["kayit dusulur", 3]];
const dk = ELLE.reduce((t, [, m]) => t + m, 0);
console.log(`\nelle isletimde bir olay: ${ELLE.length} adim, ${dk} dakika` +
  `   denetleyicide: 1 tur tespit + 1 tur islem = 2 tur, tur basi 15 sn -> 0,5 dakika`);
console.log(`ayni olay ikinci kez: elle yine ${ELLE.length} adim/${dk} dk, denetleyicide yine 2 tur`);
kodlanmis bilgi 5 madde; kodlanmamis 1 madde: hedef bakimdayken dokunulmaz
etkisizlik: 1. turda 2 islem, 2. turda 0 islem

80 tur, hedef 10-59 arasi bakimda
kosum                       islem  yeniden baslatma  isci degisimi  en yuksek kuyruk  asim turu  okuma
5 madde (eksik bilgi)        56               12             43              4440         48    240
5 madde + geri cekilme       22                3             18              4120         45    240
6 madde (bakim bilinir)      10                0              9              4000         46    240

bakim ortasinda isci sayisi izi (tur 30-49)
  5 madde : 4 5 6 4 5 6 4 5 6 4 5 6 4 5 6 4 5 6 4 5
  6 madde : 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4

elle isletimde bir olay: 9 adim, 34 dakika   denetleyicide: 1 tur tespit + 1 tur islem = 2 tur, tur basi 15 sn -> 0,5 dakika
ayni olay ikinci kez: elle yine 9 adim/34 dk, denetleyicide yine 2 tur

Etkisizlik iki satırda görünür: ilk tur iki iş yapar — durmuş hattı başlatır ve işçi sayısını sıfırdan dörde çıkarır — ikinci tur sıfır iş yapar. Denetleyici ne yaptığını hatırlamaz, her turda gerçek durumu yeniden okur ve fark bulamadığı için dokunmaz.

Elle işletimle karşılaştırma da tek satıra iner. Aynı olay elle kapatılırken dokuz adım ve otuz dört dakika sürer; dokuz adımın beşi yalnız okumadır — hattın durumu, kuyruk boyu, işçi sayısı, hedef servisin durumu, bakım penceresi — ve bu beş adım otuz dört dakikanın yirmi ikisini yer. Karar ve işlem birlikte yedi dakikadır. Elle işletimin pahalı yanı yapılan iş değil, işi yapmak için toplanan bilgidir. Denetleyicide olay iki turda kapanır: bir tur farkı görmek, bir tur işlemi uygulamak; tur başı on beş saniyeden yarım dakika. Asıl fark ikinci satırdadır: aynı olay ikinci kez olduğunda elle yol yine dokuz adım ve otuz dört dakikadır, denetleyicide yine iki tur. Elle işletimde maliyet olay sayısıyla çarpılır; denetleyicide bir kez ödenir.

Bilginin maliyeti de sayılıdır: denetleyici seksen turun her birinde üç kalem okur — durum, işçi sayısı, gecikme — toplam iki yüz kırk ölçüm. Bu ölçümler olay olmadığında da yapılır; sessiz turlarda denetleyicinin ürettiği tek şey okumadır.

Kodlanmamış Bilgi ve Salınım

Üç koşum aynı dünyayı görür ve aynı elli turluk bakımı yaşar. Aradaki tek fark denetleyicinin ne bildiğidir.

Beş maddelik denetleyici bakım boyunca elli altı işlem yapar: kırk üç işçi değişikliği ve on iki yeniden başlatma. İşçi izi salınımı çıplak gösterir — 4 5 6 4 5 6 4 5 6 — üç turluk bir döngü. Gecikme sınırın üstünde olduğu için üçüncü kural işçi ekler; gecikme düşmediği için beşinci kural üç tur sonra hattı yeniden başlatır; yeniden başlatma işçi sayısını dörde geri çeker ve kuyruğa kırk okuma ekler. Sonra aynı üç tur tekrar başlar.

Buradaki asıl nokta işlem sayısı değildir. Denetleyici bilmediği durumu düzeltemez, ama düzeltmeye çalışmaktan da vazgeçemez. Gecikmenin nedeni hattın kendisinde değildir; hedef servis bakımdadır ve hattın kaç işçiyle koştuğu hiçbir şeyi değiştirmez. Denetleyicinin gördüğü tek şey “gecikme sınır üstünde” olduğu için, elindeki iki aleti sırayla dener. On iki yeniden başlatmanın her biri kırk okumayı kuyruğa geri koyar; en yüksek kuyruk dört bin dört yüz kırka çıkar — bilen denetleyicide dört bin. Aradaki dört yüz kırk okuma düzeltme girişiminin kendi ürettiği gecikmedir.

İki ayrı çare vardır ve ikisi ayrı şey ölçer. Birincisi yeniden deneme aralığını büyütmektir: bekleme süresi her yeniden başlatmadan sonra ikiye katlanınca (üç, altı, on iki, yirmi dört tur) işlem elli altıdan yirmi ikiye, yeniden başlatma on ikiden üçe iner. Denetleyici hâlâ yanlış şeyi yapmaktadır, yalnız daha seyrek yapmaktadır. İkincisi altıncı bilgi maddesini eklemektir: hedef bakımdayken dokunulmaz. O zaman işlem ona, yeniden başlatma sıfıra iner ve işçi izi düz bir çizgi olur.

İki çarenin ayrımı önemlidir, çünkü ikisi ayrı sınıftan şeydir. Geri çekilme kodlanmamış bilgiyi kodlamaz; denetleyicinin ne bildiğini hiç değiştirmez, yalnız yanlış kararın sıklığını düşürür. Altıncı madde ise bir bilgi kalemi ekler ve karşılığında bir okuma borcu doğurur: hedef servisin bakım durumu artık her turda okunmalıdır. Sayıya dökülünce iki yol arasındaki fark on iki işlemdir (yirmi ikiye karşı on), ama sayının söylemediği bir yan vardır — geri çekilme her yeni olay türünde yeniden ayarlanmak zorundadır, altıncı madde ise bir kez yazılır.

Altıncı madde olayı çözmez. Aşım turu sayısı üç koşumda da kırk beş ile kırk sekiz arasındadır; gecikme sınırı yine aşılır, çünkü hedef gerçekten kapalıdır. Kazanılan şey olayın süresi değil, olaya eklenen zarardır: kırk altı işlem, on iki yeniden başlatma ve dört yüz kırk okumalık fazladan kuyruk ortadan kalkar.

Devrin Bilançosu

Ölçü Elle işletim 5 madde 5 madde + geri çekilme 6 madde
bir olayın kapanması 9 adım, 34 dk 2 tur 2 tur 2 tur
aynı olay ikinci kez 9 adım, 34 dk 2 tur 2 tur 2 tur
80 turda işlem 56 22 10
yeniden başlatma 12 3 0
işçi değişikliği 43 18 9
en yüksek kuyruk 4440 4120 4000
aşım turu 48 45 46
okuma 5 adım / olay 240 240 240

Devrin bilgi kalemleri sayılabilir: beş kodlanmış madde, bir kodlanmamış madde. Kodlanmış maddelerin ikisi bildirimden okunur, üçü okunmaz — üçü de nöbetçinin deneyiminden gelir ve denetleyiciye yazılana kadar hiçbir yerde durmaz. Bilginin maliyeti de sayılıdır: tur başına üç ölçüm, seksen turda iki yüz kırk okuma, ve olay olmasa bile aynı iki yüz kırk okuma.

Tablonun son satırı devrin sessiz yanını taşır. Elle işletim yalnız olay olduğunda okur — olay başına beş adım — denetleyici ise turların hepsinde okur. Kırk sekiz aşım turu için ödenen bedel iki yüz kırk okumadır ve bunun büyük kısmı hiçbir şeyin değişmediği turlarda toplanmıştır. Kararı devretmek, kararın dayandığı bilgiyi olay yokken de üretmeyi zorunlu kılar.

Yanlış kararın kaynağı tek bir yerdedir: denetleyici hedef servisin bakım durumunu okumaz. Okumadığı için “gecikme yüksek” ile “gecikmenin nedeni bende” arasını ayıramaz ve elindeki bütün aletleri sırayla dener. Bir kararı devretmek, o kararın dayandığı bütün bilgi kalemlerini sürekli ve zamanında üretmeyi gerektirir; eksik bir kalem düzeltmeyi durdurmaz, yalnızca yanlış yöne çevirir.

Özet

  • Denetleyici ilk turda 2 iş yaptı, ikinci turda 0 iş yaptı; her turda gerçek durumu yeniden okur, ne yaptığını hatırlamaz.
  • Elle işletimde bir olay 9 adım ve 34 dakika, denetleyicide 2 tur; olay ikinci kez olduğunda elle maliyet aynen tekrarlanır, denetleyicide tekrarlanmaz.
  • Kodlanmış işletim bilgisi 5 maddedir; 2’si bildirimden okunur, 3’ü yalnız işleten kişinin bilgisidir.
  • Kodlanmamış tek madde 80 turda 56 işlem, 12 yeniden başlatma ve 4 5 6 4 5 6 biçiminde üç turluk bir salınım üretti; yeniden deneme aralığı ikiye katlanınca işlem 22’ye, yeniden başlatma 3’e indi.
  • Altıncı madde eklenince işlem 10’a, yeniden başlatma 0’a indi ama aşım turu 48’den 46’ya değişti: kazanılan şey olayın süresi değil, olaya eklenen 440 okumalık zarardır.

Sonraki Adım

Bu dersin bütün sayıları tek bir hattın seksen turluk izinden çıktı ve o izi tutan şey ölçümdü: tur başına üç kalem, toplam iki yüz kırk okuma. Kümede bir değil yüzlerce kaynak vardır ve her birinin denetleyicisi aynı okumayı yapar. Bir sonraki ders bu okumaların toplanmasını ölçer: kaç kaynak, kaynak başına kaç seri, saklama süresiyle çarpıldığında kaç kayıt ve kaç bayt. Etiket kardinalitesi arttığında seri sayısının neden toplamsal değil çarpımsal büyüdüğü, ve örnekleme ile toplulaştırma uygulandığında kaybedilen ayrıntı ile kazanılan baytın birlikte ne kadar olduğu orada sayılır.

İ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