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:
- 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.
- 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 0
etmek 1023
(yani ilk bayt yerdedir, bayt doğrusal bir dizi olarak hafızayı hayal 0
, 1024
inci bayt yerdedir 1023
) - yani işgal 1 GB
bellek. Benzer şekilde, VLC bellek aralığını işgal edeceğini beyan eder 1244
.1876
vs.
Avantajlar:
- 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ı:
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 GB
RAM'den bellek ayırmayı gerektiren) bir yazılım, yalnızca 1 GB
belleğ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ı?
Hafıza karışıklığını önlemek mümkün değildir. Piyasada milyonlarca yazılım var, her biri sadece 1 kB
bellek 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 1
için 1023
ve VLC atanır 1000
iç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 GB
RAM için adres aralığı dan bayt 0
iç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 Memory
budur.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 GB
tamamen tükenecek ve RAM şuna benziyor:
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 GB
PC'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:
Bu ikisini kapatmanın 700 MB
boş alan - ( 400
+ 300
) MB olduğunu varsayalım . Şimdi yer kaplayacak olan Opera'yı başlatmanız gerekiyor 450 MB
. Pekala, 450 MB
toplamda 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 MB
boş 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 45
veriyle birlikte tükürdüğünü 123
ve işletim sisteminin bunu yerinde sakladığını düşünün. 2012
ve bir harita girişi eşleme yarattı 45
iç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 45
için yeni adres, böylece yazılım 123
bellek konumunu sorguladığında beklenen verileri ( ) alabilir.Yazılım 45
söz konusu olduğunda, tek bildiği bu adres45
verileri 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 MB
altta boş alan var :
Opera , alt kısma rahatça sığar. Şimdi RAM'iniz şöyle görünüyor:
İ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:
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ü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 - paging
ve 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 page
boyut 4 kB
. Haritalama, page table
sanal 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 table
buna karşılık gelen konumu bulmak page
(olarak bilinir frame
) ve içindeki sanal adresin ofsetinin hem page
için page
hem de için aynı olduğunu, frame
bu ofseti tarafından döndürülen adrese ekleyerek gerçek adresi bulun page table
. Örneğin:
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 35
yapıldığını söyleyin . Burada sayfa boyutu 8
(her biri konumları page
içerir, 8
konumların tüm sanal adres alanı 40
bu nedenle 5
sayfaları 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 table
soldaki 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.4
Bu süreçte (adresler arasında değişir diskteki programdan temelde bir bellek yığın için 32
için 39
). Geldiğinde, işletim sistemi sayfayı RAM'de bir yere tahsis eder, örneğin ilk çerçevenin kendisini ve page table
bu 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 0
RAM'deki th çerçeveye gider , verilere 3
bu çerçevede ofsette erişir (Bunu anlamak için bir dakikanızı ayırın.page
diskten 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 frame
bellek 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 28
yapı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 table
gü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 1
henüz hafızada değil, aynı prosedür tekrarlanıyor vepage
çerçeve içinde tahsis ediliyor2
RAM'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 table
o sayfanın 3
RAM'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
, 27
hepsi 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 3
geldiğ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
, 3
ve 4
bu 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. LRU
Bir süreç için en son erişilen çerçevenin nerede çıkarılacağına dayanabilir. En first-come-first-evicted
uzun 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 frame
bazılarına eşlenmiştirpage
! (Şu anda, sayfa tablosu ile 3
tek 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 table
bu 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 page
artık bellekte olmadığını söyler. ve diskten getirilmesi gerekir. İyi. Böylece çerçeve 1
çıkarılır, sayfa 0
getirilir ve oraya RAM'e yerleştirilir ve sayfa girişi3
kaldırılır ve sayfa yerine 0
aynı çerçeveye haritalama1
. Şimdi eşlememiz şöyle görünüyor ( frame
sağ taraftaki ikinci renk değişikliğine dikkat edin ):
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 page
değ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 miss
ise 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 reference
Bazı hafıza konumundan veriler kullanılıyorsa, yani gerekli sonraki veri belki aynı mesafede, çok yakın bir yerde yer alacak page
, page
sadece 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 page
sü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 page
baş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 pages
artık kullanılmamaktadır, bu nedenle diğer işlemler daha fazla belleğe ihtiyaç duyduğunda, basit LRU
tabanlı bir tahliye daha az kullanılanları otomatik olarak RAM'den çıkarır pages
ve bunları yeni sayfalarla değiştirir. diğer süreçler (ve tabii ki page tables
tü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, frames
RAM'de daha az kullanılır, bu nedenle basit bir LRU
temel tahliye, bu sayfaları çıkarabilir ve pages
yeni işlemlerin gerektirdiği şekilde değiştirebilir , böylece Internal Fragmentation
gerek 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 frames
RAM'den çıkarılır . Her şey birimlerinde gerçekleşir pages
, dolayısıyla şimdiye dair bir kavram yoktur hole
ve dolayısıyla hareket eden herhangi bir şey söz konusu değildir! pages
Bu yeni gereklilik nedeniyle 10 Mayıs'ın taşınması gerekti, bunlardan binlercesi pages
dokunulmadan 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 hole
veya External Fragmentation
bu 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 pages
RAM'e geri yükler (tabii ki pages
diğ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-table
bu 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:
Paging
nihayetinde 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 swap
ve 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, i
iş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, i
en 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.i
gerçek bir fiziksel adrese aktarır, böylece bu işlev içinde bazı kodların değerini gerektirdiğinde, i
iş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 TB
64 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.