Sanal bellek ile fiziksel bellek arasındaki farklar nelerdir?


103

İşletim sistemlerinde sanallaştırma kavramıyla sık sık kafam karışıyor. RAM'i fiziksel bellek olarak düşünürsek, bir işlemi yürütmek için neden sanal belleğe ihtiyacımız var?

Harici sabit sürücüdeki işlem (program) yürütme için ana belleğe (fiziksel bellek) getirildiğinde bu sanal bellek nerede durur?

Sanal belleğe kim bakar ve sanal belleğin boyutu nedir?

RAM boyutunun 4GB (yani 2 ^ 32-1 adres boşluğu) olduğunu varsayın, sanal belleğin boyutu nedir?


2
Ya 512MB’ye sahipseniz ve 4GB’ı adreslemeniz gerekiyorsa?
Oded

programın sadece gerekli kısmı ana hafızaya getirilir.Yanılıyorsam lütfen düzeltin.Teşekkürler ..
starkk92

3
"Sanal hafıza", fili inceleyen kör adamlara benzer. Herkesin farklı bir izlenimi olacaktır.
Hot Licks

2
Derinlemesine bir cevap isteyebilecekleriniz için, bu cevabı kontrol ettiğinizden emin olun .
RickyA

Yanıtlar:


86

Sanal bellek, diğer şeylerin yanı sıra, programcıya sistemlerinde sonsuz belleğin mevcut olduğu yanılsamasını veren bir soyutlamadır.

Gerçek fiziksel adreslere karşılık gelecek şekilde sanal bellek eşlemeleri yapılır. işletim sistemi oluşturur ve bu eşlemeleriyle fırsatlar - diğer veri yapıları arasında sayfa tablo kullanan eşleştirmeleri korumak için. Sanal bellek eşlemeleri her zaman sayfa tablosunda veya bazı benzer veri yapılarında bulunur (sanal belleğin diğer uygulamaları durumunda, belki ona "sayfa tablosu" dememeliyiz). Sayfa tablosu fiziksel bellekte de bulunur - genellikle kullanıcı programlarının üzerine yazamayacağı çekirdek tarafından ayrılmış alanlarda.

Sanal bellek tipik olarak fiziksel bellekten daha büyüktür - sanal bellek ve fiziksel bellek aynı boyutta olsaydı, sanal bellek eşlemeleri için çok fazla neden olmazdı.

Bir programın sadece gerekli kısmı bellekte bulunur, tipik olarak bu "sayfalama" adı verilen bir konudur. Sanal bellek ve sayfalama birbiriyle yakından ilişkilidir, ancak aynı konu değildir . Segmentasyon gibi başka sanal bellek uygulamaları da vardır.

Burada yanlış varsayıyor olabilirim, ama bahse girerim başınızı sarmada zorlandığınız şeyler, büyük olasılıkla sayfalama gibi özel sanal bellek uygulamalarıyla ilgilidir. Sayfalamayı yapmanın tek bir yolu yoktur - birçok uygulama vardır ve ders kitabınızda anlatılanlar muhtemelen Linux / Windows gibi gerçek işletim sistemlerinde görünenle aynı değildir - muhtemelen ince farklılıklar vardır.

Sayfalamayla ilgili bin paragraf yazabilirim ... ama bence bu, özellikle bu konuyu hedefleyen farklı bir soruya bırakılması daha iyi.


4
Sanal belleğin ve fiziksel belleğin aynı boyutta olmasının nedenleri vardır. VM, farklı işlemlerin kendi adres alanlarına sahip olmasına izin verir. Bu, bir işlemin verilerinin başka bir işlem tarafından üzerine yazılmasını önler. Ayrıca, farklı adres alanlarına farklı izinler vermenize izin verir, böylece sistemin bazı kullanıcıları diğerlerinden daha yüksek okuma / yazma ayrıcalıklarına sahip olabilir. Yine de aynı miktarda sanal belleğe ve fiziksel belleğe sahip olmak, VM'nin depolama avantajlarını ortadan kaldırır.
almel

1
Almel'in yorumuna eklemek için: Fiziksel bellekten daha küçük veya aynı boyutta bir sanal bellek olsa bile: güvenlik ve kararlılık avantajlarının yanı sıra, birden çok 32-bit program, aksi takdirde çalışamayacak olan tümünü bellekte çalıştırabilir (örn. 64-bit sistem), fiziksel bellek, parçalanmayla ilgili bazı sorunları önlemek için daha iyi yönetilebilir, şeffaf yazma üzerine kopyalama teknikleri VM gerektirir, vb ...
Kaganar

2
Sanal belleğin hiçbir şekilde "sonsuz" olmadığını ve böyle bir tasarımın bu tür yanılsamalara ilham verme niyetinde olmadığını iyi unutmayın. AMD64 mimarisi şu anda 48-bit sanal belleğin adreslenmesine izin veriyor ( AMD APM Cilt 2. sayfa 120 ) Kullanım durumları değişiklik gösterse de, önemli bir avantajın, adres alanının çok daha büyük, bitişik işlemlerini ayırma yeteneği olduğu öne sürülebilir. fiziksel alanda genellikle mümkün olabilir. Bu ayrılmış aralık daha sonra talep üzerine yapılır ve bu, bağlantılı yapılara olan ihtiyacı ve yeniden tahsisatı ortadan kaldırabilir.
awdz9nld

Bu tür şeyler hakkında okuyabileceğim bir kitap var mı, örneğin sanal bellek, onun düzeni, ayrıntılı olarak sayfalama tekniği hakkında? Tüm bunların temellerini nereden öğrenebilirim?
Su Soğutucu v2

@ WaterCoolerv2 Umakishore Ramachandran'ın "Bilgisayar Sistemleri: Mimari ve İşletim Sistemlerine Bütünleşik Bir Yaklaşım" adlı kitabının bir parçasıyım. Bu bir ders kitabı, ancak bence oldukça kapsamlı ve işletim sistemleri hakkındaki diğer kitaplarla karşılaştırıldığında her şeyi iyi açıklıyor. Ama gerçekten, işletim sistemleri konusundaki herhangi bir kitap büyük olasılıkla sayfalama, sanal bellek vb.
Konularını ele alacak

88

Yazılımlar, işletim sistemi üzerinde çok basit bir temelde çalışır - bellek gerektirirler. Cihaz işletim sistemi bunu RAM biçiminde sağlar. Gereken bellek miktarı değişebilir - bazı yazılımlar çok büyük belleğe ihtiyaç duyar, bazıları ise önemsiz bellek gerektirir. Çoğu (hepsi değilse de) kullanıcılar aynı anda işletim sistemi üzerinde birden fazla uygulama çalıştırır ve belleğin pahalı olduğu (ve cihaz boyutunun sınırlı olduğu) göz önüne alındığında, kullanılabilir bellek miktarı her zaman sınırlıdır. Bu nedenle, tüm yazılımların belirli miktarda RAM gerektirdiği ve hepsinin aynı anda çalışacak şekilde yapılabildiği düşünüldüğünde, işletim sisteminin iki şeyi halletmesi gerekir:

  1. Yazılımın kullanıcı tarafından durdurulana kadar her zaman çalıştığı, yani işletim sisteminin belleği bittiği için otomatik olarak iptal etmemelidir.
  2. Yukarıdaki faaliyet, çalışan yazılımlar için saygın bir performans sürdürürken.

Şimdi asıl soru hafızanın nasıl yönetildiğine bağlı. Belirli bir yazılıma ait verilerin hafızada nerede bulunacağını tam olarak ne yönetir?

Olası çözüm 1 : Ayrı yazılımların, aygıtta kullanacakları bellek adresini açıkça belirtmesine izin verin. Varsayalım Photoshop her zaman değişen bellek adreslerini kullanacak beyan 0etmek 1023(yani ilk bayt yerdedir, bayt doğrusal bir dizi olarak hafızayı hayal 0, 1024inci bayt yerdedir 1023) - yani işgal 1 GBbellek. Benzer şekilde, VLC bellek aralığını işgal edeceğini beyan eder 1244.1876 vs.

Avantajlar:

  1. Her uygulamaya bir bellek yuvası önceden atanmıştır, bu nedenle kurulduğunda ve yürütüldüğünde, yalnızca verilerini o bellek alanında depolar ve her şey düzgün çalışır.

Dezavantajları:

  1. Bu ölçeklenmez. Teorik olarak, bir uygulama gerçekten ağır bir şey yaparken büyük miktarda bellek gerektirebilir. Bu nedenle, belleğin asla tükenmemesini sağlamak için, kendisine ayrılan bellek alanı her zaman bu bellek miktarından fazla veya ona eşit olmalıdır. Ya maksimum teorik bellek kullanımı olan 2 GB(dolayısıyla 2 GBRAM'den bellek ayırmayı gerektiren) bir yazılım, yalnızca 1 GBbelleğe sahip bir makineye kurulursa? Yazılım başlangıçta, mevcut RAM'in daha az olduğunu söyleyerek iptal mi etmelidir 2 GB? Ya da devam etmeli ve gerekli hafıza aşıldığı anda 2 GB, sadece yeterli hafıza olmadığı mesajıyla iptal edip kurtarmalı mı?

  2. Hafıza karışıklığını önlemek mümkün değildir. Piyasada milyonlarca yazılım var, her biri sadece 1 kBbellek tahsis edilmiş olsa bile , gereken toplam bellek aşılacak 16 GB, bu da çoğu cihazın sunduğundan daha fazla. Öyleyse, farklı yazılımlara birbirlerinin alanlarına tecavüz etmeyen bellek yuvaları nasıl tahsis edilebilir? Birincisi, yeni bir yazılım piyasaya sürüldüğünde, kendisine bu kadar bellek ataması gerektiğini düzenleyebilecek merkezi bir yazılım pazarı yoktur. bu henüz kullanılmayan alandanve ikincisi, olsa bile, bunu yapmak mümkün değil çünkü hayır. Yazılımların sayısı pratik olarak sonsuzdur (dolayısıyla hepsini barındırmak için sonsuz bellek gerektirir) ve herhangi bir cihazda mevcut olan toplam RAM, gerekenin bir kısmını bile barındırmak için yeterli değildir, bu nedenle bir yazılımın bellek sınırlarının aşılmasını kaçınılmaz kılar. bir başkasının üzerine. Peki ne olur Photoshop bellek konumlarını atanır 1için 1023ve VLC atanır 1000için 1676? Ya Photoshop bazı verileri yerinde saklarsa1008 , VLC kendi verileriyle bunun üzerine yazar ve daha sonra Photoshopdaha önce depolanan verilerin aynı olduğunu düşünerek erişir mi? Tahmin edebileceğiniz gibi kötü şeyler olacak.

Açıkça, gördüğünüz gibi, bu fikir oldukça saf.

Olası çözüm 2 : Başka bir şema deneyelim - işletim sisteminin bellek yönetiminin çoğunu yapacağı yer. Yazılımlar, herhangi bir belleğe ihtiyaç duyduklarında, sadece işletim sistemini talep edecek ve işletim sistemi buna göre uyum sağlayacaktır. Diyelim ki işletim sistemi, yeni bir işlem bellek talebinde bulunduğunda, belleği mümkün olan en düşük bayt adresinden tahsis etmesini sağlar (daha önce de belirtildiği gibi, RAM doğrusal bir bayt dizisi olarak düşünülebilir, bu nedenle bir 4 GBRAM için adres aralığı dan bayt 0için2^32-1) eğer süreç başlıyorsa, aksi takdirde hafızayı isteyen çalışan bir süreçse, o işlemin hala bulunduğu son hafıza konumundan ayıracaktır. Yazılımlar, verilerin depolandığı gerçek bellek adresinin ne olacağı dikkate alınmadan adresler yayınlayacağından, işletim sistemi, yazılım tarafından gönderilen adresin gerçek fiziksel adresle yazılım başına bir eşlemesini sürdürmek zorunda kalacaktır (Not: Bu kavram olarak adlandırmamızın iki nedeninden biri Virtual Memorybudur.Yazılımlar, verilerinin depolandığı gerçek bellek adresini önemsemezler, sadece adresleri anında tükürürler ve işletim sistemi buna uyacak doğru yeri bulur ve bulur. gerekirse daha sonra).

Cihazın yeni açıldığını, işletim sisteminin yeni başlatıldığını, şu anda çalışan başka bir işlem olmadığını (işletim sistemini görmezden gelerek, ki bu da bir süreçtir!) Ve VLC'yi başlatmaya karar verdiğinizi varsayalım . Böylece VLC , en düşük bayt adreslerinden RAM'in bir bölümünü tahsis eder. İyi. Şimdi video çalışırken, bir web sayfasını görüntülemek için tarayıcınızı başlatmanız gerekir. O zaman Not Defteri'ni başlatmanız gerekir metin karalamak . Ve sonra Eclipse biraz kodlama yapacak .. Kısa süre sonra belleğiniz 4 GBtamamen tükenecek ve RAM şuna benziyor:

                                   görüntü açıklamasını buraya girin

Sorun 1: Artık RAM'in tamamı tükendiği için başka bir işlemi başlatamazsınız. Bu nedenle programlar, kullanılabilir maksimum bellek akılda tutularak yazılmalıdır (diğer yazılımlar da paralel olarak çalışacağından, pratik olarak daha azı mevcut olacaktır!). Başka bir deyişle, harap 1 GBPC'nizde yüksek bellek tüketen bir uygulama çalıştıramazsınız .

Tamam, şimdi Eclipse'i artık tutmanıza gerek olmadığına karar veriyorsunuz ve Chrome'u açık , biraz bellek boşaltmak için onları kapatıyorsunuz. Bu işlemlerin RAM'de kapladığı alan işletim sistemi tarafından geri kazanılır ve şu anda şuna benzer:

                                    görüntü açıklamasını buraya girin

Bu ikisini kapatmanın 700 MBboş alan - ( 400+ 300) MB olduğunu varsayalım . Şimdi yer kaplayacak olan Opera'yı başlatmanız gerekiyor 450 MB. Pekala, 450 MBtoplamda fazla yeriniz var , ama ... bu bitişik değil, tek tek parçalara bölünmüş, hiçbiri sığacak kadar büyük değil 450 MB. Böylece parlak bir fikre ulaşırsınız, aşağıdaki tüm süreçleri olabildiğince üstüne taşıyalım, bu da 700 MBboş alanı altta bir yığın halinde bırakacaktır . Bu denircompaction . Harika, bunun dışında ... oradaki tüm işlemler çalışıyor. Bunları taşımak, tüm içeriklerinin adresinin taşınması anlamına gelecektir (unutmayın, işletim sistemi, yazılım tarafından tükenen belleğin gerçek bellek adresine eşlenmesini sağlar. Yazılımın bir adresi 45veriyle birlikte tükürdüğünü 123ve işletim sisteminin bunu yerinde sakladığını düşünün. 2012ve bir harita girişi eşleme yarattı 45için 2012. yazılım artık bellekte taşınırsa ne yerde eskiden2012 artık olacak 2012, ama yeni bir konumda ve OS haritaya harita uygun güncellemek için vardır 45için yeni adres, böylece yazılım 123bellek konumunu sorguladığında beklenen verileri ( ) alabilir.Yazılım 45söz konusu olduğunda, tek bildiği bu adres45verileri içerir123!)! Yerel bir değişkeni referans alan bir süreci hayal edini. Tekrar erişildiğinde adresi değişmiştir ve bir daha bulamayacaktır. Aynı şey tüm işlevler, nesneler, değişkenler için geçerli olacaktır, temelde her şeyin bir adresi vardır ve bir işlemi taşımak, hepsinin adresini değiştirmek anlamına gelecektir. Bu da bizi şunlara götürür:

Sorun 2: Bir işlemi taşıyamazsınız. Bu süreçteki tüm değişkenlerin, işlevlerin ve nesnelerin değerleri, derleme sırasında derleyici tarafından dışarı atıldığı için kodlanmış değerlere sahiptir, işlem onların ömrü boyunca aynı yerde olmalarına bağlıdır ve bunları değiştirmek pahalıdır. Sonuç olarak, süreçler geride büyük bırakıyor "holes çıktıklarında " kalırlar. Buna denir External Fragmentation.

İnce. Farz edin ki, mucizevi bir şekilde, süreçleri yukarı taşımayı başardınız. Şimdi 700 MBaltta boş alan var :

                        görüntü açıklamasını buraya girin

Opera , alt kısma rahatça sığar. Şimdi RAM'iniz şöyle görünüyor:

                                    görüntü açıklamasını buraya girin

İyi. Herşey yolunda görünüyor. Ancak, fazla yer kalmadı ve şimdi Chrome'u yeniden başlatmanız gerekiyor , bilinen bir bellek domuzu! Başlamak için çok fazla belleğe ihtiyacı var ve neredeyse hiç kalmamışsınız ... Bunun dışında .. şimdi fark ettiniz ki, başlangıçta geniş alan kaplayan bazı süreçler, şimdi fazla alana ihtiyaç duymuyor. Videonuzu VLC'de durdurmuş olabilirsiniz , bu nedenle hala biraz yer kaplıyor, ancak yüksek çözünürlüklü bir video çalıştırırken gerektiği kadar değil. Benzer şekilde Not Defteri ve Fotoğraflar için . RAM'iniz artık şöyle görünüyor:

                                        görüntü açıklamasını buraya girin

Holes, bir kere daha! Silbaştan! Daha önce, süreçlerin sona ermesi nedeniyle oluşan delikler dışında, şimdi eskisinden daha az alan gerektiren süreçler nedeniyle! Ve yine aynı soruna sahipsin,holes kombine ihtiyaç duyulandan daha fazla alan sağlar, ancak etrafa dağılmışlardır, tek başlarına pek kullanılmazlar. Dolayısıyla, bu süreçleri tekrar hareket ettirmelisiniz, pahalı bir işlem ve çok sık bir işlem, çünkü süreçler ömürleri boyunca boyut olarak sık sık küçülecektir.

Problem 3: Süreçler, ömürleri boyunca boyut olarak küçülebilir ve geride kullanılmayan alan bırakabilir; bu, kullanılması gerekirse, birçok işlemin pahalı bir şekilde taşınmasını gerektirecektir. Bu denir Internal Fragmentation .

Tamam, şimdi, işletim sisteminiz gerekli olan şeyi yapıyor, işlemleri hareket ettiriyor ve Chrome'u başlatıyor ve bir süre sonra RAM'iniz şöyle görünüyor:

görüntü açıklamasını buraya girin

Güzel. Şimdi yine İzlemeye devam varsayalım Avatar de VLC . Hafıza ihtiyacı artacak! Ancak ... Not Defteri alt kısmına sarıldığı için büyümesi için yer kalmadı . Yani, yine, tüm süreçler VLC yeterli alan bulana kadar aşağıya hareket etmelidir !

Problem 4: Süreçlerin büyümesi gerekiyorsa çok pahalı bir işlem olacaktır

İnce. Şimdi, bazı fotoğrafları harici bir sabit diskten yüklemek için Fotoğraflar'ın kullanıldığını varsayalım . Sabit diske erişim sizi önbellek ve RAM alanından, büyüklük sırasına göre daha yavaş olan disk alanına götürür. Acı verici, geri dönülmez bir şekilde, aşkın bir şekilde daha yavaş. Bu bir G / Ç işlemidir, yani CPU'ya bağlı değildir (tam tersi), yani şu anda RAM'i işgal etmesine gerek yoktur. Ancak yine de inatla RAM'i işgal ediyor. Bu arada Firefox'u başlatmak isterseniz , bunu yapamazsınız, çünkü çok fazla bellek yoktur, oysa Fotoğraflar , I / O bağlantılı etkinliği süresince bellekten çekilirse, çok fazla bellek serbest bırakılırdı. ardından (pahalı) sıkıştırma ve ardından Firefox uydurma.

Sorun 5: G / Ç bağlantılı işler RAM'i işgal etmeye devam eder ve bu arada CPU'ya bağlı işler tarafından kullanılmış olabilecek RAM'in yetersiz kullanımına yol açar.

Gördüğümüz gibi, sanal bellek yaklaşımında bile pek çok sorunumuz var.


Bu sorunları çözmek için iki yaklaşım vardır - pagingve segmentation. Hadi tartışalım paging. Bu yaklaşımda, bir işlemin sanal adres alanı, parçalar halinde fiziksel bellekle eşlenir - adı verilir pages. Tipik bir pageboyut 4 kB. Haritalama, page tablesanal bir adres verilen a adı verilen bir şey tarafından sürdürülür , şimdi tek yapmamız gereken page, adresin hangisine ait olduğunu bulmak , daha sonra, gerçek fiziksel bellekte page tablebuna karşılık gelen konumu bulmak page(olarak bilinir frame) ve içindeki sanal adresin ofsetinin hem pageiçin pagehem de için aynı olduğunu, framebu ofseti tarafından döndürülen adrese ekleyerek gerçek adresi bulun page table. Örneğin:

görüntü açıklamasını buraya girin

Solda bir işlemin sanal adres alanı var. Diyelim ki sanal adres alanı 40 birim bellek gerektiriyor. Fiziksel adres alanı da (sağda) 40 birim belleğe sahip olsaydı, tüm konumu soldan sağdaki bir konuma eşlemek mümkün olurdu ve çok mutlu olurduk. Ama talihsizlik olduğu gibi, fiziksel bellekte daha az (burada 24) kullanılabilir bellek birimi bulunmamakta, aynı zamanda birden çok işlem arasında paylaşılmalıdır! İyi, nasıl idare edeceğimize bir bakalım.

İşlem başladığında, konum için bir bellek erişim talebinin 35yapıldığını söyleyin . Burada sayfa boyutu 8(her biri konumları pageiçerir, 8konumların tüm sanal adres alanı 40bu nedenle 5sayfaları içerir ). Yani bu konum sayfa no. 4( 35/8). Bunun içinde page, bu konumun ofseti 3( 35%8) vardır. Yani bu konum tuple (pageIndex, offset)= ile belirtilebilir (4,3). Bu sadece başlangıç, dolayısıyla sürecin hiçbir parçası henüz gerçek fiziksel bellekte depolanmadı. Böylece, page tablesoldaki sayfaların sağdaki gerçek sayfalara (bu sayfalaraframes ) şu anda boş. Böylece, işletim sistemi CPU'dan vazgeçer, bir aygıt sürücüsünün diske erişmesine ve sayfa numarasını almasına izin verir.4Bu süreçte (adresler arasında değişir diskteki programdan temelde bir bellek yığın için 32için 39). Geldiğinde, işletim sistemi sayfayı RAM'de bir yere tahsis eder, örneğin ilk çerçevenin kendisini ve page tablebu işlem için sayfanın RAM'deki 4çerçeveye eşlendiğini not eder 0. Artık veriler nihayet fiziksel bellekte bulunmaktadır. OS, başlık için sayfa tablosunu tekrar sorgular (4,3)ve bu sefer, sayfa tablosu, sayfanın RAM'deki 4çerçeveye zaten eşlendiğini söyler 0. Yani işletim sistemi basitçe 0RAM'deki th çerçeveye gider , verilere 3bu çerçevede ofsette erişir (Bunu anlamak için bir dakikanızı ayırın.pagediskten getirilen, konumuna taşınır frame. Dolayısıyla, bir sayfadaki tek bir bellek konumunun ofseti ne olursa olsun, çerçevede de aynı olacaktır, çünkü page/ içinde framebellek birimi göreceli olarak aynı yerde kalır!) Ve verileri döndürür! Veriler ilk sorgunun kendisinde bellekte bulunmadığından, daha ziyade belleğe yüklenmek üzere diskten getirilmesi gerektiğinden, bir eksiklik oluşturur .

İnce. Şimdi, konum için bir hafıza erişiminin 28yapıldığını varsayalım . Kaynar (3,4). Page tableşu anda tek bir giriş var, sayfayı 4çerçeveye eşliyor 0. Yani bu yine bir özlüyor , süreç CPU'dan vazgeçiyor, aygıt sürücüsü sayfayı diskten alıyor, süreç CPU'nun kontrolünü yeniden kazanıyor ve page tablegüncelleniyor. Şimdi sayfanın RAM'deki 3çerçeveye eşlendiğini söyleyin 1. Böylece (3,4)olur (1,4)ve RAM'deki o konumdaki veriler döndürülür. İyi. Bu şekilde, bir sonraki bellek erişiminin konumuna 8çevrilen konum için olduğunu varsayalım (1,0). Sayfa 1henüz hafızada değil, aynı prosedür tekrarlanıyor vepage çerçeve içinde tahsis ediliyor2RAM'de. Şimdi RAM-süreci haritalaması yukarıdaki resimdeki gibi görünüyor. Bu noktada, sadece 24 adet kullanılabilir hafızaya sahip olan RAM doldu. Bu işlem için bir sonraki bellek erişim talebinin adresten olduğunu varsayalım 30. Sayfayla eşleşir (3,6)ve page tableo sayfanın 3RAM'de olduğunu söyler ve çerçeveyle eşleşir 1. Yaşasın! Böylece veriler RAM konumundan alınır (1,6)ve döndürülür. Bu , gerekli veriler doğrudan RAM'den elde edilebildiğinden ve dolayısıyla çok hızlı olduğundan bir isabet oluşturur . Benzer şekilde, önümüzdeki birkaç erişim istekleri, yerler için demek 11, 32, 26, 27hepsi hit işlem tarafından istenen veri başka bir yere bakmak gerek kalmadan RAM doğrudan bulunursa yani.

Şimdi konum için bir hafıza erişim talebinin 3geldiğini varsayalım . Bu çevirir (0,3)ve page tableşu anda sayfalar için 3 girdileri vardır bu süreç için 1, 3ve 4bu sayfayı hafızasında olmadığını söylüyor. Önceki durumlarda olduğu gibi, diskten getirilir, ancak önceki durumlardan farklı olarak RAM doludur! Peki şimdi ne yapmalı? Burada sanal belleğin güzelliği yatıyor, RAM'den bir çerçeve çıkarılıyor! (Hangi çerçevenin çıkarılacağını çeşitli faktörler belirler. LRUBir süreç için en son erişilen çerçevenin nerede çıkarılacağına dayanabilir. En first-come-first-evicteduzun zaman önce tahsis edilen çerçevenin boşaltıldığı, vb . Temel olabilir. .) Yani bazı çerçeveler çıkarılır. Çerçeve 1'i söyleyin (sadece rastgele seçerek). Ancak, bu framebazılarına eşlenmiştirpage! (Şu anda, sayfa tablosu ile 3tek ve tek sürecimizin sayfasına eşlenmiştir ). Öyleyse bu sürece bu trajik haberi anlatmak gerekiyor frame, talihsiz olanın size ait olduğu, başka birine yer açmak için RAM'den çıkarılacak pages. Süreç, page tablebu bilgilerle güncellemesini , yani o sayfa-çerçeve ikilisinin girişini kaldırmasını sağlamalıdır , böylece bir dahaki sefere bunun için bir istek yapıldığında page, sürece bunun pageartık bellekte olmadığını söyler. ve diskten getirilmesi gerekir. İyi. Böylece çerçeve 1çıkarılır, sayfa 0getirilir ve oraya RAM'e yerleştirilir ve sayfa girişi3 kaldırılır ve sayfa yerine 0aynı çerçeveye haritalama1. Şimdi eşlememiz şöyle görünüyor ( framesağ taraftaki ikinci renk değişikliğine dikkat edin ):

görüntü açıklamasını buraya girin

Az önce ne olduğunu gördün mü? Sürecin büyümesi gerekiyordu, mevcut RAM'den daha fazla alana ihtiyaç duyuyordu, ancak RAM'deki her işlemin büyüyen bir süreci barındırmak için hareket etmesi gereken önceki senaryomuzun aksine, burada sadece bir pagedeğişimle gerçekleşti! Bu, bir işlem için belleğin artık bitişik olması gerekmemesi, yığınlar halinde farklı yerlerde bulunabilmesi, OS'nin nerede olduklarına dair bilgileri tutması ve gerektiğinde uygun şekilde sorgulanmaları gerçeğiyle mümkün olmuştur. Not: Düşünüyor olabilirsiniz, huh, ya çoğu zaman a missise ve verilerin sürekli olarak diskten belleğe yüklenmesi gerekiyorsa? Evet, teorik olarak mümkün, ancak çoğu derleyici aşağıdaki şekilde tasarlandılocality of referenceBazı hafıza konumundan veriler kullanılıyorsa, yani gerekli sonraki veri belki aynı mesafede, çok yakın bir yerde yer alacak page, pagesadece belleğe yüklenmiştir. Sonuç olarak, bir sonraki eksiklik epey bir süre sonra gerçekleşecek, yaklaşan bellek gereksinimlerinin çoğu yeni getirilen sayfa veya son zamanlarda kullanılan zaten bellekte olan sayfalar tarafından karşılanacaktır. Tam olarak aynı ilke, bir pagesüredir kullanılmayanın bir süre kullanılmayacağı mantığıyla, en az kullanılanı da ortadan kaldırmamızı sağlar. Ancak, her zaman böyle değildir ve istisnai durumlarda, evet, performans düşebilir. Daha sonra hakkında daha fazlası.

Sorun 4'ün Çözümü: Süreçler artık kolayca büyüyebilir, eğer alan sorunu yaşanırsa, gereken tek şey pagebaşka bir işlemi hareket ettirmeden basit bir değişim yapmaktır .


Sorun 1'in Çözümü: Bir işlem sınırsız belleğe erişebilir. Mevcut olandan daha fazla belleğe ihtiyaç duyulduğunda, disk yedekleme olarak kullanılır, gerekli yeni veriler diskten belleğe yüklenir ve en son kullanılan veriler frame(veya page) diske taşınır. Bu sonsuza kadar devam edebilir ve disk alanı ucuz ve neredeyse sınırsız olduğu için sınırsız bellek yanılsaması verir. İsmin başka bir nedeni Virtual Memory, size gerçekten mevcut olmayan bir hafıza yanılsaması veriyor!

Güzel. Daha önce, bir sürecin boyut olarak küçülmesine rağmen boş alanın diğer süreçler tarafından geri kazanılmasının zor olduğu bir sorunla karşı karşıyaydık (çünkü maliyetli sıkıştırma gerektirecekti). Artık, bir işlemin boyutu küçüldüğünde , çoğu pagesartık kullanılmamaktadır, bu nedenle diğer işlemler daha fazla belleğe ihtiyaç duyduğunda, basit LRUtabanlı bir tahliye daha az kullanılanları otomatik olarak RAM'den çıkarır pagesve bunları yeni sayfalarla değiştirir. diğer süreçler (ve tabii ki page tablestüm bu süreçlerin yanı sıra şimdi daha az yer gerektiren orijinal sürecin güncellenmesi ), tüm bunlar herhangi bir maliyetli sıkıştırma işlemi olmadan!

Problem 3'ün Çözümü: İşlemlerin boyutu küçüldüğünde, framesRAM'de daha az kullanılır, bu nedenle basit bir LRUtemel tahliye, bu sayfaları çıkarabilir ve pagesyeni işlemlerin gerektirdiği şekilde değiştirebilir , böylece Internal Fragmentationgerek kalmadan önlenir compaction.

Problem 2'ye gelince, bunu anlamak için bir dakikanızı ayırın, senaryonun kendisi tamamen kaldırıldı! Yeni bir süreci barındırmak için bir süreci taşımaya gerek yoktur, çünkü artık tüm sürecin bir kerede sığması gerekmez, yalnızca belirli sayfalarının geçici olarak sığması gerekir, bu framesRAM'den çıkarılır . Her şey birimlerinde gerçekleşir pages, dolayısıyla şimdiye dair bir kavram yoktur holeve dolayısıyla hareket eden herhangi bir şey söz konusu değildir! pagesBu yeni gereklilik nedeniyle 10 Mayıs'ın taşınması gerekti, bunlardan binlercesi pagesdokunulmadan kaldı. Oysa daha önce, tüm süreçlerin (her bir parçasının) taşınması gerekiyordu!

Problem 2'nin Çözümü: Yeni bir süreci barındırmak için, diğer süreçlerin yalnızca daha az kullanılan kısımlarından gelen verilerin gerektiği gibi çıkarılması gerekir ve bu, adı verilen sabit boyutlu birimlerde gerçekleşir pages. Bu nedenle , bu sistemle holeveya External Fragmentationbu sistemle mümkün değildir.

Artık sürecin bir miktar G / Ç işlemi yapması gerektiğinde, işlemciyi kolayca bırakabilir! İşletim sistemi, RAM'in tamamını RAM'den çıkarır pages(belki bir miktar önbellekte saklar), bu arada yeni işlemler RAM'i işgal eder. G / Ç işlemi tamamlandığında, işletim sistemi bunları basitçe pagesRAM'e geri yükler (tabii ki pagesdiğer işlemlerden bazılarını değiştirerek, orijinal işlemin yerini alanlardan olabilir veya kendilerinin G / Ç yapması gereken bazılarından olabilir) O şimdi ve dolayısıyla hafızadan vazgeçebilir!)

Problem 5'in Çözümü: Bir işlem G / Ç işlemleri yaparken, diğer işlemler tarafından kullanılabilen RAM kullanımından kolayca vazgeçebilir. Bu, RAM'in uygun şekilde kullanılmasına yol açar.

Ve elbette, artık hiçbir işlem doğrudan RAM'e erişmiyor. Her işlem, fiziksel bir RAM adresiyle eşleştirilen ve page-tablebu işlem tarafından korunan bir sanal bellek konumuna erişir . Eşleştirme, işletim sistemi desteklidir, işletim sistemi, işlemin hangi çerçevenin boş olduğunu bilmesini sağlar, böylece oraya bir işlem için yeni bir sayfa yerleştirilebilir. Bu bellek tahsisi, işletim sisteminin kendisi tarafından denetlendiğinden, RAM'den yalnızca boş kareler ayırarak veya RAM'deki başka bir işlemin içeriğine tecavüz ettiğinde başka bir işlemin içeriğine hiçbir işlemin zarar vermemesini kolayca sağlayabilir. güncellemek için page-table.

Orijinal Sorunun Çözümü: Bir sürecin başka bir işlemin içeriğine erişme olasılığı yoktur, çünkü tüm ayırma işletim sisteminin kendisi tarafından yönetilir ve her işlem kendi korumalı alana sahip sanal adres alanında çalışır.

Yani paging(diğer tekniklerin yanı sıra), sanal bellekle bağlantılı olarak, günümüzün işletim sistemleri üzerinde çalışan yazılımlarına güç veren şey budur! Bu, yazılım geliştiricisini, kullanıcının cihazında ne kadar bellek bulunduğu, verilerin nerede saklanacağı, diğer işlemlerin yazılım verilerini bozmasını nasıl önleyeceği vb. Gibi konularda endişelenmekten kurtarır. Ancak, elbette, tam kanıt değildir. Kusurlar var:

  1. Pagingnihayetinde diski ikincil yedekleme olarak kullanarak kullanıcıya sonsuz bellek yanılsaması verir. İkincil depolamadan belleğe sığdırmak için verilerin alınması (çağrılır page swapve RAM'de istenen sayfanın bulunmaması durumu çağrılır page fault) bir IO işlemi olduğundan pahalıdır. Bu, süreci yavaşlatır. Bu tür birkaç sayfa değiş tokuşu art arda gerçekleşir ve süreç acı verici bir şekilde yavaşlar. Hiç yazılımınızın düzgün ve düzgün çalıştığını gördünüz mü ve aniden o kadar yavaşlıyor ki neredeyse takılıyor veya yeniden başlatma seçeneğiniz kalmıyor mu? Muhtemelen çok fazla sayfa değiş tokuşu oluyordu, bu da işi yavaşlatıyordu (çağrılıyordu thrashing).

Öyleyse OP'ye geri dönersek,

Bir işlemi yürütmek için neden sanal belleğe ihtiyacımız var? - Yanıtın uzun uzadıya açıkladığı gibi, yazılımlara sonsuz belleğe sahip cihaz / işletim sistemi yanılsamasını vermek, böylelikle büyük veya küçük herhangi bir yazılım, bellek ayırma veya verileri bozan diğer işlemler hakkında endişelenmeden çalıştırılabilir. paralel çalışıyor. Çeşitli tekniklerle pratikte uygulanan bir kavramdır ve bunlardan biri burada anlatıldığı gibi Sayfalama'dır . Segmentasyon da olabilir .

Harici sabit sürücüdeki işlem (program), yürütme için ana belleğe (fiziksel bellek) getirildiğinde bu sanal bellek nerede duruyor? - Sanal bellek kendi başına hiçbir yerde durmaz, bir soyutlamadır, her zaman mevcuttur, yazılım / süreç / program başlatıldığında, onun için yeni bir sayfa tablosu oluşturulur ve bununla tükenen adreslerden eşlemeyi içerir. RAM'deki gerçek fiziksel adrese işlem. Sürecin tükürdüğü adresler gerçek adresler olmadıklarından, bir anlamda bunlar aslında sizin söyleyebileceğiniz şeylerdir the virtual memory.

Sanal belleğe kim bakar ve sanal belleğin boyutu nedir? - İşletim sistemi ve yazılım ile birlikte ilgilenir. Kodunuzda, yerel bir değişken - bir int i. Kod yürütüldüğünde, iişlev yığını içinde bir bellek adresi alır. Bu işlevin kendisi başka bir yerde bir nesne olarak saklanır. Bu adresler derleyici oluşturulur (kodunuzu çalıştırılabilir olarak derleyen derleyici) - sanal adresler. Yürütüldüğünde, ien azından bu işlevin süresi boyunca gerçek fiziksel adreste bir yerde kalması gerekir (statik bir değişken olmadığı sürece!), Böylece işletim sistemi, derleyicinin oluşturduğu sanal adresi eşler.igerçek bir fiziksel adrese aktarır, böylece bu işlev içinde bazı kodların değerini gerektirdiğinde, iişlem bu sanal adres için işletim sistemini sorgulayabilir ve işletim sistemi de depolanan değer için fiziksel adresi sorgulayabilir ve geri döndürebilir.

RAM boyutunun 4GB (yani 2 ^ 32-1 adres boşluğu) olduğunu varsayın, sanal belleğin boyutu nedir? - RAM'in boyutu, sanal belleğin boyutuyla ilgili değildir, işletim sistemine bağlıdır. Örneğin 32 bit Windows'ta, 16 TB64 bit Windows'ta öyle 256 TB. Tabii ki, disk boyutuyla da sınırlıdır, çünkü belleğin yedeklendiği yer burasıdır.


2
Bu, sanal makine / sayfalamanın harika, derinlemesine bir açıklamasıdır (bir yerde bir blog yazısı olmalıdır). Sanal makine eşleme / sayfalama işleminin kafamı karıştıran bir kısmı, her sayfa hatası veya takas için hala (görünüşte) çok fazla disk erişimi gerektirmesidir. Her sayfa değişiyor mu (sanal makineden diske ve tersi) diske okuma / yazma çağrısı yapıyor mu? Bu bana çok büyük bir ek yük gibi görünüyor.
Aroic

@TMartin evet, sayfa pagefile.sys'ye yazılmıştır ve biri sayfa dosyası içinde bir dizide depolanan PFN için olmak üzere 2 yazma olduğuna inanıyorum. LRU algoritması, her işlem çalışma kümesinden (en eski yaş) en az erişilen PTE'nin sayfasının çoğunlukla bekleme listesine gönderilmesini ve sonunda sayfaların çıkarılmasını sağlar, böylece sayfa çoktan önce diske yazılmıştır. tekrar erişilir, böylece sadece arka planda olur. Ayrıca, şeylerin büyük şemasında nispeten nadir görülen bir olaydır; çoğu sayfa hatası umarım yumuşak olur.
Lewis Kelsey

Bekleme listesi de kendi başına bir öncelik sistemine sahiptir ve sıfır ve boş liste boş olduğunda, en düşük öncelikli bekleme sayfalarını çağırmaya başlayacaktır. Önceliğin neye dayandığından emin değilim, ancak önceki LRU yaşına karşılık gelebilir
Lewis Kelsey

16

Utanmazca üst man sayfasından alıntıları kopyalıyorum

VIRT - Sanal Görüntü (kb) Görev tarafından kullanılan toplam sanal bellek miktarı. Tüm kodu, verileri ve paylaşılan kitaplıkları, ayrıca takas edilmiş sayfaları ve haritalanmış ancak kullanılmayan sayfaları içerir.

SWAP - Değiştirilen boyut (kb) Yerleşik olmayan ancak bir görevde bulunan bellek. Bu, değiştirilen hafızadır ancak ilave yerleşik olmayan hafıza içerebilir. Bu sütun, fiziksel belleğin sanal bellekten çıkarılmasıyla hesaplanır.


5

Buraya bakın: Physical Vs Virtual Memory

Sanal bellek sabit sürücüde depolanır ve RAM dolduğunda kullanılır. Fiziksel bellek, bilgisayara takılı RAM yongalarının boyutuyla sınırlıdır. Sanal bellek, sabit sürücünün boyutuyla sınırlıdır, bu nedenle sanal belleğin daha fazla depolama kapasitesi vardır.


Sanal bellek, takas dosyasının / bölümünün içindeki sabit sürücüde depolanıyor mu?
BruceJohnJennerLawso

3
@BruceJohnJennerLawso: hayır, sanal = takas + fiziksel
RickyA

@RickyA, sanal> = fiziksel ile her zaman anlaşın.
hastrb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.