Windows, hala 4 GB fiziksel bellek varken RAM’in tükendiğini söylüyor


24

İşlem Gezgini'nden Sistem Bilgisinin ekran görüntüsü

Bu Sistem Bilgisi, İşlem Gezgini'ndendir. Hala fiziksel bellek var ancak sistemde RAM kalmadı.

Görev Yöneticisi ayrıca toplam RAM'in yaklaşık% 74'ünün kullanıldığını gösterir.

Windows 8.1'i yükledikten sonra, bilgisayarda 4 + 8 = 12 GB RAM vardı. 4 GB'ı 8 GB'lık bir modülle değiştirerek yükselttim. Sorun bu olabilir mi? Yoksa bu davranış normal mi ve sadece mevcut fiziksel belleğin anlamını yanlış anladım?


Eklemeye çalıştığı resim burada: tinypic.com/view.php?pic=npon5c&s=8#.Va3P3_lVhBc Bu URL'yi eklemek için bir düzenlemeyi onayladım, ancak görünüşte yeterli değil.
Jamie Hanrahan

@JamieHanrahan: Görüntüler Ctrl+Gkısa yol kullanılarak yüklenmelidir, böylece Stack Exchange zaman içinde çürümelerini önleyebilir.
Deltik

@Deltik Yüklemek için resmim değildi.
Jamie Hanrahan

@JamieHanrahan - Soru gönderildikten sonra, malzemeye lisans verildi, görüntü bu noktadaki topluluklar. ..
Ramhound

Gelecekteki referans için kaydetti, teşekkürler. Önerilen bir düzenlemede tinipik siteye bağlantıyı gördüm ve bu düzenlemeyi onayladım, ancak bunun bir etkisi olmadı.
Jamie Hanrahan

Yanıtlar:


65

Kısa cevap

"Bellek yetersiz" pop-up'ında, kendinize ait özel bellek sınırını aştığınızı, bir tür sanal bellek olduğunu söylüyor . RAM'inizin tükenmesinden değil (fiziksel bellek). Ne kadar kullanılabilir RAM'iniz olduğu önemli değil . Çok sayıda Kullanılabilir RAM olması, taahhüt sınırını aşmanıza izin vermez. Taahhüt sınırı, toplam RAM'inizin (kullanımda olsun veya olmasın!) Artı geçerli sayfa dosyası boyutunuzun toplamıdır .

Tersine, ne "kullanır" kabul limiti (çoğunlukla süreç-özel sanal adres alanının oluşturulmasıdır) mutlaka RAM kullanmaz! Ancak işletim sistemi, gerektiğinde depolamak için bir yer olduğunu bilmediği sürece, yaratılmasına izin vermez. Böylece, tüm RAM'lerinizi, hatta RAM'in çoğunu kullanmadan taahhüt limitine girebilirsiniz.

Bu nedenle sayfa dosyası kullanmadan çalışmamalısınız. Sayfa dosyasının aslında hiç yazılmayabileceğini unutmayın! Ancak yine de "düşük bellek" ve "düşük bellek" hatalarından kaçınmanıza izin verecektir.

Orta cevap

Windows, RAM tükendi için aslında bir hata mesajı yok. Kaçtığın şey "taahhüt limiti".

İşlem Gezgini'nin bu sürümündeki "Sistem" grafiği, yetersiz adlandırılmıştır. "Sorumluluk ver" olarak etiketlenmelidir. (Ben sürümünde "Sistem taahhüdü" denir. Daha iyi, ama yine de tamamen tutarlı değil.) Her durumda, grafiğin "mevcut" yüksekliği, metin bölümünde "Ücretlendirme" - "olarak aşağıya inen şeydir." Akım "ve grafiğin maksimum yüksekliği" Ücretlendirme "-" Limit "i gösterir.

"Ücretlendirme", sayfa dosyası tarafından desteklenen bir sanal adres alanını ifade eder (varsa) - başka bir deyişle, tümü RAM'e sığamıyorsa, kalanı sayfa dosyasına gider. (Başka dosyalar tarafından desteklenen ve "eşlenmiş" vas olarak adlandırılan - veya her zaman RAM'de kalması gereken başka vas türleri vardır; ikincisi "sayfalanamaz" olarak adlandırılır.) "Taahhüt sınırı", maksimum "taahhüt sorumluluğu" olabilir. RAM boyutunuza artı sayfa dosyası boyutuna eşittir.

Görünüşe göre hiçbir sayfa dosyasına sahip değilsiniz (taahhüt sınırınızın RAM boyutunuza eşit olması nedeniyle söyleyebilirim), bu nedenle taahhüt sınırı sadece RAM boyutudur.

Görünüşe göre çeşitli programlar + İşletim Sistemi mümkün olan maksimum taahhüdün neredeyse tümünü kullanmıştır.

Bunun RAM'in ne kadar boş veya serbest olduğu ile doğrudan ilgisi yok. Evet, yaklaşık 4.5 GB RAM mevcut. Bu, taahhüt limitini aşabileceğin anlamına gelmez. Kabul edilen hafıza mutlaka RAM kullanmaz ve mevcut RAM miktarıyla sınırlı değildir.

Sayfa dosyasını yeniden etkinleştirmeniz gerekir - bu kadar kararlı kullanarak, 16 GB'lık bir sayfa dosyası öneririm, çünkü işletim sistemini RAM'de bu tür şeyleri RAM'de tutmaya zorlamak istemezsiniz ve sayfa dosyası en iyi şekilde çalışıyorsa çok fazla boş odası var - veya daha fazla RAM ekleyin. Çok daha fazla. İyi bir performans için, kod ve sayfa dosyası tarafından desteklenmeyen diğer şeyler için RAM'de yeterince yer açmanız gerekir (ancak diğer dosyalara disk belleği eklenebilir).

Çok Uzun Cevap

(ancak Windows Internals'ın bellek yönetimi bölümünden hala çok daha kısa ...)

Bir programın 100 MB işlem-özel sanal belleği ayırdığını varsayalım. Bu "commit" seçeneğiyle bir VirtualAlloc çağrısı ile yapılır. Bu, "Ücretlendir" de 100 MB artışla sonuçlanacaktır. Ancak bu "tahsis" aslında herhangi bir RAM kullanmaz! RAM, yalnızca yeni oluşturulan sanal adres alanlarından bazılarına ilk kez erişildiğinde kullanılır.

RAM sonunda nasıl kullanılır?

(eğer öyle yaparsa)

Yeni işlenen alana ilk kez erişim, neredeyse her zaman bir bellek yazımı olacaktır (yazmadan önce yeni tahsis edilmiş özel vasları okumak, hemen hemen her zaman bir programlama hatasıdır, çünkü ilk içerikleri kesin olarak konuşurlar). Ancak, oku veya yaz, sonuç, yeni atanmış vas sayfasına ilk dokunduğunuzda, bir sayfa hatasıdır . "Hata" kelimesi kötü gelse de, sayfa hataları bir sanal bellek işletim sisteminde tamamen beklenen ve hatta gerekli bir olaydır.

Bu özel türdeki sayfa hatasına cevaben, çağrı cihazı (işletim sisteminin hafıza yöneticisinin, bazen "Mm" olarak kısaltılacağım kısmı):

  1. fiziksel bir RAM sayfası ayırın (ideal olarak sıfır sayfa listesinden, ancak her durumda, Windows'un "kullanılabilir" dediği şeyden gelir: bu tercih sırasına göre sıfır, boş veya bekleme sayfası listesi);
  2. fiziksel sayfayı sanal sayfa ile ilişkilendirmek için bir sayfa tablosu girişi doldurun ; ve sonunda
  3. sayfa hatası istisnasını kaldırın.

Bundan sonra, bellek referansını yapan kod, sayfa hatasını yükselten talimatı yeniden uygular ve bu sefer referans başarılı olur.

Sayfanın proses çalışma setine ve RAM'e "hatalı" olduğunu söylüyoruz. Görev Yöneticisi'nde bu işlemin "özel çalışma kümesinde" bir sayfa (4 KB) artış olarak görünecektir. Ve Kullanılabilir fiziksel bellekte bir sayfa azalma. (İkincisi, yoğun bir makinede fark etmesi zor olabilir.)

Not 1: Bu sayfa hatası, diskten okunan hiçbir şey içermiyordu. Daha önce erişilmemiş bir sanal bellek sayfası, diskteki hayata başlamıyor; bunu okumak diskte yeri yoktur den . Daha önce mevcut olan RAM sayfasında "basitleştirilmiştir". İstatistiksel olarak, aslında, çoğu sayfa hatası RAM'de, diğer işlemler için zaten RAM'de olan paylaşılan sayfalara veya sayfa önbelleklerine (bekleme veya değiştirilmiş listeler) veya buna benzer "sıfır talep" sayfalarına giderilir.

Not 2: Bu, "Available" bölümünden yalnızca 4096 bayt olan bir sayfa alır. Dokunulmadan önce taahhüt edilen adres alanı normal olarak gerçekleştirilir - hatalı - her sayfada ilk kez "dokunulduğundan" bir seferde sadece bir sayfa. Bir seferde daha fazlasını yaparken hiçbir gelişme olmaz, avantaj olmaz; sadece n kere uzun sürecek. Buna karşılık, sayfaların diskten okunması gerektiğinde, bir miktar okunan zamanın büyük çoğunluğu gerçek veri aktarımı yerine işlem başına gerçekleştiğinden bir miktar "okuma-okuma" denenir. “İşlenen” miktarı 100 MB; bir sayfa veya sayfanın hatalı olması taahhüt ücretini düşürmez.

Not 3:Diyelim ki 4 GB "kullanılabilir" RAM'imiz var. Bu, RAM'den ayrılmadan önce, önceden tahsis edilmiş fakat daha önce hiç referans alınmamış bir hafızaya bir milyon kez daha (4 GB / 4096) atıfta bulunabileceğimiz anlamına gelir. Bu noktada, David Cutler ve Lou Perazzoli'nin amaçladığı gibi bir sayfa dosyamız varsa, RAM'deki en uzun zaman önce referans verilen sayfalardan bazıları diske kaydedilir ve daha sonra bu daha yeni sayfa hatalarını gidermek için Kullanılabilir duruma getirilir. (Aslında işletim sistemi daha önce yerine "çalışma kümesi düzeltme" gibi RAM geri kazanma yöntemlerini başlatacaktı ve sayfa dosyasına yazılan gerçek yazılar önbelleklenerek değiştirilmiş sayfa listesinde toplu halde düzenleniyor ve ...) "taahhüt" sayımı. Bununla birlikte, "taahhüt sınırı" ile ilgilidir. Eğer herkes için yer yoksa "

Ve devam ediyor ...

Ancak, bu milyon daha referansı yapmadığımızı ve hala 4GB değerinde "kullanılabilir" sayfa bulunduğunu varsayalım. Şimdi diyelim ki aynı işlem - ya da bir diğeri önemli değil - bu kez 200 MB taahhütte bulunduğunu söyleyen bir VirtualAlloc daha var. Yine, bu 200 MB taahhüt ücretine eklenir ve mevcut RAM'leri kaldırmaz. Basitçe VirtualAlloc'ating adres alanı karşılık gelen miktarda RAM kullanmaz ve düşük "kullanılabilir" RAM'e sahip olmak, VirtualAlloc yapabileceğiniz adres alanını sınırlamaz (veya mevcut yüksek RAM'e sahip değildir).

(Peki, tamam ... her 2 MB (x86, PAE olmayan bir sistemde iseniz 4 MB) için bir sayfa tablosu için kullanılan bir (sayfalanabilir!) Sayfa tutarında küçük bir ek yük var. tahsis edilen sanal adres alanı ve neredeyse bitişik tahsis edilen her aralık için birkaç on baytlık bir "sanal adres tanımlayıcısı" var.)

Bu şekilde mümkün - ve yaygın! - Çok az miktarda RAM kullanırken, çok fazla "taahhütte bulunma" kullanmak.

Öyleyse, sanal adres alanı "taahhüt etmek" RAM kullanmıyorsa, neden bir limit olmak zorunda?

Çünkü "taahhüt bedeli" gelecekteki potansiyel depolama alanı kullanımını temsil eder . "Sınırlama sınırı", gerçekten başvuruda bulunmaları ve bir yerde saklanması gerekmesi halinde , bu tür tahsisler için mevcut toplam depolama miktarını (RAM + sayfa dosyası alanı) temsil eder .

Mm bir VirtualAlloc isteğini onayladığında, tahsis edilen alana daha sonra gelen tüm hafıza erişiminin başarılı olacağı ümidiyle - "bir taahhütte bulunma"; sayfa hatalarına neden olabilirler, ancak hataların tümü çözülebilecektir, çünkü RAM'de veya sayfa dosyasında olsun, tüm bu sayfaların içeriğini tutmak için yeterli depolama alanı vardır. Mm bunu biliyor çünkü ne kadar depolama alanı olduğunu (taahhüt limiti) ve ne kadarının “taahhüt edildiğini” (mevcut taahhüt ücreti) biliyor.

(Ancak, bu sayfaların tümüne henüz erişilmemiştir, bu nedenle, herhangi bir zamanda, taahhüt edilen tutarla gitmek için mutlaka bir depolama mevcut değildir.)

Öyleyse ... "Sistem belleği yetersiz"?

Eğer VirtualAlloc’a çalışırsanız ve mevcut taahhüt ücretine ek olarak talep edilen tahsis büyüklüğü sizi taahhüt limitinin üstüne çıkarır ve işletim sistemi sayfa sınırını genişletemez. yukarı ve işlem VirtualAlloc çağrısını FAIL olarak görür. Çoğu program sadece ellerini yukarı atar ve bu noktada ölür. Bazıları aramanın başarılı olduğunu varsayarak, basmaya devam edeceğini ve tahsis ettiklerini düşündükleri bölgeye başvurmaya çalıştıklarında başarısız olduklarını söyleyerek kör davranacaklar.

Yine (tekrar için özür dilerim): ne kadar Kullanılabilir RAM'e sahip olduğunuz önemli değil. İşletim sistemi, RAM veya sayfa dosyası alanının gerektiğinde kullanılabilir olacağına söz verdi , ancak bu söz "Kullanılabilir" den çıkarılmıyor. Kullanılabilir RAM, yalnızca ilk kez referans alındığında taahhüt edilen vm tarafından kullanılır; bu, “hatalı” olmasına neden olur; yani fiziksel bellekte gerçekleşir. Ve basitçe taahhüt etmek (= tahsis etmek) sanal belleği de yapmaz. Yalnızca sanal adres alanını boşaltır ve kullanılabilir sanal adres alanını dışına çıkarır.

Ancak "yetersiz bellek" durumunda, kararlı bellek için bir tahsisat talebi var ve işletim sistemi bu yeni talebin boyutuna mevcut taahhüt ücretini ekledi ... ve toplamın taahhüt limitinden daha fazla olduğunu buldu . Öyleyse işletim sistemi bu yeni olanı onayladıysa ve bu boşluğa bundan sonra başvuru yapıldıysa, hepsini depolayacak gerçek yerler (RAM + sayfa dosyası) olmazdı.

İşletim sistemi buna izin vermez. En kötü durumda tutmak için yeterli alana sahip olduğundan daha fazla vas tahsis edilmesine izin vermeyecektir - hepsi “hatalı” olsa bile. Bu "taahhüt sınırı" nın amacıdır.

Sana üç kez söylüyorum Sana üç kez söylüyorum Sana üç kez söylüyorum: "Müsait" RAM miktarı önemli değil. Taahhüt edilen sanal alanın aslında tüm bu depolama alanını kullanmaması, önemli değil. Windows gelecekte tahsis edilemeyecek '' mümkün '' olmadığı sürece sanal tahsise "taahhüt" edemez.

Öncelikle kod ve büyük veri dosyalarına erişim için kullanılan, "haritalanmış" adında başka bir vas türü olduğunu unutmayın, ancak "ücretlendirme" için ücret alınmaz ve "işlem limit" ile sınırlı değildir. Bunun nedeni, kendi depolama alanıyla, kendisine “eşlenmiş” olan dosyalar ile birlikte gelmesidir. "Eşlenmiş" vaz üzerindeki tek sınır, eşlenen dosyalar için sahip olduğunuz disk alanı miktarı ve eşlemeniz için harcadığınız boş vaz miktarıdır.

Fakat sisteme baktığım zaman, henüz taahhüt limitinde değilim.

Bu temelde bir ölçüm ve kayıt tutma sorunu. VirtualAlloc çağrısı zaten denendi ve başarısız olduktan sonra sisteme bakıyorsunuz.

Yalnızca 500 MB taahhüt limiti kaldığını ve bazı programların VirtualAlloc 600 MB’ı denediğini varsayalım. Deneme başarısız. Sonra sisteme bakıp "Ne? Hala 500 MB kaldı!" Aslında o zamana kadar çok daha fazla şey olabilir, çünkü söz konusu işlem muhtemelen bu noktadan tamamen geçmiştir, bu nedenle daha önce tahsis edilmiş adanmış belleğinin TÜMÜ serbest bırakılmıştır.

Sorun zamanda geriye bakmak ve hangi taahhüt şarj göremiyorum ki oldu alloc girişiminin yapıldığı anda. Ayrıca girişimin ne kadar alan için olduğunu da bilmiyorsunuz. Bu nedenle, girişimin neden başarısız olduğunu veya çalışmasına izin vermek için ne kadar “taahhüt limiti” gerektiğini kesin olarak göremezsiniz.

"Sistemin belleği azalıyor " gördüm . Bu da ne?

Yukarıdaki durumda işletim sistemi sayfa dosyasını genişletebilirse (yani, varsayılan "sistem yönetimi" ayarında bırakıyorsanız veya yönetiyorsanız, ancak maksimum değeri başlangıçtaki değerden daha büyük bir değere ayarlarsanız, VE yeterince boş disk alanı varsa) ve Böyle bir genişleme, VirtualAlloc çağrısının başarılı olmasına izin vermek için taahhüt sınırını yeterince artırır, ardından ... Mm sayfa dosyasını genişletir ve VirtualAlloc çağrısı başarılı olur.

Ve o zaman “sistem hafızada DÜŞÜK çalışıyor” görürsünüz. Bu erken bir uyarıdır, herhangi bir şey hafifletilmeden devam ederse, muhtemelen yakında "yetersiz bellek" uyarısı göreceksiniz. Bazı uygulamaları kapatma zamanı. Tarayıcınızın pencereleri ile başlardım.

Sence bu iyi bir şey mi? Sayfa dosyası genişletme kötü!

Hayır değil. Bakın, işletim sistemi mevcut dosyayı gerçekten "genişletmiyor". Sadece yeni bir kapsam ayırıyor. Etki, bitişik olmayan diğer dosyalara çok benzer. Eski sayfa dosyası içeriği, oldukları yerde kalır; yeni bir yere veya bunun gibi bir yere kopyalanmaları gerekmez. Çoğu sayfa dosyası IO'su, sayfa dosyası boyutuna kıyasla nispeten küçük boyutlarda olduğundan, herhangi bir aktarımın belirli bir sınırı geçme olasılığı oldukça nadirdir, bu nedenle parçalanma, gerçekten çok fazla olmadığı sürece çok fazla acı vermez.

Son olarak, uzantıdaki "taahhüt" alanı olan tüm işlemler sonlandırıldıktan sonra (işletim sistemi kapanmadan önce olmasa da), uzantılar sessizce serbest bırakılır ve sayfa dosyası önceki boyutuna ve dağıtımına döner - daha önce bitişikse yine de öyle.

Bu nedenle, sayfa dosyasının genişlemesine izin vermek tamamen ücretsiz bir güvenlik ağı görevi görür: İzin verirseniz ancak sistemin hiçbir zaman gereksinim duymaması durumunda, sistem sık sık iddia edildiği gibi "sürekli olarak sayfa dosyasını genişletip daraltamaz", bu nedenle hiçbir maliyeti yoktur . Ve ihtiyacınız olursa, sizi "sanal bellek yetersiz" hatalarla çarpışan uygulamalardan koruyacaktır.

Ama ama ama...

Sayfa dosyası genişlemesine izin verirseniz, Windows'un sayfa dosyasını sürekli olarak genişletip daraltacağını ve bu işlemi birleştirmek kadar sayfa dosyasının parçalanmasına yol açacağını düzinelerce web sitesinde okudum.

Sadece yanılıyorlar.

"Belleği azalıyor" (veya eski sürümlerde "sanal bellek azalıyor") açılır penceresini hiç görmediyseniz, işletim sistemi sayfa dosyanızı hiçbir zaman genişletmedi.

Bu pop-up'ı görürseniz, bu ilk sayfa dosya boyutunuzun çok küçük olduğunu gösterir. (Gözlemlenen maksimum kullanım miktarını 4x'e ayarlamayı seviyorum; yani, "% sayfa dosyası kullanım tepe değeri" perfmon sayacı% 25'in altında olmalıdır. Sebep: Sayfa dosyası alanı herhangi bir yığın gibi yönetiliyor ve çok fazla boş alanla çalışıyor oynamak için.)

Ama neden onlar sadece ...

Biri, işletim sisteminin sadece tahsisatın gerçekleşmesine izin vermesi ve daha sonra sayfa hatalarını çözmek için uygun RAM yoksa referansların başarısız olmasına izin vermesi gerektiğini iddia edebilir . Başka bir deyişle, ilk sayfa arızasının nasıl çalıştığını açıkladığımız yerin üstünde, "uygun bir fiziksel RAM sayfası ayırma" (adım 1) yapılamadığı için yapılamadı ve yer yoktu. herhangi bir kullanılabilir yapmak için herhangi bir şeyi dışarıda bırakmak?

Sonra çağrı cihazı sayfa hatasını çözemez. İstisnanın (sayfa hatası) fay başlığına geri bildirilmesine izin verilmesi gerekir, muhtemelen başka bir istisna koduyla değiştirilir.

Tasarım felsefesi, VirtualAlloc'un taahhüt sınırını aşmanız durumunda adres yerine sıfır (teknik olarak NULL işaretçisi) döndürmesidir ve programcının bir VirtualAlloc çağrısının başarısız olabileceğini bilmesini beklemek tamamen mantıklıdır. Bu nedenle programcıların bu davayı kontrol etmesi ve cevap olarak makul bir şeyler yapması beklenir (çalışmalarınızı bu noktaya kadar kaydetme şansı vermek ve programı "zarafetle" bitirmek gibi). (Programcılar: malloc, new, vb. NULL bir işaretçi dönüşü olup olmadığını kontrol edersiniz, evet? O zaman neden bundan istemediniz?)

Ancak programcılar gibi basit bir hafıza referansı beklememeliler

i = 0;             // initialize loop counter

başarısız olabilir - başarılı bir şekilde işlenen adres alanının bulunduğu bir bölgede değilse. (Ya da haritalanmış adres alanı, bunun için.) Ama "fazladan tahsis edilmesine izin ver, bellek referansının başarısız olmasına izin ver" felsefesi takip edildiyse, bu olabilirdi.

Ne yazık ki, yukarıdaki kod satırındaki gibi bir bellek başvurusu sadece kötü bir durum döndürmenin uygun bir yolunu bulmaz! Sadece toplama ve çıkarma gibi çalışması gerekiyordu . Bu tür hataları bildirmenin tek yolu istisnalar olacaktır. Bu yüzden, onları idare etmek için programcının tüm programı bir istisna işleyicisine sarması gerekir. (dene ... yakala ve hepsini.)

Bu yapılabilir ... Ancak, bu istisnalara yanıt olarak işleyicinin “doğru şeyi nasıl yapacağını” bilmesi zor olacaktır, çünkü kodda ortaya çıkabilecekleri çok, çok fazla nokta olacaktır. (Özellikle, onlar ortaya çıkabilecek her yığını çok VirtualAlloc'd olduğundan, hem de tüm yerel değişkenlere malloc ya da yeni ile ayrılan belleğe, VirtualAlloc'd hafızasına hafıza referansı ... vb.)

Kısacası, bu durumlarda programı incelikle başarısız yapmak çok zor olacaktır.

Öte yandan, VirtualAlloc'dan NULL bir işaretçi dönüşü olup olmadığını kontrol etmek oldukça kolaydır (ya da malloc ya da yeni, bu konuda, tam olarak aynı şey olmasalar da) ve sonra makul bir şeyler yapın. ve sanal alan için gereken programın ne olduğunu yapın. Ve belki de kullanıcıya, eğer varsa, çalışmalarını şimdiye kadar kaydetmek isteyip istemediklerini sorun. (Çok fazla sayıda uygulama bu kadarını yapmaktan zahmet etmiyor.)

Diğer taahhüt kullanıcıları

Bu arada, "taahhüt sınırı", işletim sisteminin disk belleği ve disk belleği olmayan havuz, PFN listesi, vb. Gibi çeşitli tahsisleri ile azaltılmamaktadır; bunlar sadece olduğu gibi sorumludurlar. Ayrıca video RAM'den ve hatta video RAM'in "pencere" boyutundan etkilenen ücretlendirme veya taahhüt limiti de yoktur.

Kendin test et

Bunların hepsini SysInternals sitesindeki testlimit aracıyla demo yapabilirsiniz. Seçenek -m kararlı adres alanı tahsis eder ancak ona "dokunmaz", böylece RAM tahsisine neden olmaz. Oysa -d seçeneği, sayfaları tahsis eder ve ayrıca referans verir ve hem RAM'in artmasını hem de RAM'in azalmasını sağlar.

Referanslar

Windows Internals Russinovich, Solomon ve Ionescu tarafından. Testlimit aracını kullanarak tüm bu noktaları kanıtlamanıza izin veren gösteriler bile var. Ancak, bunun uzun olduğunu düşünüyorsanız, uyarılmanız gerektiğini uyarmam gerekir: yalnızca Mm bölümü 200 sayfadır; Yukarıdaki, son derece basitleştirilmiş bir versiyonudur. (Lütfen Giriş bölümündeki "Teşekkürler" bölümüne de bakın.)

Ayrıca bkz. MSDN VirtualAlloc belgeleri


4
@AcePL Nedenini açıkladım. Kısaca: Bu oluyor çünkü iş limiti iş yükü için çok düşük. Taahhüt sınırı, toplam RAM boyutu + geçerli sayfa dosyası boyutudur. "Kullanılabilir" RAM miktarı buna girmez. "Taahhüt sınırı" mekanizması, sanal adres alanının fiziksel depolama alanı (disk üzerinde RAM + destek deposu, yani sayfa dosyası) kullanılabilirliğinin ötesinde tahsis edilmesine izin vermeyecektir. Unutmayın, sanal olsa bile, ilk kez hatalı olduktan sonra bir yerde tutulmalıdır.
Jamie Hanrahan

5
@AcePL - kullanıcı aslında hafızası tükenmiyor. Sanal belleği tükeniyor. Bu açıklama% 100 geçerlidir.
Ramhound

1
@Rulul Basu Aslında kısa yorumun anlaşılması çok daha zor olacaktı. ;) Bu ve benzeri pek çok soru, pek çok insanın sanal bellek, adres alanları, çalışma setleri, vb. Hakkında derin yanılgılarına sahip olduğunun kanıtıdır. Onların suçu değil - bu çok karmaşık bir konudur ve MS'in gösterileri, olabilecekleri kadar net olmamıştır. . Ancak bir parçasını bile açıklamak çok fazla kelime gerektiriyor. , Windows Içselleri hangi yardım şemaları, var. Animasyonlu diyagramlar daha da iyi olurdu ...
Jamie Hanrahan

3
Muhtemel ilgi: "sadece tahsisin yapılmasına izin verin ve sonra sayfa hatalarını çözmek için uygun RAM yoksa referansların başarısız olmasına izin verin", Linux'un varsayılan olarak yaptığı ile benzerdir: belirli bir miktar fazla ödemeye izin verir, ancak bir noktada ' kirli sayfalar için sanal bellek tükenir ve bu durumda bellek dışı katil devreye girer ve tamamen ilgisiz bir süreç olabilir . Evet, iğrenç.
Bob,

1
@JamieHanrahan Zaten yaptınız gibi görünüyor (üzgünüm, biraz meşguldü). Evet, fazla ödeme yapılandırılabilir ve bazı dağıtımlar bunu devre dışı bırakacaktır. Ancak, 2013 ve 2014 yıllarında hala yaygın olduğu görülüyor ve açıkça belirlenmemişse (dağıtımdan veya kullanıcı tarafından) çekirdek varsayılanı olduğuna inanıyorum.
Bob
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.