Bir sürecin kullanabildiği çok temel özkaynaklardan biri bellektir. Sistemlerin belleği düzenlemesi için çok çeşitli yollar olmakla birlikte, genellikle tercih edilen, sıfırdan çok büyük değerlere kadar büyüyebilen adreslerle her sürecin bir doğrusal sanal adres alanına sahip olmasıdır. Onun bir süreklilik içermesi gerekmez; örneğin, bu adreslerin hepsi gerçekte veri saklamak için değildir.
Sanal bellek sayfalara bölünmüştür (genellikle 4 kilobaytlık). Sanal bellekteki her sayfa, bir gerçek bellek sayfası (
çerçeve de denir) veya ikincil bir saklama alanı ya da çoğunlukla disk alanı olarak gerçeklenir. Disk alanı, takas alanı olabileceği gibi sıradan bir disk dosyası da olabilir. Gerçekte, bir sayfa tamamen sıfırlardan oluşabilir ve içinde hiçbir şey bulunmayabilir (bir sayfanın sadece sıfırlardan oluştuğunu belirten bir bayrak vardır).
Gerçek belleğin veya yedekleme alanının bir çerçevesi çok sayıda süreç için çok sayıda sanal sayfayı destekleyebilir. Bu normal bir durumdur. Örneğin, sanal bellek GNU C kütüphanesi tarafından işgal edilebilir. Bu durumda
printf işlevini içeren gerçek bellek sayfası, işlevi kullanan çok sayıda sürecin herbiri için bir sanal bellek sayfası olur.
Bir yazılımın bir sanal sayfanın herhangi bir parçasına erişebilmesi için sayfa ("ilintili") bir gerçek çerçeve tarafından yedeklenir. Ancak gerçekte sanal bellek gerçek bellekten daha büyük olduğundan, sayfalar düzenli olarak, gerçek bellek ile yedekleme deposu arasında ileri ve geri taşınması, bir sürecin onlara erişmesi gerektiğinde gerçek belleğe alınması ve gerek kalmadığında da yedekleme deposuna geri taşınması gerekir. Bu devinime sayfalama denir.
Bir süreç bir sayfaya erişmeye çalışır ve sayfa gerçek belleğe kopyalanamazsa, bu olaya
sayfalama hatası ("page fault") denir. Bir sayfalama hatası oluştuğunda çekirdek süreci askıya alır ve sayfayı bir gerçek sayfa çerçevesine kopyalar. Bu işleme
gerçek belleğe sayfalama ("paging in" or "faulting in") denir. Bu işlemin ardından artık sayfa gerçek bellekte erişilebilir olduğundan çekirdek tarafından askıya alınan süreç işlemine kaldığı yerden devam ettirilir. Aslında, tüm sayfalar sürece daima gerçek bellekteymiş gibi görünür. Bir şey dışında: bir makine dili komutun bekletilme süresi, olsun olsun ancak bir kaç nanosaniye sürer, çünkü çekirdek gerçek belleğe sayfalama işlemini bu kadar kısa sürede tamamlayabilir. Bu işleme duyarlı yazılımlar için kullanılan denetim işlevleri
Sayfaların Kilitlenmesi bölümünde anlatılmıştır.
Her sanal adres alanı içinde, bir süreç hangi adreslerin ne olduğu bilgisine sahiptir ve bu sürece bellek ayırma denir. Ayırma süreci aslında kıt özkaynakları toplayarak kendine ayırır, ancak sanal bellek söz konusu olduğunda ana amaç bu değildir, çünkü orada genellikle herhangi bir ihtiyaca yetecekten fazlası vardır. Bir süreç içindeki bellek ayırma işleminin ana konusu iki farklı şeyin aynı bellek baytlarında olmadığından emin olmaktır.
Süreçler belleği iki farklı yolla ayırır: çalıştırma sırasında ve yazılımsal olarak. Aslında,
çatallama üçüncü bir yol olmakla beraber çok enteresan değildir.
Çalıştırma (exec) bir işlemdir; bir süreç için bir sanal bellek ayırmak, ana yazılımı bu alana yüklemek ve yazılımı çalıştırmaktır. Bu, "exec" ailesi işlevlerle (örn,
execl) yapılır. İşlem bir yazılım dosyası (bir çalıştırılabilir dosya) alır, içindeki tüm verinin yükleneceği alanı ayırır ve yazılımı da yükledikten sonra denetimi yazılıma aktarır. Bu veri çoğunlukla yazılımın komutlarından (
metin) oluşmakla birlikte yazılımdaki dizgeler, sabitler ve hatta bazı değişkenleri de içerir:
durağan saklama sınıfı C değişkenleri.
Bir yazılım çalışmaya başladıktan sonra ek bellek kazanmak için yazılımsal ayırma yapar. GNU C kütüphanesi kullanan bir C yazılımında, iki çeşit yazılımsal ayırma kullanılabilir: özdevinimli (automatic) ve özdevimli (dynamic). Bkz.
C Yazılımlarında Bellek Ayırma.
Bellek eşlemli G/Ç diğer bir özdevimli sanal bellek ayırma şeklidir. Belleğin bir dosyayla eşlenmesi, bir sürecin belli bir adres aralığındaki içeriğinin belirtilen normal bir dosyanın içeriği ile eşdeğerde olacağının bildirilmesidir. Sistem sanal belleğin dosyanın içeriğini içermesini sağlar ve eğer siz bellekte değişiklik yaparsanız sistem aynı değişiklikleri dosyaya yazar. Sanal belleğin çalışması ve sayfalama hatalarının sonuçları itibariyle, yazılım sanal belleğe erişinceye kadar, sistemin dosyayı okumak için G/Ç işlemleri yapması ve ona gerçek bellek ayırması için bir sebep yoktur. Bkz.
Bellek Eşlemli G/Ç.
Belleğin yazılımsal ayrılması gibi yazılım, yazılımsal olarak onu serbest bırakabilir. Çalıştırma işlemi ile ayrılan belleği siz serbest bırakamazsınız. Ancak yazılımın çalışmasını sonlandırırsanız (exit) ona ayrılan tüm belleğin serbest kaldığından söz edilebilir, ancak adres alanı kesintiye uğramadan kalır ki bu nokta gerçekten tartışma götürür. Bkz.
Yazılımın Sonlandırılması.
Bir sürecin adres alanı bölütlere bölünür. Bir
bölüt kesintisiz bir sanal adres aralığıdır. Üç önemli bölüt vardır:
- metin bölütü
Bir yazılımın komutlarını, dizgelerini ve durağan sabitlerini içerir. Çalıştırma işlemi tarafından ayrılır ve yaşamı boyunca aynı boyutta sanal adres alanında kalır.
- veri bölütü
Yazılımın çalışan deposudur. İlk ayırma ve ilk yükleme işlemi çalıştırma işlemi tarafından yapılabilir ve süreç tarafından
Veri Bölütünün Boyunun Değiştirilmesi bölümünde açıklandığı gibi genişletilebilir veya daraltılabilir. Alt ucu sabittir.
- yığıt bölütü
Bir yazılım yığıtı içerir. Bir yığıtın büyüdüğü gibi büyür ama küçüldüğü gibi küçülmez.