Sanal bellek aslında bellek alanını nasıl arttırıyor?


70

Sanal belleğin, gerçekte olduğundan daha fazla bellek göstererek programı kandırdığını biliyorum.

Fakat sonuçta mantıksal adresi fiilen fiziksel adresle eşleştirmek zorundadır. Şimdi hafızayı nasıl arttırıyor?


12
Bu eski kavram. Sanal bellek için orijinal motivasyon, fiziksel bellekten daha büyük bir adres alanı sağlamak için bir bellek yönetimi biçimidir. Ancak bu hafızanın düşük yoğunluklu ve çok pahalı olduğu zamandı. Günümüzde sanal bellek kullanmanın birincil nedeni işlem güvenliği içindir.
talaş

2
“Şimdi belleği nasıl arttırıyor?”. Öyle değil. Uygulama, sistemin fiziksel hafızasının farkında değil, yalnızca sanal hafızanın farkındadır; bu, bir uygulamanın yeterli hafızanın bulunmadığından şikayet etmesinin sanal hafızadan bahsettiğinden ve fiziksel hafızadan
bahsetmediğinden

2
Sanal bellek sistemlerinin oldukça akıllı olduğunu unutmayın. N süreçleri aynı salt okunur sayfaya sahipse, tüm n süreçleri aynı tek sayfa fiziksel belleği kullanabilir.
Eric Lippert

65
Sanal belleği hiçbir şeyi kandırmak gibi düşünmeyin . Hafıza, veri saklama ve geri alma yeteneğidir . Sanal bellek bu soyutlama için bir uygulama sağlar. Bu soyutlamanın bir kısmının RAM tarafından, bazılarının da disk tarafından desteklenmesi, soyutlamanın bir uygulama detayıdır.
Eric Lippert

4
@HagenvonEitzen Belleğin diskte "her zaman" nasıl olduğundan emin değil ... orijinal olarak diskten okunan sayfaların yanı sıra, bir sayfa değiştirilmediği sürece, içeriği hiçbir zaman diskte olmayabilir ve bu özellikle bellekte sabitlenmiş sayfalar için geçerlidir. çekirdek işlevselliği için kritik olmasından dolayı.
Michael

Yanıtlar:


116

Fiziksel belleği hiç arttırmıyor . Amacı tamamen başka bir şey. Yapabilecekleri, programların fiziksel olarak mevcut olandan daha fazla bellek kullanmasını sağlayan diğer destek mağazalarını kullanıma açmak.

Sanal bellek, işlemleri birbirinden ayırmak ve izole etmek için kullanılır ve ayrıca belleğin alternatif konumlara yönlendirilmesine izin verir.

Sanal bellek, sistemin tüm işlemlere diğer işlemlerden izole edilen kendi bellek alanını vermesini sağlar. Kendi alanlarında etkin bir şekilde çalışan programlarla, aynı zamanda "aynı" adresleri kullanması gerekebilecek diğer programlar üzerinde çalışmak zorunda kalmak yerine, tüm adres alanına tam erişim sağlar. Bu, işlemlerin birbirleriyle kolayca karışamayacağı için güvenilirliği ve güvenliği artırmanın yan etkisine sahiptir.

Bir uygulamanın sanal bellek alanı gerektiği gibi oluşturulmuştur. Bir uygulama (kendisine) tek bir bitişik hafıza bloğunda görünüyor, ancak fiziksel hafızaya tamamen dağılmış olabilir.

Sanal bellek ayrıca takas dosyası gibi özellikleri kullanmamızı sağlayan bellek erişimlerinin yakalanmasını ve yönlendirilmesini sağlar. Bunun anlamı, yakın zamanda kullanılmayan bellek parçalarını diske itip, "bu bellek bloğu y konumunda x dosyasında" yazan bir işaretçi kurabiliriz ve sonra fiziksel belleği serbest bırakabiliriz. başka bir uygulama tarafından kullanılacak alan. Bir uygulama bu belleğe ihtiyaç duyduğunda, diskten yeniden okunabilir, fiziksel RAM'in bir yerine yerleştirilebilir (potansiyel olarak daha öncekinden farklı olabilir) ve daha önce olduğu gibi sanal belleğin bulunduğu yere yeniden eşlenebilir.

Sayfa dosyasının kullanıldığı şekilde sanal bellek, işletim sisteminin bir program için paylaşılan kitaplıkların etkin bir şekilde "tembel" yüklenmesini de sağlar. Ana program işletim sistemine belirli bir kütüphaneyi kullanmak istediğini söylediğinde, işletim sistemi kütüphanenin gereksinimlerini kontrol ederek, uygulama için sanal bellek alanında yer ayırarak, kütüphanenin tamamını yüklemek yerine zaman kazanabilir kitaplıkta sayfaların yüklenmesini, gerçekte ihtiyaç duyulana kadar diskten erteleyebilir. Bu şekilde, kütüphaneye RAM'e yüklenen tek bölüm, program tarafından gerçekten kullanılan bölümlerdir, asla kullanılmayan bölümler asla yüklenmez ve bu nedenle RAM israfı yapmaz.

Bu teknikleri kullanarak, sistemin kararlılığını arttırır ve daha fazla işlemin birbirlerini haksız yere etkilemeden kapalı bir alanda çalışmasına izin veririz. “Belleği arttırmaz”, ancak bunun yerine sahip olduklarımızı daha etkin kullanmamızı sağlar.

Takas dosyası sanal bellek sistemleri olarak etkindir, ancak geçmişte olduğu gibi karıştı olmanın sanal bellek.


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Sathyajith Bhat

21

Layman'ın açıklaması

Sistem, bu sanal bellek kullanıldığında her sanal adresi fiziksel adresle eşlemek zorunda kalacak, ancak tüm bellekler aynı anda kullanılmayacaktır . Örneğin, tarayıcınızda her biri 1 GB bellek alan 20 sekme olduğunu varsayalım. Sanal bellek desteği olmayan işletim sistemlerinde, bunun çalışması için 20GB RAM gerekir. İşin püf noktası, 20 sekmenin tümüne aynı anda göz atmamanız, bu nedenle sanal belleğe sahip işletim sistemi tarayıcınızı, yalnızca birkaç GB RAM’de kullanmanıza olanak tanıyacak ve etkin olmayan sekmeleri diske yerleştirecek.

Daha karmaşık yönler

Sanal bellek, sadece takas amacıyla kullanılmaz. Asıl amacı, sanal bellek yönetimi olmayan sistemlerde büyük bir sorun olan RAM parçalanmasından kaçınmaktır: 1GB RAM ücretsiz olabilir, ancak 10 MB boyutunda gelirse, 100 MB isteyen bir uygulama çalışamaz .

Zamanla, sanal bellek, özellikle rasgele dosya erişimi olan daha da fazla kullanım alanı buldu: veritabanları gibi birçok uygulama, dosyaları sırayla okumak zorunda kalırlarsa, ve işletim sistemi tüm dosyanın içinde bulunduğu gibi davranmasına izin veriyorsa, çok daha hızlı çalışırlar (sanal olarak) ) disk GÇ'sini bellek ve optimize etme ve erişim modellerine göre önbelleğe alma.


9
Her tarayıcı sekmesinin 1GB bellek gerektirdiği bir dünyada yaşıyor olmamız üzücü
17:17

9
@tbodt Eski Mısırlıları suçluyorum. Keşke o sinir bozucu kedileri evcilleştirerek ne yaptıklarını bilselerdi!
Dmitry Grigoryev

@tbodt Bu da biraz abartı. 8 sekme açık olan tarayıcım yalnızca 500 MB bellek alıyor.
Random832

2
@ Random832 Elbette abartı, abartı ve geleceğe dönük olma arasındaki çizgiden emin değilim. İlk bilgisayarım 32 MB RAM'e sahipti ve Opera'da 8 sekmeyi farkedilir şekilde değiştirmeden kolayca açabiliyordum. Şimdi 500 MB alıyor, bu yüzden başka bir 20 yılda 8GB'ye ulaşabilir.
Dmitry Grigoryev,

5

Sanal bellek, aslında daha fazla ana bellek donanımı ekleme anlamında belleği artırmaz. Ancak kullanılabilir adres aralığını artırabilir . Böylece, bir kod bölümü ve bir veri (yığın ve öbek) bölümünden oluşan çalışan bir program olabilir ve bunların her ikisi de fiziksel olarak gerçek depolama alanı tarafından sağlanan fiziksel adres aralığından daha büyük bir dizi sanal adres alabilir . makinesi. İşin püf noktası, bu sanal adreslerin yalnızca küçük bir bölümünün her an fiziksel ana bellek tarafından desteklenmesidir (ancak her şey sonuçta disk depolama alanı tarafından desteklenir) . Bu referans yerellik olgusu nedeniyle çalışır: Herhangi bir anda, program bölümünün bir veya daha fazla küçük bitişik bölümündeki talimatlar yürütülür ve yalnızca veri bölümünün bir veya daha fazla küçük bitişik bölümündeki veriler çalıştırılır [tabii ki davranış aslında daha karmaşıktır. , ancak zamanın büyük bir bölümü için bu modeli takip ediyor]


4

Sanal belleğin, gerçekte olduğundan daha fazla bellek göstererek programı kandırdığını biliyorum.

Sanal bellek için orijinal motivasyon, fiziksel bellekten daha büyük bir adres alanı sağlamak için bir bellek yönetimi biçimidir.
Yazılım, takılan gerçek fiziksel bellek bu sayının yalnızca bir kısmıyken CPU'nun tam adres alanını kullanabilir (örn. 2 ^ 32 adres alanı).
Büyük (büyük) bellek gereksinimlerini empoze etmeden sanal bellek kullanan bilgisayarlar arasında büyük programlar taşınabilir.
Sanal belleğin bu kullanımı ana bilgisayar ve ferrit çekirdek hafızasının (fiziksel ve pahalı olduğu düşük) yapıldı.

Fakat sonuçta mantıksal adresi fiilen fiziksel adresle eşleştirmek zorundadır. Şimdi hafızayı nasıl arttırıyor?

Sanal bellek, program için daha fazla adres alanı sağlamak için sadece bir teknikten gelişmiştir.
Sanal bellek, modern işletim sistemlerinde her bir sürece güvenlik sağlamada kilit bir bileşendir, böylece bir işlem başka bir işlemle etkileşime giremez, başka bir işlemden ödün verilmez.
Ancak sanal işlemcili çok işlemeli (çok işlemcili veya orkuyla karıştırmayın ) sistem için fiziksel bellekten daha belirgin bir bellek sağlar.

Oluşturulan her işlem kendi sanal adres alanına, yani kendi sanal belleğine sahiptir.
Her bir işlem için gerçekte kullanılan (ve sanal belleğe eşlenen) fiziksel bellek miktarı dinamiktir. Genellikle, yalnızca kodu içeren kod (aka metin) ve işlemin yürütülmesini sağlayan veri sayfaları / bölümleri fiziksel belleğe eşleştirilir (aka bellekte bulunur).

Gereksiz kod (şu anda yürütülmediğinden) ve verilerin (başvuruda bulunmadığından / işlenmediğinden) her zaman bellekte yerleşik olması gerekmez. Kod ve / veya veri sayfaları / bölümleri destek deposuna "takılabilir" (örneğin bir HDD veya SSD'de yer değiştirme alanı veya sayfa dosyası) ve daha sonra gerektiğinde "geri istendiğinde" "değiştirilebilir (geri") ).

Sanal bellek, sonlu fiziksel belleğin, her biri kendi korumalı sanal adres alanına sahip sayısız işlem arasında verimli bir şekilde kullanılmasını sağlar. Bu sanal hafızaların toplamı tipik olarak kurulu fiziksel hafızadan daha büyük olacaktır.
"Artan bellek" şimdi sadece program açısından değil, sistem açısından da ortaya çıkıyor.


3

Sanal bellek, bir programın ele alabileceği veri miktarını artırır. Yazılım bakış açısına göre (genellikle) verilerin nerede depolandığını önemsemiyoruz. Fiziksel DRAM belleğinde saklanabilir, makineye takılı bir flash sürücüde saklanabilir veya dönen bir tepside bile saklanabilir. Yazılımın umursadığı şey, bu verilere erişmek istediğinde, başarmasıdır.

Uygulamada, programların da hızlı çalışmasını istiyoruz. İçin hız verisi olduğu hususlar, biz Umurunda. En sık erişmekte olduğumuz verilerin en hızlı erişime izin veren donanımda saklanmasını istiyoruz. Programlarımız tamamen DRAM’in bitmesini istiyor . Ancak, bunu yapmak için genellikle yeterli DRAM yok. Sanal bellek bir çözümdür.

Sanal bellekte, işletim sistemi bir süredir kullanılmamış olan verileri "sabitler" ve sabit diskte saklar. Bu hala erişilebilir, sadece yavaş. Program, sabit diskteki verileri isterse, işletim sisteminin verileri diskten okumak için zaman ayırması ve DRAM'e geri götürmesi gerekir.

Teoride, verileri doğrudan diskten okuyabiliyordu. Ancak, bu şekilde yapılmamasının sebepleri var. Programlar tüm bu komplikasyonların farkında olmak istemiyorlar. Verileri akıllı bir şekilde diske yerleştiren bir yazılım yazabiliriz ve yapabiliriz (buna önbellekleme denir). Ancak, çok fazladan çalışma gerektirir. Kodda yapabildiğimiz en hızlı:

if data is not in memory
    read data from disk into memory
operate on data

Zeki bir okuyucu, veriler bellekte olsa bile, orada olup olmadığını kontrol etmek için bir şartlıya sahip olmamız gerektiğini fark edecektir. Bu doğrudan bellekte çalışmaktan çok daha yavaştır!

Sanal bellek, CPU üzerindeki donanımı kontrol ederek bu sorunu çözer. CPU bu sanal bellek işlemini çok hızlı bir şekilde yapmak için bir konumdadır çünkü donanımı kendisine tahsis edebilir. Bunu tek başına yazılımda yapmak için yapılan herhangi bir girişim, işlemcinin özel amaçlı transistörlerden doğal olarak daha yavaş olan işlemcinin genel amaçlı kısımlarını kullanmalıdır.

Bu, neden sadece diskten okuyarak ve bıraktıktan sonra verileri her zaman tekrar belleğe yazdırdığımızı gösterir. Belleği, her biri bellekte bulunmayan veya bulunmayan olarak işaretlenen "sayfalara" böleriz. İşletim sistemi bu tabloyu CPU'nun doğrudan kullanması için uygun bir formatta tutar. Bir program mevcut olan verilere eriştiğinde, CPU üzerindeki donanım doğrudan DRAM'daki verilere erişmelerini sağlar. Veriler mevcut olmadığında, işletim sistemine diskten o sayfayı bir miktar fiziksel belleğe yüklemesini söyleyen ve bu yeni fiziksel sayfada CPU'yu gösterecek şekilde tabloyu güncelleyen bir "sayfa hatası" verilir.

Tüm bu sorunun anahtarı, kullanımını en aza indirmektir. Uygulamada, işletim sistemlerinin bellekte tutulacak verilerin ve hangi verilerin diskte görüntüleneceğini seçme konusunda çok iyi olduğunu düşünüyoruz, bu nedenle bellek erişiminin büyük çoğunluğu hiç bir sayfa hatasına neden olmadan gerçekleşiyor.


2

Bunu harita girişlerini geçici yaparak yapar.

Bir program mantıksal bir adrese eriştiğinde, CPU ilgili fiziksel adres için haritaya bakar. Eğer bulunursa, hafıza erişimi beklendiği gibi ilerler; Bulamazsa, fiziksel bir adres tahsis edilmeli ve içerik başka bir depolama biriminden yüklenmelidir - "takas alanı". Her fiziksel adres önceden bir mantıksal adrese tahsis edilmişse, fiziksel adreslerin kullanılabilmesi için bazı mantıksal adreslerin "değiştirilip çıkarılması" (içeriklerinin takas alanına geri kaydedilmesi) gerekir.

Ayrılan maksimum bellek, takılan bellekten çok daha büyük olabilen takas alanının boyutudur. Takas alanını "gerçek" bellek olarak ve RAM'i de takas alanı için yüksek hızlı bir önbellek olarak düşünmek faydalı olabilir.

(Bu ayrıntılı bir açıklamadan çok uzaktır, acil soruyu ilgili fakat gereksiz ayrıntıya girmeden cevaplaması amaçlanmıştır.)


1

Temel kavram, modern bir CPU'nun hangi tabloları kullanmak için belirli bir işlemin tahsis edildiğini ve hangi fiziksel adreslerin (bir bellek veriyolunda A00.Axx satırları düşünün) düşünerek) çeviri tablolarını yönetebildiğine dayanır şu anda gerçekten verileri depolamak için kullanılıyor, çünkü "HİÇBİR ŞEY", "hiç yok" olası ve kabul edilebilir bir durumdur: Bu durumda, donanım düzeyinde bir hata durumu ("sayfa hatası" olarak adlandırılır) ortaya çıkar. - ve bu hata, örneğin bir takas dosyasına yazılan hafıza içeriğini fiziksel bellekteki herhangi bir boş yere geri yükleyebilecek (okuma durumunda) veya bir şeyler koymak için gerçek bir konum bulabilecek bir işletim sistemi düzeyinde işleyiciyi tetikler. Yazma durumunda), yukarıda belirtilen çeviri tablosunu güncelleyin,ve sadece SONRAKİ el bu hafızaya erişmeye çalışan süreci kontrol eder .. ve olanlardan hiçbiri akıllıca olmaz.


1

Sanal bellek:

1) büyük bir sanal adres alanının, diske veya SSD'ye veya ileriye dönük olarak NVRAM'a ve diğer cihazlara "takas" uygulanmış olarak, daha küçük bir fiziksel belleğe eşlenmesini sağlar.

2) daha büyük bir sanal adres alanının (örneğin 64 bit) daha küçük bir fiziksel adres alanına eşleştirilmesine izin verir (örneğin 32 veya 64 bit)

3) daha küçük bir sanal adres alanının (örneğin 32 bit) daha büyük bir fiziksel adres alanına eşleştirilmesine (örneğin 40 bit) izin verir ve böylece eski uygulamaların daha fazla fiziksel DRAM'den faydalanmasına izin verir.

4) fiziksel adres alanında parçalanmış ve bitişik olmayan fiziksel belleğin sanal adres alanında bitişik hale getirilmesine izin verir.

5) işlemlerin kendi sanal adres alanlarına sahip olmalarını ve böylece birbirlerinden izole edilmelerini sağlar.

6) tek bir fiziksel sayfaya tahsis edilen aynı veri değerlerini paylaşan farklı sanal adreslere izin verir.

Bu, tek bir işlem veya işletim sistemi içerisinde gerçekleşebilir - çoğu BSD UNIX türetilmiş işletim sistemi, sıfır ile doldurulmuş herhangi bir sanal sayfaya eşleştirilebilen, salt okunur tek bir sıfır sayfasına sahiptir, genellikle COW (Yazma üzerine yaz - yalnızca sıfır oku, sıkışmış yazar) ve sayfa paylaşılmadı ve yazılabilir hale getirildi).

İşlemler arasında gerçekleşebilir - örneğin UNIX fork () neredeyse tüm sanal belleği COW biçiminde paylaşan alt işlemler oluşturur.

Bu, işletim sistemleri arasında gerçekleşebilir - örn. Sanal bir makine sunucusundaki Konuk İşletim Sistemleri, sayfaları tekilleştirilmiş, paylaşılan COW vb.

7) sanal bellek, sanal adres alanının bazılarının dosyalara veya aynı çok işlemcili sistemde veya İnternet üzerinden diğer işlemcilerde haritalanmasına eşleştirilmesine izin verebilir.

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.