Her program, kendine ait bir bellek dünyasında yaşar sanır: sıfırdan başlayan, sonsuza yakın görünen adres uzayı. Bu, işletim sisteminin en zarif yanılsamasıdır. Sanal bellek, her sürece kendi adres uzayını sunar; gerçekte ise fiziksel belleğin üzerine sanal adreslerin tercüme edildiği bir tablo düzenidir. Bu tercüme tablosunu anlamak, bellek sızıntısından takas fırtınasına kadar birçok problemin köküne inmek demektir.

Sayfa ve Sayfa Tablosu

Sanal bellek, adresleri sabit boyutlu bloklara, yani sayfalara böler. Çoğu sistemde sayfa dört kilobayttır; modern işlemciler büyük sayfaları da destekler. İşletim sistemi, her sanal sayfanın hangi fiziksel çerçeveye karşılık geldiğini sayfa tablosunda tutar. İşlemci, her bellek erişiminde donanımsal bir yardımcıyla bu tabloya bakar; tercüme her erişimde yapıldığı için hız kritiktir ve sonuç önbelleğe alınır.

// Sanal adresin yapısı (4 KB sayfa, 48 bit adres için basitleştirilmiş)
sanal_adres = [ sayfa_numarasi | sayfa_icinde_sapma ]
fiziksel     = tablo[sayfa_numarasi].cerceve * SAYFA_BOYUTU
             + sapma;

Sayfa tablosu yalnız tercüme değildir; her kayıt, okuma-yazma-çalıştırma izinlerini ve erişim geçmişini de taşır. Yazmaya korumalı bir sayfaya yazmak, segmentasyon hatası üretir; kod bölümünü çalıştıramayan programın aldığı sinyal buradan gelir.

Sayfa Hatası: Planlı Bir Kesinti

Sanal bir sayfanın fiziksel karşılığı her zaman bellekte değildir. Program henüz dokunmadığı bir sayfaya eriştiğinde, işletim sistemi diskten veriyi okuyup sayfayı yerleştirir; buna küçük sayfa hatası denir. Sayfa hiç diskte yoksa ve adres geçersizse, hatadan koruma sinyali doğar. Sayfa hatası normaldir; ama sıklığı, uygulamanızın gerçek performans hikâyesini anlatır. Bölge yerelliği iyi olmayan bir veri yapısı, işlemciyi sürekli tabloya danışmaya ve sayfa değişimine zorlar.

Takas Alanı: Belleğin Uzantısı mı, Sigortası mı

Fiziksel bellek dolduğunda işletim sistemi, en az kullanılan sayfaları takas alanına taşır. Takas, bellek boyutunun ötesine geçme imkânıdır ama bedeli acıdır: disk, bellekten yüzlerce kat yavaştır. Sayfa fırtınası dediğimiz durumda sistem, sayfayı diske yazar, hemen geri çağırır, tekrar yazar; işlemci zamanının çoğu taşımaya gider, her şey donar gibi yavaşlar. Sunucularda bu davranış, uyarı sistemlerinin en kritik eşiklerinden biridir.

Takas, iyi ayarlanmış bir sistemde sigortadır: neredeyse hiç kullanılmaz ama vardır. Masaüstünde az kullanılan sayfaların sakin sakin taşınması sorun değildir; sorun, belleğin sürekli doyduğu ve taşmanın süreklileştiği noktadır. Konteyner çağında bu denge yeni bir boyut kazandı: kapsül bellek sınırları, takasın kapatılmasıyla birlikte verildiğinde bellek baskısı, sayfa fırtınası yerine doğrudan süre sonlandırmasıyla sonuçlanır. Yani " bellek dolduğu için yavaşladı" ile "bellek dolduğu için öldü" arasında, sistem yöneticisinin tercihi vardır. Uygulama tarafında davranış değişmez: çalışma kümeniz fiziksel belleğe sığmıyorsa, işlemciden alacağınız hız, diske ödediğiniz bedelle telafi edilir. Bu yüzden veri tabanları ve önbellek sunucuları, takas etkileşimine karşı özel ayarlarla çalıştırılır.

Sanal bellek, programcı ile donanım arasındaki en kalın soyutlama katmanıdır ve en güzeli: her sürece kendi dünyasını verirken, fiziksel kaynakları herkesin görmediği bir merkezi akılla yönetir. Sayfa tablosu ve takas mekanizmasını anladığınızda, yavaşlamanın ve çökmelerin çoğunun gizli anlatısını okumaya başlarsınız.