Sanal Ve Fiziksel Ram

İşlemci üzerinde tek bir program koştuğunu düşünürsek bu  programın hafıza erişimi ve hafıza kullanımı oldukça kolay. Fakat bir işletim sistemi üzerinde düzinelerce program çalıştığını düşünürsek, aynı hafıza bölümünün bir çok program tarafından verimli bir şekilde kullanılabilmesi işi biraz karmaşıklaştırıyor.  Burada işletim sistemi oldukça önemli bir rol oynuyor tabiki.

Öncelikle birden fazla programın aynı fiziksel hafızayı kullanabilmesi için şu üç problemin çözüme kavuşturulması gerekiyor;

1-) Her bir program için ayrılacak adress bölümlerinin neresi olduğu bilgisi bir yerlerde tutulmalı

2-) Her bir programa ayrılan hafıza bölümü birbirinden yalıtılmalı

3-) Her program için ayrılan bu hafıza bölümleri birbirinden bağımsız olarak fiziksel hafıza alanında göreceli bir adress ve konumda olmalı.  Çünkü bir program için ayrılan hafıza bölümü o program kapatıldığında başka programlar tarafından kullanıma açılması gerekiyor.

İşte bu problemleri çözmek için işletim sistemleri sanal hafıza kullanıyorlar.  Bu sayede her program sanki çalışan tek program olduğunu düşünerek kendisine ayrılan ama gerçek olmayan bir adress uzayında çalışıyor.  Bu yüzden işletim sistemi üzerinde çalışan programların kullandığı tüm adresler aslında gerçek adresler değildir.  32 bit bir işletim sisteminde,  programlar için ayrılan hafıza uzayları 32 bit kelime boyutlarındayken 64 bit işletim sistemlerinde 64 bit kelime boyutlarındadır. İşte 32 bit ve 64 bit işletim sistemleri arasındaki temel fark budur.  Linux işletim sistemi için her programa ayrılan hafıza çerçevesi aşağıdaki gibidir.

 

Bu hafıza çerçevesi aslında sanal bir çerçevedir. Çünkü bu çerçeve fiziksel hafızaya kaydedilirken bölüm bölüm çok farklı adreslere kaydedilebilir.  İşletim sistemi üzerinde çalışan bir uygulama, herhangi belirli bir adresten veri okumak ya da yazmak istediğinde, işletim sisteminin kernelindeki sanal hafıza hizmetine çağrıda bulunur.  Bu hizmet direk olarak fiziksel hafızayı okumaz. Bunun yerine CPU ile RAM arasında çalışan ve MMU(Memory Management Unit) ismindeki donanıma erişir. MMU aslında sanal adreslerin gerçekteki karşılıklarına göre (lookup table) okuyan donanımdır. Doğal olarak gerçekte erişilmek istenen adres işletim sistemi tarafından görülen adresten farklı olduğu için MMU işletim sistemine sanal adresin gerçekteki karşılığını okuyarak yada yazarak geri döner.

Peki tüm bu “lookup table” bilgileri nerede tutuluyor?  Tabiki bu tablolarda fiziksel ram de tutulmaktadır. “lookup table” dediğimiz sanal adreslerin gerçek karşılıkları bilgileri de fiziksel bir  donanıma yazılmaları gerektiği için bu durum aslında oldukça büyük alan ve çok fazla adres sorgulama işlemi demek oluyor. Bu problemi çözmek için fiziksel ram 4 kilobaytlık sayfalara (page)ayrılmıştır.  Bu işlemin avantajı 4 kilobaytlık lookup table için 4000 tane sorgu yapmak yerine sadece ilgili 4K lık sayfa çağrılırsa bu oldukça kullanışlı ve hızlı olmuş oluyor.

Peki lookup table boyutu 4K tutmayıp sayfa ortasına denk gelirse ne olacak?  Bu yüzden 32 bit kelime boylarındaki verilerin ilk 12 bit’i direk fiziksel adrese çevrilirken son 20 biti “page lookup” için kullanılır. Fakat bu kısımdaki operasyonun tam olarak nasıl gerçekleştiğini detaylı olarak bilmiyorum.

Diğer bir problem, MMU’nun ramdaki fiziksel birimi okuması için ramden bir de lookup table bilgisini okuması gerektiği için bir çok erişim sağlamaya çalışması.  Yani bir veriyi okumak için iki kez ram’e erişmek gerekiyor.  Bu sorunu çözmek için CPU mimarları CPU içerisine bir de cache hafıza birimi koyuyorlar.   CPU içerisindeki bu hafıza birimi, yakın zamanda belli bir sayının üzerinde tekrar bakılan lookup table’ları tutuyor. Bu sayede aynı adreslere tekrar tekrar MMU aracılığı ile erişmek yerine birimindeki adreslere direk olarak erişim sağlanmış oluyor. Tabi ki bu da erişim hızını bir hayli  arttırıyor.

Tabiki her zaman MMU ya gönderilen sanal adreslerin gerçekten karşılığının olması gerekmiyor. Bir de karşılığı olmayan sanal adresler sorgulanabilir. Bu durumda karşımıza üç çeşit senaryo çıkıyor.

İlk senaryoda  gerçekten geçerli olmayan bir adrese erişilmeye çalışılıyor olabilir. Bu durumda MMU sanal adresin karşılığını bulamayıp işletim sisteminin kerneline bildirir. Ve işletim sistemi mevcut programın geçerli bir adrese erişmediğini bildirerek programı sonlandırır. Buna ” segmentation fault” diyoruz.

İkinci senaryoda program tarafından tahsis edilmiş bir hafıza bölümünün halen MMU tarafından kullanıma açılmaması durumu söz konusu olabilir. Yani bir program Ram den bölüm tahsis etmek istediğinde bu işlem biraz zaman alıyor. Doğal olarak erişilmek istenilen sanal adres halen daha map edilmiş durumda olmayabilir.  Bu duruma “lazy allocation” deniliyor.

Üçüncü senaryoda ise erişilmek istenen hafıza bölümü daha önceden swap işlemine tabi tutulmuş olabilir. Swap ne demek ondan da bahsetmek gerekiyor tabiki.

Ram dolduğunda, askıya alınmış programların verileri ramden harddiske taşınır. Bu işleme swap işlemi diyoruz.  Erişilmek istenilen hafıza birimi swap edilmişse, hardiskte yazılmış sıkıştırılmış ram bilgileri tekrar ram’e aktarılır ve MMU tekrar programlanarak bu bilgilere erişilir. Tabiki  bu da oldukça yavaş bir işlemdir.

 

 

Önerilen makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Translate »