---
title: 'Yama Yönetimi'
source: 'https://academia.sh/tr/kurslar/sunucu-ve-sertlestirme/yama-yonetimi'
course: 'Sunucu, Ağ ve Sertleştirme'
language: tr
updated: '2026-08-17T18:09:10+00:00'
license: 'CC BY-SA 4.0'
---

# Yama Yönetimi

Kusur duyurusundan yamanın uygulanmasına kadar geçen açık pencerenin dört parçaya ayrılması: beş pencere düzeninde ortalama açık pencere, kesinti ve geri alma sayısının karşılaştırılması, otomatik yamanın kazandırdığı günün ürettiği sınanmamış yama riskiyle aynı tabloda okunması ve yamalanamayan kalemin adıyla yazılması.

Önceki ders erişimi daralttı ve sırların ömrünü kısalttı. Ama o kimlik bilgisini kullanan yazılımın
kendisi — çekirdek, sistem kitaplığı, dil çalışma zamanı, ters vekil — durduğu yerde eskiyor. Bir
kusur duyurusu yapıldığı anda, o bileşenin kurulu olduğu **her makine** bir açık yüzey kalemine
dönüşür ve kalem, yama uygulanana kadar açık kalır. Varsayılanın burada bıraktığı bir ayar değil, bir
**boşluktur**: hangi makinede hangi sürümün koştuğunu kimse bilmez ve yama, bir şey bozulduğunda
uygulanır. Ölçü **açık pencere**dir — duyuru ile uygulama arasında geçen süre; kaç kalemin ne kadar
süre açık kaldığı ise **açık kalem-günü**dür.

## Açık Pencere Dört Parçadır

Açık pencere tek bir sayı değil, bağımsız dört parçanın toplamıdır. **Fark etme**, duyuruyla o
bileşenin filoda kurulu olduğunun görülmesi arasındaki süredir ve envanter tarama aralığına bağlıdır.
**Sınama**, yamanın üretim dışı bir ortamda denenmesidir. **Pencere bekleme**, hazır yamanın bir
sonraki bakım aralığını beklemesidir. **Uygulama**, kurulum ve yeniden başlatmadır.

Aşağıdaki düzenek bir **modeldir**. Kurgu bölgesel ölçüm ağının makineleri ve bileşenleri veri
yapısı olarak yazılır; gerçek bir filo taranmaz.

- **ST19** — Filo kurgudur: on iki makine, sekiz bileşen ve altmış (makine, bileşen) kalemi.
- **ST20** — Doksan günlük pencerede on dört duyuru yapılıyor; günleri ve bileşenleri modelde
  yazılıdır.
- **ST21** — Envanter tarama aralığı fark etmeyi belirler: duyuru bir sonraki taramada görülür.
- **ST22** — Bakım penceresi sabit aralıklı ve sabit saatlidir; `pencere: 0` beklemesiz düzendir.
- **ST23** — Yamanın kusurlu olup olmadığı kendi yazdığımız üreteçle belirlenir, tohum görünürdür.
  Sınama kusuru yakalarsa düzeltilmiş yama üç gün sonra gelir; yakalayamazsa yama üretime gider,
  yarım gün sonra görülür ve geri alınır.
- **ST24** — Üç kalem hiçbir düzende yamalanamaz; gerekçeleri modelde yazılıdır.

```js
// yama/model.mjs — yama akisi MODELIDIR: on iki kurgu makine, sekiz bilesen, on dort duyuru.
// Gercek bir filo taranmaz, gercek bir yama indirilmez; butun sayilar bu dosyadan turer.
const GRUP = { toplayici: 3, dogrulayici: 2, faturalama: 1, "is-emri": 1, veri: 2, gecit: 2, kuyruk: 1 };
export const MAKINELER = Object.entries(GRUP).flatMap(([a, n]) =>
  Array.from({ length: n }, (_, i) => `${a}-${i + 1}`));

export const BILESEN = {                          // sinama ve uygulama sureleri gun cinsinden
  cekirdek:              { sinama: 2.0, uygulama: 0.20, grup: "hepsi" },
  "sistem-kitapligi":    { sinama: 1.0, uygulama: 0.15, grup: "hepsi" },
  "gozetim-ajani":       { sinama: 0.25, uygulama: 0.05, grup: "hepsi" },
  zamanlayici:           { sinama: 0.25, uygulama: 0.05, grup: "hepsi" },
  "dil-calisma-zamani":  { sinama: 1.5, uygulama: 0.10, grup: ["toplayici", "dogrulayici", "faturalama", "is-emri"] },
  "veritabani-sunucusu": { sinama: 2.0, uygulama: 0.25, grup: ["veri"] },
  "ters-vekil":          { sinama: 0.5, uygulama: 0.05, grup: ["gecit"] },
  "mesaj-kuyrugu":       { sinama: 1.0, uygulama: 0.10, grup: ["kuyruk"] },
};
export const makineleri = (b) => (BILESEN[b].grup === "hepsi" ? MAKINELER
  : MAKINELER.filter((m) => BILESEN[b].grup.includes(m.slice(0, m.lastIndexOf("-")))));
export const KALEM = Object.keys(BILESEN).reduce((a, b) => a + makineleri(b).length, 0);

export const YAMALANAMAZ = [                      // kalem = (makine, bilesen); gerekce adiyla yazilir
  ["faturalama-1", "dil-calisma-zamani", "uygulama uyumlulugu"],
  ["veri-1", "veritabani-sunucusu", "surekli calismasi gereken servis"],
  ["kuyruk-1", "mesaj-kuyrugu", "tek kopya, bosaltilamayan kuyruk"],
];
export const yamalanabilir = (b) =>
  makineleri(b).filter((m) => !YAMALANAMAZ.some((k) => k[0] === m && k[1] === b));

export const DUYURU = [                           // 90 gunluk pencerede on dort kusur duyurusu
  [3.2, "sistem-kitapligi"], [8.6, "dil-calisma-zamani"], [12.1, "cekirdek"], [19.4, "gozetim-ajani"],
  [23.0, "ters-vekil"], [27.8, "sistem-kitapligi"], [34.5, "veritabani-sunucusu"], [39.9, "zamanlayici"],
  [45.3, "cekirdek"], [51.7, "mesaj-kuyrugu"], [58.2, "dil-calisma-zamani"], [63.5, "sistem-kitapligi"],
  [71.1, "gozetim-ajani"], [78.4, "cekirdek"],
];
export const UFUK = 90, YENIDEN = 3.0, GORULME = 0.5, TOHUM = 4127;

export function uretec(tohum) {                   // ureteci kendimiz yaziyoruz, tohum gorunur
  let x = tohum >>> 0;
  return () => { x = (Math.imul(x, 1103515245) + 12345) >>> 0; return x / 4294967296; };
}
const r = uretec(TOHUM);                          // cekilis duzenden bagimsiz: hepsi ayni yamalari gorur
export const KUSURLU = DUYURU.map(() => r() < 0.20);
export const YAKALANIR = DUYURU.map(() => r() < 0.75);

export const DUZEN = {                            // tarama = envanter araligi, pencere = bakim araligi
  varsayilan: { tarama: 30, sinama: false, pencere: 30, ofs: 5.0 },
  haftalik: { tarama: 1, sinama: true, pencere: 7, ofs: 2.0 },
  gecelik: { tarama: 1, sinama: true, pencere: 1, ofs: 2 / 24 },
  surekli: { tarama: 0.25, sinama: true, pencere: 0, ofs: 0 },
  otomatik: { tarama: 0.25, sinama: false, pencere: 0, ofs: 0 },
};
const ilkPencere = (d, hazir) => (d.pencere === 0 ? hazir
  : Math.ceil((hazir - d.ofs) / d.pencere) * d.pencere + d.ofs);

// Bir duyurunun akisi: fark etme, sinama, pencere bekleme, uygulama.
export function akis(i, adi, kusurlu = KUSURLU[i]) {
  const d = DUZEN[adi], [gun, b] = DUYURU[i], bil = BILESEN[b], olay = [];
  const fark = Math.ceil(gun / d.tarama) * d.tarama;
  const sinama = d.sinama ? bil.sinama : 0;
  let hazir = fark + sinama, geriAlma = 0;
  if (kusurlu && d.sinama && YAKALANIR[i]) hazir += YENIDEN;    // sinama yakaladi: yama gecikir
  else if (kusurlu) {                                          // sinanmadi ya da kacti: uretime gitti
    const ilk = ilkPencere(d, hazir);
    olay.push(ilk, ilk + GORULME);                             // uygulama ve ardindan geri alma
    geriAlma = 1;
    hazir = ilk + GORULME + YENIDEN;
  }
  const uygula = ilkPencere(d, hazir);
  olay.push(uygula);
  return { fark: fark - gun, sinama, bekleme: uygula - hazir, uygulama: bil.uygulama,
    kapanis: uygula + bil.uygulama, pencere: uygula + bil.uygulama - gun, geriAlma, olay };
}

export function tara(adi, kusurluMu = null) {
  const kesinti = new Set();
  let ort = 0, geriAlma = 0, kalemGun = 0, acik = 0;
  for (let i = 0; i < DUYURU.length; i += 1) {
    const a = akis(i, adi, kusurluMu === null ? KUSURLU[i] : kusurluMu);
    const yb = yamalanabilir(DUYURU[i][1]);
    ort += a.pencere / DUYURU.length;
    geriAlma += a.geriAlma;
    kalemGun += a.pencere * yb.length;
    if (a.kapanis > UFUK) acik += yb.length;
    for (const an of a.olay) for (const m of yb) kesinti.add(`${m}@${an.toFixed(4)}`);
  }
  return { ort, geriAlma, kalemGun, kesinti: kesinti.size,
    acik: acik + YAMALANAMAZ.length };
}
```

## Beş Düzen Taranıyor

```js
// yama/pencere.mjs — bes pencere duzeninde acik pencerenin dort parcasi ve bedelleri
import { DUYURU, DUZEN, MAKINELER, BILESEN, KALEM, KUSURLU, TOHUM, akis, tara } from "./model.mjs";

const g = (x, n, d = 2) => x.toFixed(d).padStart(n);
console.log(`${MAKINELER.length} makine, ${Object.keys(BILESEN).length} bilesen, ${KALEM} kalem; ` +
  `90 gunde ${DUYURU.length} duyuru, ${KUSURLU.filter(Boolean).length} kusurlu yama (tohum ${TOHUM}).`);
console.log("\nduzen      | tarama | sinama | pencere | ort. acik | acik kalem | kesinti | geri alma");
console.log("-----------|--------|--------|---------|-----------|------------|---------|----------");
for (const [ad, d] of Object.entries(DUZEN)) {
  const t = tara(ad);
  console.log(`${ad.padEnd(10)} | ${g(d.tarama, 6)} | ${(d.sinama ? "var" : "yok").padStart(6)}` +
    ` | ${(d.pencere ? d.pencere + " gun" : "yok").padStart(7)} | ${g(t.ort, 9)}` +
    ` | ${String(t.acik).padStart(10)} | ${String(t.kesinti).padStart(7)} | ${String(t.geriAlma).padStart(8)}`);
}

console.log("\nAcik pencerenin dort parcasi (gun), on dort duyurunun ortalamasi:");
console.log("duzen      | fark etme | sinama | pencere bekleme | uygulama | toplam");
console.log("-----------|-----------|--------|-----------------|----------|-------");
for (const ad of Object.keys(DUZEN)) {
  const p = { fark: 0, sinama: 0, bekleme: 0, uygulama: 0, pencere: 0 };
  for (let i = 0; i < DUYURU.length; i += 1)
    for (const k of Object.keys(p)) p[k] += akis(i, ad)[k] / DUYURU.length;
  console.log(`${ad.padEnd(10)} | ${g(p.fark, 9)} | ${g(p.sinama, 6)} | ${g(p.bekleme, 15)}` +
    ` | ${g(p.uygulama, 8)} | ${g(p.pencere, 6)}`);
}
```

```
12 makine, 8 bilesen, 60 kalem; 90 gunde 14 duyuru, 4 kusurlu yama (tohum 4127).

duzen      | tarama | sinama | pencere | ort. acik | acik kalem | kesinti | geri alma
-----------|--------|--------|---------|-----------|------------|---------|----------
varsayilan |  30.00 |    yok |  30 gun |     28.94 |         45 |      54 |        4
haftalik   |   1.00 |    var |   7 gun |      6.79 |          3 |     126 |        1
gecelik    |   1.00 |    var |   1 gun |      3.09 |          3 |     147 |        1
surekli    |   0.25 |    var |     yok |      2.28 |          3 |     147 |        1
otomatik   |   0.25 |    yok |     yok |      1.22 |          3 |     205 |        4

Acik pencerenin dort parcasi (gun), on dort duyurunun ortalamasi:
duzen      | fark etme | sinama | pencere bekleme | uygulama | toplam
-----------|-----------|--------|-----------------|----------|-------
varsayilan |     15.24 |   0.00 |           11.14 |     0.13 |  28.94
haftalik   |      0.52 |   1.16 |            3.89 |     0.13 |   6.79
gecelik    |      0.52 |   1.16 |            0.33 |     0.13 |   3.09
surekli    |      0.09 |   1.16 |            0.00 |     0.13 |   2.28
otomatik   |      0.09 |   0.00 |            0.00 |     0.13 |   1.22
```

İkinci tablo varsayılanın nerede kaybettiğini gösteriyor: 28,94 günün 15,24'ü **fark etmedir**. Bu
sürenin yamayla ya da kesinti korkusuyla ilgisi yok; tek nedeni hangi sürümün nerede koştuğunu tutan
bir kaydın bulunmamasıdır. Envanter taraması günlüğe çekildiğinde bu parça 0,52 güne iniyor — tek
adımda 14,72 gün, üstelik hiçbir makine yeniden başlatılmadan.

Sınama ters yönde çalışan tek kalemdir: yoktan 1,16 güne çıkar, yani pencereyi **uzatır**. Karşılığı
geri alma sütunundadır: on dört yamanın dördü kusurlu, sınama yapılan üç düzende bunların üçü
üretime ulaşmadan yakalandı ve geri alma 4 yerine 1 oldu.

Kesinti ise pencere aralığıyla ters çalışır. Varsayılan düzen 54 kesintiyle en sessiz olanıdır,
çünkü aylık pencerede biriken yamalar tek yeniden başlatmada toplanır — ve aynı toplanma pencereyi
28,94 güne çıkaran şeydir. Gecelik düzende kesinti 126'dan 147'ye çıkar, bekleme 3,89 günden 0,33
güne iner. **Kesinti sayısı ile açık pencere aynı kaldıracın iki ucudur.** Doksanıncı gün sayımı
sonuçtur: varsayılan düzende 45 kalem açık, öteki dört düzende 3.

## Otomasyonun Kazandırdığı Gün ve Ürettiği Risk

```js
// yama/otomasyon.mjs — otomasyonun kazandirdigi gun, urettigi risk ve getirdigi yeni yuzey
import { DUYURU, DUZEN, MAKINELER, YAMALANAMAZ, KALEM, UFUK, KUSURLU, tara } from "./model.mjs";

const g = (x, n, d = 2) => x.toFixed(d).padStart(n);
const taban = tara("haftalik");
console.log("duzen      | ort. acik | haftaliga gore | sinanmadan | uretimde  | geri almanin | ek");
console.log("           |     (gun) |  kazanc  (gun) |  uygulanan | geri alma | ekledigi gun | kesinti");
console.log("-----------|-----------|----------------|------------|-----------|--------------|--------");
for (const ad of Object.keys(DUZEN)) {
  const t = tara(ad), s = tara(ad, false);          // s: hicbir yama kusurlu degilse
  console.log(`${ad.padEnd(10)} | ${g(t.ort, 9)} | ${g(taban.ort - t.ort, 14)}` +
    ` | ${String(DUZEN[ad].sinama ? 0 : DUYURU.length).padStart(10)} | ${String(t.geriAlma).padStart(9)}` +
    ` | ${g(t.ort - s.ort, 12)} | ${String(t.kesinti - s.kesinti).padStart(7)}`);
}

console.log("\nYamalanamayan kalemler (duyuru gelir, uygulama hicbir duzende olmaz):");
let yamalanamazGun = 0;
for (const [m, b, gerekce] of YAMALANAMAZ) {
  const ilk = DUYURU.find(([, x]) => x === b)[0];
  yamalanamazGun += UFUK - ilk;
  console.log(`${(m + " / " + b).padEnd(34)} | ${gerekce.padEnd(32)} | duyuru ${g(ilk, 4, 1)}. gun` +
    ` | ${g(UFUK - ilk, 5, 1)} gun acik`);
}
const kalemGun = tara("gecelik").kalemGun;
console.log(`gecelik duzende yamalanabilir ${KALEM - YAMALANAMAZ.length} kalem : ${g(kalemGun, 7)} kalem-gunu`);
console.log(`yamalanamayan ${YAMALANAMAZ.length} kalem${" ".repeat(24)} : ${g(yamalanamazGun, 7)} kalem-gunu ` +
  `(toplamin %${g(100 * yamalanamazGun / (kalemGun + yamalanamazGun), 5)}'i)`);

// kapatmanin getirdigi yeni yuzey: her makinede bir yama ajani, bir paket kaynagi, bir envanter kaydi
const yeni = MAKINELER.length + 3;
console.log(`\nyeni yuzey: ${MAKINELER.length} yama ajani + paket kaynagi + envanter kaydi + bakim penceresi`);
console.log(`${KALEM} kalem -> ${KALEM + yeni} kalem (+${yeni}); acik pencere ` +
  `${g(tara("varsayilan").ort, 5)} gunden ${g(tara("otomatik").ort, 5)} gune indi, ` +
  `geri alma ${taban.geriAlma} yerine ${tara("otomatik").geriAlma}, ` +
  `kesinti ${taban.kesinti} yerine ${tara("otomatik").kesinti}.`);
console.log(`kusurlu yama ${KUSURLU.filter(Boolean).length}/${DUYURU.length}; ` +
  `sinama bunlarin ${KUSURLU.filter(Boolean).length - taban.geriAlma} tanesini uretimden once yakaladi.`);
```

```
duzen      | ort. acik | haftaliga gore | sinanmadan | uretimde  | geri almanin | ek
           |     (gun) |  kazanc  (gun) |  uygulanan | geri alma | ekledigi gun | kesinti
-----------|-----------|----------------|------------|-----------|--------------|--------
varsayilan |     28.94 |         -22.14 |         14 |         4 |         8.57 |      18
haftalik   |      6.79 |           0.00 |          0 |         1 |         1.50 |      17
gecelik    |      3.09 |           3.70 |          0 |         1 |         0.93 |      24
surekli    |      2.28 |           4.52 |          0 |         1 |         0.89 |      24
otomatik   |      1.22 |           5.57 |         14 |         4 |         1.00 |      82

Yamalanamayan kalemler (duyuru gelir, uygulama hicbir duzende olmaz):
faturalama-1 / dil-calisma-zamani  | uygulama uyumlulugu              | duyuru  8.6. gun |  81.4 gun acik
veri-1 / veritabani-sunucusu       | surekli calismasi gereken servis | duyuru 34.5. gun |  55.5 gun acik
kuyruk-1 / mesaj-kuyrugu           | tek kopya, bosaltilamayan kuyruk | duyuru 51.7. gun |  38.3 gun acik
gecelik duzende yamalanabilir 57 kalem :  407.50 kalem-gunu
yamalanamayan 3 kalem                         :  175.20 kalem-gunu (toplamin %30.07'i)

yeni yuzey: 12 yama ajani + paket kaynagi + envanter kaydi + bakim penceresi
60 kalem -> 75 kalem (+15); acik pencere 28.94 gunden  1.22 gune indi, geri alma 1 yerine 4, kesinti 126 yerine 205.
kusurlu yama 4/14; sinama bunlarin 3 tanesini uretimden once yakaladi.
```

Otomatik düzen haftalığa göre 5,57 gün kazandırıyor ve en kısa pencereye sahip. Aynı satırda üç sayı
daha var: on dört yamanın on dördü sınanmadan uygulandı, dördü üretimde geri alındı ve geri alma 82
fazladan kesinti üretti. Sürekli düzen ise 4,52 gün kazandırıyor — kazancın yüzde 81'i — ama
sınanmadan uygulanan yama sıfır ve ek kesinti 24. Aradaki fark 1,06 gündür. **Tartışma otomasyonun
kendisi değil, sınamanın atlanıp atlanmadığıdır.** Geri almanın eklediği gün sütunu ise kusurlu
yamanın kendi penceresini uzattığını gösteriyor: otomatik düzende 1,00 gün, varsayılan düzende 8,57
gün — çünkü düzeltilmiş sürüm bir sonraki aylık pencereyi bekler.

İkinci tablo kapatılamayan kalemi adıyla yazıyor. Faturalama makinesindeki dil çalışma zamanı, gün
sonu toplu işi eski sürüme bağlı olduğu için yükseltilemez; birincil veri makinesindeki veritabanı
sunucusu, gecelik toplu iş penceresinde yazma kesintisine yer olmadığı için yeniden başlatılamaz;
tek kopya kuyruk boşaltılamadığı için durdurulamaz. Bu üç kalem 175,20 kalem-günü taşıyor — altmış
kalemin yüzde 5'i, açık kalem-gününün **yüzde 30,07'si**.

Kapatmanın kendisi de yüzey getiriyor. Yama otomasyonu on iki makinenin her birine yükseltilmiş
yetkiyle kod çalıştıran bir süreç koyar; paket kaynağı dışarıdan gelen ikili dosyanın tek güven
noktasıdır; envanter kaydı okuyabilen biri için filonun tam bir kusur haritasıdır; bakım penceresi
her gece aynı saatte tekrarlanan, önceden bilinen bir bozulma aralığıdır.

## Özet

- Açık pencere dört parçadır: fark etme, sınama, pencere bekleme, uygulama. Varsayılan düzende
  28,94 günün 15,24'ü tek başına fark etmedir ve envanter taraması bunu 0,52 güne indirir.
- Sınama pencereyi 1,16 gün uzatır, karşılığında üretimde geri alınan yamayı 4'ten 1'e düşürür.
- Kesinti sayısı ile açık pencere ters çalışır: aylık pencerede 54 kesinti ve 28,94 gün, gecelikte
  147 kesinti ve 3,09 gün. Doksanıncı günde açık kalem 45'ten 3'e iner.
- Otomatik yama 5,57 gün kazandırır ama on dört yamanın hepsini sınanmadan uygular, geri almayı 4'e
  çıkarır ve 82 fazladan kesinti üretir; sürekli düzen kazancın yüzde 81'ini sınamayı bırakmadan
  verir.
- Yamalanamayan üç kalem — uygulama uyumluluğu, sürekli çalışması gereken servis, tek kopya kuyruk —
  altmış kalemin yüzde 5'i olduğu hâlde açık kalem-gününün yüzde 30,07'sini taşır.
- Kapatmanın getirdiği yeni yüzey on beş kalemdir: yama ajanı, paket kaynağı, envanter kaydı ve
  bakım penceresi; toplam 60'tan 75'e çıkar.

## Sonraki Adım

Bu ders bir varsayımı hiç sınamadı: yama geri alındığında geri dönülecek bir **önceki durumun** var
olduğu. Yamalanamayan kalemlerin çözümü de aynı varsayıma yaslanıyordu. Kurtarma hedefleri
Dayanıklılık Kalıpları kursunda ölçüldü ve burada girdi olarak alınır; sonraki ders hedefleri değil
**yedeğin kendisini** ölçer: üretimdeki kalemlerden kaçı gerçekten yedekleniyor, hangi kalem adıyla
dışarıda kalıyor, sıklık ile veri kaybı penceresi ve saklama ile geriye gidilebilen nokta nerede
kesişiyor. Yedeğin kendisi de bir yüzeydir: kaç kopya, nerede, kim okuyabiliyor.
