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.

 

 

Yusuf

Yusuf

Bir Mühendis.

Önerilen makaleler

Bir yanıt yazın

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

Translate »