İçeriğe geç
academia.sh

Ders 17 / 30

İşaretler ve Toleranslar

Düğüm ayrımının işaret ve toleransla kurulması: işaretlenmiş düğümler ayrıldığında genel iş yükünün kaç düğüme sığdığı, ayrılan kapasitenin boş kalma oranı, işaretin üç etkisinin (yerleştirme, koşmaya devam, tahliye) ayrı ayrı ölçülmesi ve yanlış verilen toleransın kaç kapsülü yanlış düğüme düşürdüğü.

İçindekiler

Önceki dersteki kısıtların hepsi aynı yöne bakıyordu: kapsül düğüm hakkında bir şey istiyordu. Ters yön hiç yazılmadı. Bölgesel ölçüm ağında (kurgu) gecelik toplu iş diski ve belleği doyurur; onunla aynı düğüme düşen bir servis kopyası gece boyunca yavaşlar. Bu düğümleri toplu işe ayırmanın yolu on sekiz kapsülün her birine “şu düğümlere gitme” kısıtı yazmak değildir; o çözüm her yeni serviste yeniden yazılmayı gerektirir ve unutulan tek bildirim ayrımı bozar.

İşaret düğüme konur ve varsayılanı tersine çevirir: düğüm, aksini söylemeyen her kapsülü reddeder. Tolerans kapsüle yazılır ve yalnız o reddi kaldırır. Bir kapsülün gelmesi için iki bildirimin de olması gerekir, ama ikisi de yetmez — tolerans izin verir, çekmez. Kapsülü ayrılan düğüme götüren şey hâlâ önceki dersin etiket seçimidir.

Ölçülen şey bir modeldir; gerçek küme koşturulmaz.

Düğümün Koyduğu Koşul

Model dokuz düğüm, on sekiz genel kapsül ve altı toplu iş kapsülüdür. İşaretli düğüm sayısı sıfırdan beşe taranır ve her adımda üç şey sayılır: genel iş yükünün kaç düğüme sığdığı, kaç kapsülün yerleşemediği, ayrılan kapasitenin ne kadarının boş kaldığı.

// zamanlama/isaret.mjs — dugum ayrimi: isaret ve tolerans. Gercek kume degil, model.
// Isaret dugume konur, tolerans kapsule yazilir; tolerans izin verir, cekmez.
export const DUGUM_SAYISI = 9, KAPASITE = 1500;   // ZO13: dokuz dugum, dugum basina 1500 birim
export const SIRA = [0, 3, 6, 1, 4];              // isaretleme sirasi: once her bolgeden biri

export const dugumleriAc = (isaretli, etki = "engel") =>
  Array.from({ length: DUGUM_SAYISI }, (_, i) => ({
    ad: `d${i}`, kapasite: KAPASITE, dolu: 0, kapsul: [],
    isaret: SIRA.slice(0, isaretli).includes(i) ? { anahtar: "toplu-is", etki } : null,
  }));

// ZO14: genel is yuku ve gecelik toplu is (bolgesel olcum agi, kurgu)
export const GENEL = [["okuma-toplayici", 9, 420], ["dogrulayici", 6, 650],
                      ["faturalama", 3, 300]];
export const TOPLU = [["gecelik-toplu", 6, 700]];
export const kapsuller = (liste, ek = {}) => liste.flatMap(([ad, n, birim]) =>
  Array.from({ length: n }, (_, i) => ({ ad: `${ad}-${i + 1}`, servis: ad, birim, ...ek })));

// Isaretin birinci etkisi: toleransi olmayan kapsul isaretli dugume yerlesemez.
// Ucuncu etki (tercih edilmeme) isaretli dugumu son caraya iter, yasaklamaz.
export function yerlestir(kapsullerListesi, dugumler) {
  const yerlesmeyen = [], yanlisDugum = [];
  for (const k of kapsullerListesi) {
    const uygun = dugumler.filter((d) => {
      if (d.dolu + k.birim > d.kapasite) return false;
      if (k.secim && d.isaret?.anahtar !== k.secim) return false;
      return d.isaret === null || k.tolerans === true || d.isaret.etki === "tercih";
    });
    const oncelikli = uygun.filter((d) => d.isaret === null || d.isaret.etki !== "tercih" ||
      k.tolerans === true);
    const d = (oncelikli.length > 0 ? oncelikli : uygun)[0];
    if (d === undefined) { yerlesmeyen.push(k); continue; }
    d.dolu += k.birim; d.kapsul.push(k);
    if (d.isaret !== null && k.servis !== "gecelik-toplu") yanlisDugum.push(k);
  }
  return { dugumler, yerlesmeyen, yanlisDugum };
}

export const dolu = (dugumler) => dugumler.filter((d) => d.kapsul.length > 0).length;
export const TOPLAM_GENEL = GENEL.reduce((t, [, n]) => t + n, 0);

if (process.argv[1].endsWith("isaret.mjs")) {
  const gb = GENEL.reduce((t, [, n, b]) => t + n * b, 0);
  const tb = TOPLU.reduce((t, [, n, b]) => t + n * b, 0);
  console.log(`model: ${DUGUM_SAYISI} dugum x ${KAPASITE} birim = ${DUGUM_SAYISI * KAPASITE}; ` +
    `genel is yuku ${gb} birim / ${TOPLAM_GENEL} kapsul, gecelik toplu is ${tb} birim / 6 kapsul`);
  console.log("ZO15: toplu is gunde 4 saat kosar; ayrilan dugum gunun 24 saatini bekler\n");
  const s = (x, n = 16) => String(x).padStart(n);
  console.log(`${"isaretli".padEnd(10)}${s("genel yerlesen")}${s("yerlesemeyen")}` +
    `${s("genel dugum")}${s("toplu yerlesen")}${s("ayrilan s/gun")}${s("bos oran")}`);
  for (let k = 0; k <= 5; k++) {
    const d = dugumleriAc(k);
    const g = yerlestir(kapsuller(GENEL), d);
    const genelDugum = dolu(d);
    const t = yerlestir(kapsuller(TOPLU, { tolerans: true, secim: "toplu-is" }), d);
    const topluDugum = d.filter((x) => x.kapsul.some((y) => y.servis === "gecelik-toplu")).length;
    const ayrilan = k * 24, kullanilan = topluDugum * 4;
    console.log(`${String(k).padEnd(10)}${s(TOPLAM_GENEL - g.yerlesmeyen.length)}` +
      `${s(g.yerlesmeyen.length)}${s(genelDugum)}${s(6 - t.yerlesmeyen.length)}${s(ayrilan)}` +
      `${s(k === 0 ? "-" : "%" + (100 * (1 - kullanilan / ayrilan)).toFixed(1))}`);
  }
}
model: 9 dugum x 1500 birim = 13500; genel is yuku 8580 birim / 18 kapsul, gecelik toplu is 4200 birim / 6 kapsul
ZO15: toplu is gunde 4 saat kosar; ayrilan dugum gunun 24 saatini bekler

isaretli    genel yerlesen    yerlesemeyen     genel dugum  toplu yerlesen   ayrilan s/gun        bos oran
0                       18               0               7               0               0               -
1                       18               0               7               2              24           %83.3
2                       18               0               7               4              48           %83.3
3                       15               3               6               6              72           %83.3
4                       13               5               5               6              96           %87.5
5                       11               7               4               6             120           %90.0

Ayırmanın İki Faturası

İlk satır tolerans ile etiket seçiminin farkını sayıyla veriyor. İşaretli düğüm yokken toplu işin altı kapsülünün hiçbiri yerleşemiyor, çünkü toplu iş kapsülleri işaretli düğüm arayan bir seçim taşıyor ve öyle bir düğüm yok. Toleransları yerinde duruyor; tolerans tek başına hiçbir kapsülü hiçbir yere götürmüyor.

Birinci fatura genel iş yükünündür. Bir ya da iki düğüm ayrıldığında genel iş yükü hâlâ yedi düğüme sığıyor ve on sekiz kapsülün on sekizi yerleşiyor; üç düğüm ayrıldığında altı düğüme sıkışıyor ve üç kapsül yerleşemiyor. Beş düğüm ayrılınca yerleşemeyen sayısı yediye çıkıyor. Ayırma bir yalıtım kararıdır ve karşılığı doğrudan genel iş yükünün kapasitesinden ödenir.

İkinci fatura ayrılan kapasitenin kendisindedir. Toplu iş günde dört saat koşar, ayrılan düğüm ise yirmi dört saat bekler: boş kalma oranı en iyi durumda yüzde 83,3’tür. Bu oran ayırmanın verimsizliği değil, tanımıdır — ayırma zamanı değil düğümü ayırır. Üçten fazla düğüm ayrıldığında oran daha da bozuluyor (yüzde 87,5, sonra yüzde 90), çünkü toplu iş üç düğümden fazlasını kullanmıyor ve fazladan ayrılan her düğüm gününün tamamını boş geçiriyor. Üç düğüm ayrıldığında günde 72 düğüm-saat rezerve edilip 12 düğüm-saat kullanılıyor.

Bu iki fatura, ayrımın bildirim maliyetiyle birlikte okunmalıdır. Aynı ayrımı kapsül tarafından kurmak on sekiz genel kapsülün her birine bir kısıt yazmayı gerektirir; işaretle kurmak üç düğüm işareti ve altı toleranstan, yani dokuz kalemden ibarettir. Fark yalnız sayıda değil, kimin unutabileceğindedir: kapsül tarafındaki kurulumda kısıtı yazmayı unutan yeni bir servis ayrımı sessizce bozar, düğüm tarafındaki kurulumda unutan servis yalnız ayrılan düğümlere giremez. Yanlış yönde kurulmuş bir ayrım her yeni serviste yeniden bozulabilir.

Boş kalma oranı da tek bir sayıya bağlıdır. Ayrılan düğüm günün tamamını beklediği için oran doğrudan pencerenin genişliğinden çıkar: dört saatlik pencerede yüzde 83,3, sekiz saatlikte yüzde 66,7, bir saatlikte yüzde 95,8. Ayırma kararı bu yüzden bir kaynak kararı değil, bir pencere kararıdır; toplu işin süresi kısaldıkça ayrılan düğümün bedeli oransal olarak büyür.

İşaretin Üç Etkisi ve Yanlış Tolerans

İşaret tek bir şey yapmaz. Aynı işaret üç ayrı etkiyle konabilir: yeni kapsülün yerleşmesini engellemek, hâlihazırda koşan kapsülleri de çıkarmak, ya da yalnız tercih sırasını düşürmek. Üçü ayrı ayrı ölçülür ve ardından tolerans yanlış verildiğinde ne olduğu taranır. Üç etkinin ayrımı yalnız bir ayar farkı değildir: birincisi gelecekteki yerleştirmeleri, ikincisi hâlihazırda koşan kapsülleri, üçüncüsü ise yalnız sıralamayı bağlar. Aynı ayrım niyeti üç ayrı sonuç verir ve aralarındaki fark ancak sayılırsa görünür.

// zamanlama/tolerans.mjs — isaretin uc etkisi ayri ayri, ve yanlis verilen toleransin bedeli.
import { GENEL, TOPLU, SIRA, TOPLAM_GENEL, dugumleriAc, kapsuller, yerlestir } from "./isaret.mjs";

const ISARETLI = 3;                     // ZO16: uc dugum gecelik toplu ise ayrilir
const genelKapsuller = (toleransli = 0) =>
  kapsuller(GENEL).map((k, i) => (i < toleransli ? { ...k, tolerans: true } : k));
const topluKapsuller = () => kapsuller(TOPLU, { tolerans: true, secim: "toplu-is" });
const s = (x, n = 16) => String(x).padStart(n);

// Ikinci etki: kapsuller kostuktan SONRA isaret konursa toleransi olmayanlar cikarilir.
function sonradanIsaretle(toleransli = 0) {
  const d = dugumleriAc(0);
  yerlestir(genelKapsuller(toleransli), d);
  const kume = new Set(SIRA.slice(0, ISARETLI));
  const cikarilan = [];
  d.forEach((x, i) => {
    if (!kume.has(i)) return;
    x.isaret = { anahtar: "toplu-is", etki: "tahliye" };
    cikarilan.push(...x.kapsul.filter((k) => k.tolerans !== true));
    x.kapsul = x.kapsul.filter((k) => k.tolerans === true);
    x.dolu = x.kapsul.reduce((t, k) => t + k.birim, 0);
  });
  const yeniden = yerlestir(cikarilan, d);
  const korunan = d.filter((x, i) => kume.has(i))
    .reduce((t, x) => t + x.kapsul.filter((k) => k.tolerans === true).length, 0);
  return { cikarilan: cikarilan.length, yerlesemeyen: yeniden.yerlesmeyen.length, korunan };
}

console.log(`isaretin uc etkisi ayri ayri (${ISARETLI} dugum ayrilmis, tolerans dogru verilmis):`);
console.log(`${"etki".padEnd(24)}${s("genel yerlesen")}${s("ayrilanda genel")}${s("cikarilan")}` +
  `${s("yeniden yerlesmeyen", 21)}`);
for (const etki of ["engel", "tercih"]) {
  const d = dugumleriAc(ISARETLI, etki);
  const g = yerlestir(genelKapsuller(), d);
  console.log(`${(etki === "engel" ? "yerlestirme engeli" : "tercih edilmeme").padEnd(24)}` +
    `${s(TOPLAM_GENEL - g.yerlesmeyen.length)}${s(g.yanlisDugum.length)}${s(0)}${s(0, 21)}`);
}
const t2 = sonradanIsaretle();
console.log(`${"kosmaya devam engeli".padEnd(24)}` +
  `${s(TOPLAM_GENEL - t2.yerlesemeyen)}${s(0)}${s(t2.cikarilan)}${s(t2.yerlesemeyen, 21)}`);

// ZO17: tolerans kopyala-yapistirla yayilir. Yanlis tolerans sayisi taranir.
console.log(`\nyanlis verilen tolerans (${ISARETLI} dugum ayrilmis, yerlestirme engeli):`);
console.log(`${"toleransli genel".padEnd(20)}${s("ayrilanda genel")}${s("genel yerlesen")}` +
  `${s("toplu yerlesen")}${s("tahliyede korunan", 19)}`);
for (const n of [0, 2, 4, 6, 9]) {
  const d = dugumleriAc(ISARETLI);
  const g = yerlestir(genelKapsuller(n), d);
  const t = yerlestir(topluKapsuller(), d);
  const korunan = sonradanIsaretle(n);
  console.log(`${String(n).padEnd(20)}${s(g.yanlisDugum.length)}` +
    `${s(TOPLAM_GENEL - g.yerlesmeyen.length)}${s(6 - t.yerlesmeyen.length)}` +
    `${s(korunan.korunan, 19)}`);
}

// ZO18: karar icin okunan bildirimler. Isaret dugumde, tolerans kapsulde; ikisi de beyandir.
const kalem = ISARETLI + TOPLAM_GENEL + 6;
console.log(`\nokunan bildirim: ${ISARETLI} dugum isareti + ${TOPLAM_GENEL + 6} kapsul tolerans ` +
  `alani = ${kalem}; dogrulugunu olcen bir kalem yok`);
isaretin uc etkisi ayri ayri (3 dugum ayrilmis, tolerans dogru verilmis):
etki                      genel yerlesen ayrilanda genel       cikarilan  yeniden yerlesmeyen
yerlestirme engeli                    15               0               0                    0
tercih edilmeme                       18               3               0                    0
kosmaya devam engeli                  15               0               8                    3

yanlis verilen tolerans (3 dugum ayrilmis, yerlestirme engeli):
toleransli genel     ayrilanda genel  genel yerlesen  toplu yerlesen  tahliyede korunan
0                                  0              15               6                  0
2                                  2              18               4                  2
4                                  3              18               4                  3
6                                  3              18               4                  3
9                                  3              18               4                  3

okunan bildirim: 3 dugum isareti + 24 kapsul tolerans alani = 27; dogrulugunu olcen bir kalem yok

Üç Etki Ayrı Ayrı

Yerleştirme engeli yalnız geleceği bağlar: on beş genel kapsül yerleşiyor, ayrılan düğümlerde tek bir genel kapsül bulunmuyor, hiçbir şey çıkarılmıyor. Ayrım temizdir ve bedeli yerleşemeyen üç kapsüldür.

Koşmaya devam engeli bugünü bağlar. Kapsüller çoktan yerleşmişken işaret konulduğunda sekiz kapsül düğümlerinden çıkarılıyor; kalan kapasiteye geri yerleşmeye çalıştıklarında üçü yer bulamıyor. Aynı son durum (on beş ayakta kapsül) iki yoldan da elde ediliyor, ama ikinci yolda sekiz kapsül yeniden başlatılmış oluyor. Bir işaretin ne zaman konduğu, hangi etkiyle konduğu kadar önemlidir.

Tercih edilmeme hiçbir şeyi engellemiyor. On sekiz kapsülün on sekizi yerleşiyor, ama üç genel kapsül ayrılan düğümlere düşüyor. Yumuşak bir işaret kapasite bollaşana kadar işe yarar ve tam da kapasite daraldığında, yani ayrımın gerektiği anda, kendiliğinden çözülür. Ayrımın bir belge değil bir yaptırım olması gerekir.

Üç etkinin sayıları bir arada okunduğunda devredilen kararın kapsamı da netleşiyor. Sisteme verilen yetki yalnız “nereye koy” değil, “kimi çıkar” ve “kimi tercih etme” yetkilerini de içeriyor. Üçünün dayandığı bilgi tek bir alandır — düğümdeki işaretin etkisi — ve bu alan yanlış seçildiğinde sonuç ya kâğıt üzerinde kalan bir ayrım (tercih edilmeme) ya da sekiz kapsüllük ani bir yeniden başlatma dalgası (koşmaya devam engeli) olur. İkisi arasındaki farkı doğuran şey kümenin durumu değil, tek bir sözcüklük bir bildirimdir.

Yanlış Tolerans Hatayı İyileşme Gibi Gösteriyor

Son tablo, kopyala-yapıştırla yayılan bir toleransın bedelini sayıyor. İki genel kapsüle gereksiz tolerans yazıldığında bu kapsüller ayrılan düğümlere düşüyor ve gecelik toplu işin altı kapsülünden ikisi yerleşemez hâle geliyor. Dört ya da daha fazla kapsülde tolerans varsa ayrılan düğümlerdeki yabancı kapsül sayısı üçte doyuyor.

Bu tablonun tehlikeli sütunu ortadakidir. Yanlış tolerans verildiğinde genel yerleşen sayısı on beşten on sekize çıkıyor. Yerleştirme kararına bakan hiçbir gösterge bir sorun bildirmez: daha çok kapsül yerleşmiştir, hiçbir kapsül çözümsüz kalmamıştır, kümenin doluluğu artmıştır. Bozulan tek şey ayrımın kendisidir ve o ancak gece, toplu iş eksik kapsülle koştuğunda görünür. Son sütun ikinci bir kaybı ekliyor: koşmaya devam engeli konulduğunda bu kapsüller tahliye edilmiyor, çünkü toleransları onları koruyor. Yanlış bildirim, düzeltme mekanizmasının önüne de geçiyor.

Kararın dayandığı bilgi yirmi yedi kalemdir: üç düğüm işareti ve yirmi dört kapsülün tolerans alanı. Bu kalemlerin hiçbiri ölçüm değildir ve bir toleransın gerçekten gerekli olup olmadığını sınayan tek bir sayaç yoktur. Sistem yanlış kapsülü ayrılan düğüme, bir yanlışlık olduğunu bilmediği için değil, bilebileceği bir kalem bulunmadığı için koyar.

Özet

  • İşaret düğüme, tolerans kapsüle yazılır; tolerans izin verir, çekmez. İşaretli düğüm yokken toplu işin altı kapsülü de yerleşemiyor, çünkü götüren şey etiket seçimidir.
  • Ayırmanın birinci faturası genel iş yükünde: üç düğüm ayrılınca genel iş yükü altı düğüme sıkışıyor ve üç kapsül yerleşemiyor, beş düğüm ayrılınca yedi kapsül yerleşemiyor.
  • İkinci fatura ayrılan kapasitede: dört saatlik pencere için yirmi dört saat rezerve edildiğinden boş kalma oranı en iyi durumda yüzde 83,3; ayrılan düğüm sayısı arttıkça yüzde 90’a çıkıyor.
  • Üç etki üç ayrı şey ölçer: yerleştirme engeli ayrılan düğümde sıfır yabancı kapsül bırakıyor, koşmaya devam engeli sekiz kapsülü çıkarıyor ve üçü yeniden yerleşemiyor, tercih edilmeme üç yabancı kapsülü engellemiyor.
  • Gereksiz tolerans ayrılan düğümlere üç yabancı kapsül sokuyor ve gecelik toplu işin iki kapsülünü yerleştiremez hâle getiriyor; yerleşen sayısı on beşten on sekize çıktığı için hata bir iyileşme gibi görünüyor.
  • Karar yirmi yedi bildirim kalemine dayanıyor ve toleransın gerekliliğini ölçen kalem yok; yanlış tolerans tahliye etkisinde kapsülü koruduğu için düzeltmenin de önüne geçiyor.

Sonraki Adım

Buraya kadarki bütün kararlar yerleştirme anında veriliyor: kapsül bir düğüme düşüyor ve orada kalıyor. Kaynak baskısı ise yerleştirmeden sonra doğar. Bir düğümün belleği dolduğunda birileri çıkarılmak zorundadır ve bu kararı veren şey zamanlayıcı değil, düğümün kendisidir. Hangi kapsülün çıkarılacağı, isteğin ne kadar altında ya da üstünde çalışıldığına ve kapsüle yazılmış bir öncelik sınıfına bağlıdır. Sonraki ders tahliye sırasını modelleyecek, öncelik eklendiğinde yer açmanın kaç kapsülü etkilediğini ve zincirin kaç kez uzadığını sayacak.

İ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