Yazan: Şadi Evren ŞEKER

Sanal bellek olarak da isimlendirilen hafıza türü, bilgisayarın birincil hafızası (primary memory) olarak bilinen RAM‘in yetersiz kaldığı durumlarda ikincil hafıza (secondary memory) olarak bilinen diskin bir kısmının kullanılmasıdır.

Unix/Linux terminolojisine göre takas alanı (Swap space) olarak isimlendirilen bu hafızada RAM ve disk arasında bulundurlan bilgiler sürekli olarak takaslanmaktadır (swapping).

Kısacası işlemlerin çalışmak için ihtiyaç duydukları Bellek kapasitesinin üzerindeki talepler için disk kullanılır ve çalışan programların eriştikleri veriler anlık olarak RAM’de durmalıdır. Yani şayet yer yetersizliğinden dolayı bir bilgi diske taşınmışsa ve bu bilgiye tekrar erişilmek istenirse, bu bilgi diskten RAM’e geri yüklenmelidir.

Bu yükleme işlemi tahmin edileceği üzere oldukça zaman almaktadır çünkü diske erişim, RAM’e erişime göre oldukça yavaştır. Ayrıca diske iki kere bilgi yazılmalıdır. Bu algoritma aşağıdaki şekilde özetlenebilir:

sayfadegis

Yukarıdaki akış diyagramında (flow chart) gösterilen algoritmaya göre şayet veri RAM’de bulunmuyorsa hem yer açmak için RAM’den bir veri diske yüklenmeli hem de diskte RAM’e talep edilen veri yüklenmelidir.

Sanal belleğin kullanılabilemesi için işlemlerin kıtalama (Segmentation) veya Sayfalama (Paging) ile hafızada tutulmaları gerekir. Bunun sebebi mantıksal adreslerin fiziksel adreslere dönüşüm olanağıdır. Ayrıca sayfalama (paging) ile hafızada tutulan işlem verilerinin parçalı olarak da disk ve RAM arasında takaslanması mümkündür.

Örneğin Window işletim sistemi üzerinde paging (sayfalama) kullanılarak disk üzerinde bir dosya oluşturulur ve işlem verileri buraya atılır.

image004

Yukarıda bilgisayarın diskinde bulunan dosyaların listesi verilmiştir. Bu listenin en sonunda pagefile.sys ismi verilen dosyanın amacı sayfalama verilerinin sonucunda işlemlerin bir kısmının diskte tutulmasıdır.

Diskte bu işlem için ayrılan miktar windows’un gelişmiş ayarlarından ayarlanabilir:

sanalbellek

Görüldüğü üzere Windows random Access olan bir hafıza alanını ardışık (Sequential) erişimi olan disk üzerinde tek bir dosya olarak tutması çeşitli problemlere yol açabilmektedir. Örneğin bu dosya üzerinde fragmentation (parçalanma) olabilir. Yani çalışan ve ölen işlemler zaman içinde dosyada boşluklar oluşturmakta bu durumda performans kaybına sebep olmaktadır. Bunun için bu dosyanın defrgament edilmesini de içeren bir takım yöntemler geliştirilmiştir. Ancak hafıza yoðun işlemlerde performans artışını sağlayan en kesin yöntem fiziksel hafızanın arttırılmasıdır.

Sanal belleğin kapatılması için yukarıdaki şekilde görülen ekran kullanılabilir veya Swappingin tamamen kapatýlmasý için :

Linux sistemlerde /proc/sys/vm/swappiness parametresinin deðiþmesi

Windowsta ise DisablePagingExecutive registry ayarının değiştirilmesi mümkündür.

Yorumlar

  1. nicat

    Hocam tesekkur ederim guzel anlatim olmush.Ama anlamadigim bir sey var.
    Simdi ben bir buffere sonsuz sayda veri yazarsam program crash olucakmi?
    Eyer boyle bir sey olursa peki o zaman pagefile niye kullaniliyor?

    1. Şadi Evren ŞEKER

      evet program çakılır. Ancak senaryo şöyle işler. Öncelikle programın hafızada (RAM) kapladığı alan dolar (bu aşamaya kadar disk ile ilgili bir problem yok) ardından hafıza dolmaya başladıkça işletim sistemi yavaş yavaş diski hafızaya alternatif olarak kullanmaya başlar. Zamanla diskin üzerinde ayrılan alan (virtual memory) de dolmaya başlar (yani sizin pagefile dosyası için ayırdığınız maximum alan) ve sonunda işletim sistemi hafıza yetersiz anlamında hata vererek ilgili problem çözme algoritmasını çalıştırır. Burada işletim sistemi tasarımına göre farklılıklar olabilir. Örneğin bazı işletim sistemleri (windows gibi) öncelikle kullanıcıyı programın çok fazla hafıza kullanıyor olması ile ilgili uyararak kapatmasını istiyor. Bazı işletim sistemleri programın çalışmasını bir süreliğine duraklatıyor ve sistemde başka bir kaynak ayrımından dolayı problem olmasını engellemeye çalışıyor. Bazı işletim sistemleri ise her program için bir limit belirleyerek bu limitin üzerindeki hafıza taleplerini geri çeviriyor (bu durumda sizin problemi kendi programınız içerisinde çözmeniz gerekiyor, örneğin java kodlarını çalıştıran JVM bu şekilde çalışmaktadır).

  2. nicat

    Hocam Oncelikle cevap verdiyiniz icin cox tesekkur ederim Ben Azerbaycandan yaziyorum.Cok guzel ve gercekten cok lazimli bir site yaratmissiniz.Bende ugrasiyorum ve gercekten terminler cok onemli.Ve burdada bana uygun her termine rast geldim.Oncelikle bunun icin cox tesekkur ederim.Boyle devam edin.
    Sonraki sorum boyle olucak ben aslinda Virtual memory hakkinda burda okudukdan sonra C dilinde ufak tefek test icin programlar olusturdum.
    Simdi burda statik ve dynamik alan ayirma konusunda farkliliklar varmi.Yani ben

    char buffer[100000] = {''};
    int i = 0;
    for (k;k<100000;k++){
           buffer[i] = (char)i;
    };
    

    Ve bu programi calistirkta program crash oluyor zaten yukarida soruyu bu kodddan sonra yazdim.
    Yani pagefile rama alternativ olarak kullaniliyor ise niye ben bundan yararlanmiyorum.
    Ve sonra aklima diyer bi bir alan ayirma konusu geldi.Ve dusundum belki Windows pagefile i yalniz dinamik olarak kullaniyor.Yani malloc(Heap sistemi) yardimi ile?

  3. nicat

    Yukaridaki kodda yalnislik oldu.

    char buffer[100000] = {''};
    int i = 0;
    for (k;k<100000;k++){
       buffer[i] = (char)41;
    };
    
  4. Şadi Evren ŞEKER

    Sorunuzda geçen kavramlar işletim sistemi tasarımı ile ilgili çok sayıda konuyu ilgilendiriyor. Tavsiyem aşağıdaki konulara bir bakmanız. Yine de anlaşılmıyorsa buradan sorabilirsiniz.

    http://bilgisayarkavramlari.sadievrenseker.com/2008/12/03/hafiza-yonetimi-memory-management/
    http://bilgisayarkavramlari.sadievrenseker.com/2009/05/31/sayfalama-paging/
    http://bilgisayarkavramlari.sadievrenseker.com/2009/05/29/sayfa-degistirme-algoritmasi-page-replacement/
    http://bilgisayarkavramlari.sadievrenseker.com/2007/04/14/dyanmic-scoping-dinamik-alan-degiþkenleri/
    http://bilgisayarkavramlari.sadievrenseker.com/2009/05/24/sabit-hareketli-ve-yigit-degiskenleri-staticdynamic-heap-variables/

    Gerçek örneğe gelince, gerçek durumdaki problemler için ortam önemlidir. Yani hangi işletim sistemi ile çalıştığınız, hangi derleyiciyi kullandığınız, bunların tasarım detayları vs. önem taşır. Şayet teorik olarak değil, pratikte cevap arıyorsanız kullandığınız işletim sisteminin tasarım detaylarını araştırmanız gerekir. Ne yazık ki bu sitede teorik konulara ancak yer verebiliyorum o yüzden uygulama detaylarına ilgili ürünün üreticisinden ulaşınız.

  5. Nicat

    Tamam.
    Yinede hizli bir cevap verdiyiniz icin tesekkur ederim.Zaten sitenizi dun buldum ve her konuya ayri ayrilikta goz gezdiriyorum.

  6. Halil

    Hocam bilgiler için çok teşekkürler. Gerçekten açıklayıcı olmuş. Derste anlatmıştı hoca 2 hafta falan fakat anlamamışım, burada mantığını anladım. Allah razı olsun.

nicat için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir