Chapter 9: Virtual Memory (Sanal Bellek) Background Kodun yürütülebilmesi için bellekte olması gerekir, ancak programın tamamı nadiren kullanılır Hata kodu, olağandışı rutinler, büyük veri yapıları Tüm program kodu aynı anda gerekli değildir Kısmen yüklenmiş programı yürütme yeteneğini düşünün Program artık fiziksel belleğin sınırlarıyla kısıtlanmıyor Program ve programlar fiziksel bellekten daha büyük olabilir Background Virtual memory – (Sanal bellek) – kullanıcı mantıksal belleğinin fiziksel bellekten ayrılması Günümüzdeki programlar fiziksel hafızanın kapasitesinden daha büyük olabilmektedir. Sanal bellek, programcıların hafıza limitlerinden soyutlanmasını sağlar. Sanal bellek yöntemi, process’lerin tamamının hafızaya yüklenmeden çalıştırılmasına izin verir. Yürütülmesi (execution) için programın yalnızca bir kısmının bellekte olması gerekir Bu nedenle mantıksal adres alanı, fiziksel adres alanından çok daha büyük olabilir. Adres alanlarının birkaç proses tarafından paylaşılmasına izin verir Daha verimli proses oluşturmaya izin verir Aynı anda çalışan daha fazla program İşlemleri yüklemek veya değiştirmek için daha az I/O gerekli Fiziksel ve Sanal Bellek Fiziksel ve Sanal Bellek Sanal bellek adresinin fiziksel bellek adresine dönüştürülmesi Sanal adres alanı Sanal bellekteki heap ve stack alanları dinamik olarak büyüyebilmektedir. Stack ve heap arasındaki büyük boş alan (hole), sanal adres alanının bir parçasıdır, ancak yalnızca yığın veya heap büyürse gerçek fiziksel sayfalar gerektirir. Boşluklar (hole) içeren sanal adres alanları kullanmak faydalıdır çünkü stack veya heap segmentleri büyüdükçe veya program yürütme sırasında kitaplıkları (veya muhtemelen diğer paylaşılan nesneleri) dinamik olarak bağlamak istiyorsak boşluklar doldurulabilir. Sanal Belleği Kullanarak Paylaşılan Kitaplık Sanal bellek, mantıksal belleği fiziksel bellekten ayırmanın yanı sıra, dosyaların ve belleğin sayfa paylaşımı yoluyla iki veya daha fazla process tarafından paylaşılmasına olanak tanır Sistem kütüphaneleri, paylaşılan nesnenin bir sanal adres alanına eşlenmesi yoluyla birkaç işlem tarafından paylaşılabilir. Her process, kütüphaneleri kendi sanal belleklerinin parçası olarak görürler, ancak fiziksel hafızadaki sayfalar paylaştırılır. Process’ler hafızayı paylaşabilir. Sanal bellek, bir process’in hafızada diğer process’lerle paylaşabileceği bölge oluşturmasına izin verir. Sanal bellek, fork() sistem çağrısı ile işlem oluşturma sırasında sayfaların paylaşılmasına izin verebilir, böylece işlem oluşturmayı hızlandırır. DEMAND PAGING Processlere ait sayfaların ihtiyaç olduğunda yüklenmesine demand paging denilmektedir. Yükleme zamanında tüm process belleğe getirebilir veya bir sayfayı yalnızca gerektiğinde belleğe alınır Daha az G/Ç gerekli, Daha az bellek gerekli Daha hızlı yanıt Daha fazla kullanıcı Demand paging ile programın çalışması süresince kullanılmasına gerek olmayan sayfalar fiziksel hafızaya yüklenmez. Demand paging sistemi disk üzerindeki süreçlerin hafızaya swapping ile yüklenmesini gerçekleştirir. Bir process içindeki bir sayfa gerekmedikçe hafızaya yüklenmez. Pager süreç içindeki sayfaların yüklenmesini gerçekleştirir. Sayfaların (page) bitişik disk alanına aktarılması Hafızadaki sayfaların bitişik disk alanına aktarımı Bir process ana belleğe getirildiğinde (swap in), pager geri diske atılana dek (swap out) hangi sayfaların kullanılacağını tahmin eder. Processin tamamını yüklemek yerine, gerekli sayfalar hafızaya yüklenir. Böylece gereken hafıza alanı ve swap süresi azaltılmış olur. Bir sayfanın hafızada mı yoksa diskte mi olduğunu tutmak için donanımsal bir bileşen gerekir. valid ve invalid biti, sayfanın bulunduğu yeri (yani hafızada olup olmadığını) belirlemek için kullanılır. Valid-Invalid Bit Her sayfa tablosu girişi ile bir bit (valid-invalid) ilişkilendirilir (v in-memory, i not-in-memory) Başlangıçta valid-invalid biti, tüm girişlerde i olarak ayarlanır Sayfa tablosu anlık görüntüsü örneği: Frame # valid-invalid bit v v v v i …. i i page table Adres çevirisi sırasında, sayfa tablosu girişindeki valid-invalid bit invalid " i " ise "sayfa hatası" olur. I page fault Bazı Sayfalar Ana Bellekte Olmadığında Sayfa Tablosu Page Fault (Sayfa hatası) Process belleğe alınmamış bir sayfaya erişmeye çalışırsa ne olur? Geçersiz olarak işaretlenmiş bir sayfaya erişim, sayfa hatasına (page fault) neden olur. Sayfalama donanımı, adresi sayfa tablosu aracılığıyla çevirirken, invalid bitin ayarlandığını fark edecek ve işletim sistemine bir trap kurulmasına neden olacaktır. Bu trap, işletim sisteminin istenen sayfayı belleğe getirememesinin sonucudur. Bu sayfa hatasını işleme prosedürü: 1. Referansın geçerli mi yoksa geçersiz bellek erişimi mi olduğunu belirlemek için bu işlem için dahili bir tabloyu (genellikle işlem kontrol bloğu ile tutulur) kontrol ederiz. 2. Referans geçersiz ise işlemi sonlandırıyoruz. Geçerliyse, ancak henüz o sayfayı getirmediysek, şimdi onu sayfaya alıyoruz. 3. Boş bir frame buluruz. İstenen page yeni tahsis edilen frame’i okumak için bir disk işlemi planlıyoruz. 4. 5. Disk okuması tamamlandığında, süreçle birlikte tutulan dahili tabloyu ve sayfa tablosunu sayfanın artık bellekte olduğunu gösterecek şekilde değiştiririz. 6. Trap tarafından kesilen talimatı yeniden başlatıyoruz. İşlem artık sayfaya erişebilir. Sayfa Hatasını Ele Alma Adımları Bir sayfa hatası oluşursa 1. İşletim sistemine trap oluştur 2. Kullanıcı kayıtlarını ve işlem durumunu kaydedin 3. Interrupt’ın (kesinti) bir sayfa hatası olduğunu belirleyin 4. Sayfa referansının uygun olup olmadığını kontrol edin ve sayfanın diskteki konumunu belirleyin 5. Diskten boş bir frame kullanarak okuma yapın: 1. Okuma isteğine hizmet verilene kadar bu cihaz için kuyrukta bekleyin 2. Cihaz arama ve/veya gecikme süresini bekleyin 3. Sayfayı boş bir çerçeveye aktarmaya başlayın 6. Beklerken, CPU'yu başka bir kullanıcıya tahsis edin. 7. Disk G/Ç alt sisteminden bir interrupt alın (G/Ç tamamlandı) 8. Diğer kullanıcı için kayıtları ve işlem durumunu kaydedin 9. Interrupt’ın diskten olduğunu belirleyin 10. Sayfa tablosunu ve diğer tabloları, sayfanın artık bellekte olduğunu gösterecek şekilde düzeltin 11. CPU'nun bu işleme yeniden atanmasını bekleyin 12. Kullanıcı kayıtlarını, işlem durumunu ve yeni sayfa tablosunu geri yükleyin ve ardından kesintiye uğrayan talimata devam edin Demand Paging Performansı Page fault olması durumunda aşağıdaki temel 3 işlem yapılır: Page fault interrupt başlatılması Sayfanın okunup hafızaya aktarılması Process’in restart edilmesi Page Fault oranı 0 p 1 Eğer p = 0 Page fault yok Eğer p = 1 her referans bir page fault Effective Access Time (Efektif erişim süresi - EAT) EAT = (1 – p) x memory access + p (page fault overhead + swap page out + swap page in ) Demand Paging Memory access time = 200 nanoseconds Average page-fault service time = 8 milliseconds Effective Access time (EAT) = (1 – p) x 200 + p (8 milliseconds) = (1 – p ) x 200 + p x 8,000,000 = 200 + p x 7,999,800 If one access out of 1,000 causes a page fault, then EAT = 8.2 microseconds. This is a slowdown by a factor of 40!! If want performance degradation < 10 percent 220 > 200 + 7,999,800 x p 20 > 7,999,800 x p p < .0000025 < one page fault in every 400,000 memory accesses COPY-ON-WRITE fork() sistem çağrısının, ebeveyninin kopyası olan bir child süreç oluşturduğunu hatırlayın. Geleneksel olarak, fork(), parent’a ait sayfaları çoğaltarak, child için parent’ın adres alanının bir kopyasını oluşturarak çalıştı. Ancak, birçok child proses oluşturulduktan hemen sonra exec() sistem çağrısını çağırdığı düşünüldüğünde, ebeveynin adres alanının kopyalanması gereksiz olabilir. Bunun yerine, parent ve child proseslerin başlangıçta aynı sayfaları paylaşmasına izin vererek çalışan, Copy-on-Write (COW) olarak bilinen bir teknik kullanabiliriz. Bu paylaşılan sayfalar, yazıldığında kopyalanabilen sayfalar olarak işaretlenir, yani her iki işlem de paylaşılan bir sayfaya yazarsa, paylaşılan sayfanın bir kopyası oluşturulur. Process1 page C'yi Değiştirmeden Önce Process1 page C'yi Değiştirdikten Sonra PAGE REPLACEMENT Her sayfa ilk çağrıldığında bir kez page fault oluşur. Bir process 10 sayfadan oluşuyorsa, çalışması sırasında genellikle yarısını kullanır. Bu yüzden, demand paging I/O gereksinimini azaltır. Multiprogramming ile daha çok process’i çalıştırabiliriz (over-allocating). Process’lerden bazıları tüm sayfaları kullanmak isteyebilir. İşletim sistemi yeni sayfa için mevcut sayfalardan birisini swap out yapabilir (page replacement). Page Replacement Temel page replacement algoritması Eğer boş frame yoksa şu anda kullanılmayan bir frame seçilir ve swap out (disk swap space’e yazılır) yapılır. Swap out yapılan frame için page table invalid yapılır. İstenen sayfa disk üzerinde bulunur. Boş frame varsa, bu frame kullanılır. Boş frame yoksa, page-replacement algoritması ile bir frame seçilerek kullanılır. Seçilen frame disk’e yazılır ve page table değiştirilir. Disk’ten istenen sayfa okunarak bu frame’e yazılır ve page table değiştirilir. Page fault olan process çalışmaya devem eder. Temel page replacement algoritması 1. Diskte istenen sayfanın konumunu bulun 2. Boş bir frame bulun: - Boş bir frame varsa onu kullanın - Boş frame yoksa, bir kurban (victim) çerçevesi seçmek için bir sayfa değiştirme algoritması kullanın - Kurban seçilen frame’i diske yazın, page ve frame tablolarını güncelleyin. 3. 4. İstenilen page’i (yeni) boş frame’e getirin; page ve frame tablolarını güncelleyin Tuzağa (trap) neden olan talimatı yeniden başlatarak işleme devam edin Page Replacement Sayfa Hatalarının Çerçeve Sayısına Göre Grafiği Page ve Frame Değiştirme Algoritmaları Frame-allocation algoritması Her işleme kaç frame verileceğine ve Hangi frame değişeceğine karar verir. Page-replacement algorithm Hem ilk erişimde hem de yeniden erişimde en düşük page fault oranını ister Algoritmayı, belirli bir bellek referansları dizisinde (referans dizisi) çalıştırarak ve bu dizideki page fault hesaplayarak değerlendirin. (Dizi, tam adresler değil, yalnızca sayfa numaralarıdır) Aynı sayfaya tekrar tekrar erişim, sayfa hatasına neden olmaz Örneklerde kullanılacak referans dizi 7,0,1,2,0,3,0,4,2,3,0,3,0,3,2,1,2,0,1,7,0,1 First-In-First-Out (FIFO) Algoritması Referans Dizi: 7,0,1,2,0,3,0,4,2,3,0,3,0,3,2,1,2,0,1,7,0,1 3 frame (Process başına hafızada aynı anda 3 page bulunabilir) 15 page faults Belady Anamolasini Gösteren FIFO reference string: 1,2,3,4,1,2,5,1,2,3,4,5 Optimal Algoritması Uzun süre kullanılmayacak sayfayı değiştirin Bunu bilmek mümkün mü ? Least Recently Used (LRU) Algoritması Gelecekten ziyade geçmiş bilgileri kullanın Uzun süredir kullanılmayan sayfayı değiştirin Son kullanım zamanını her sayfayla ilişkilendirin 12 faults LRU Algorithm (Cont.) Counter implementation Her sayfa girişinin bir sayacı vardır; bu giriş aracılığıyla sayfaya her başvuru yapıldığında, saati sayaca kopyalayın Bir sayfanın değiştirilmesi gerektiğinde, en küçük değeri bulmak için sayaçlara bakın. Gerekli tabloda arama yapın Stack implementation Sayfa numaralarından oluşan bir yığını double link formunda tutun: Referans verilen sayfa: En üste taşı 6 işaretçinin değiştirilmesini gerektirir Ancak güncellemeler maliyetlidir. Değiştirmek için aramaya gerek yok LRU ve OPT, Belady Anomalisine sahip olmayan yığın algoritmalarının örnekleridir Sayfa Referanslarını Kaydetmek İçin Yığın Kullanımı