Neden kısmen dolu RAM gecikmeye neden olur?


53

Neden kısmen dolu RAM (% 80 diyelim), daha fazla veri depolamak için yeterli alan olmasına rağmen cihazı çok geciktiriyor? Beklediğim şey% 99'a kadar iyi çalışmaya devam etmesi.

PC’de olduğundan daha fazla RAM’de olduğundan daha küçük bir RAM olduğundan, örneğin cep telefonumun 2 GB RAM’e sahip olduğunu; 1 GB'den daha az RAM ücretsiz olduğunda, çok fazla gecikiyor! Kullanması için hala ~ 1 GB olmasına rağmen, neden bu oluyor?


28
Kullanılabilir RAM'in kullanılmadığını varsaydığınızı düşündüm. Yani% 20 RAM olduğunu görüyorsunuz ve RAM'in yalnızca% 80'inin kullanıldığını düşünüyorsunuz. Bu yanlış, RAM hem kullanılabilir hem de kullanılabilir. (Örneğin, şu anda kullandığım makinede 32 GB RAM ve 21,1 GB kullanılabilir, ancak yalnızca 1,8 GB ücretsiz.)
David Schwartz

2
RAM'imdeki HDD boş alanımı mı kastediyorsun? kesinlikle değil.
Mohammed Noureldin

3
Elbette değiştirilebilirler. Ancak bunun performans üzerinde çok büyük bir olumsuz etkisi olacak - tam da gördüğünüz gibi. Çalışma seti RAM'i aşarsa, ne kadar RAM kullanılabilir olursa olsun performans korkunç olacaktır.
David Schwartz

3
Cihazı geciktiren RAM yüzdesi olduğunu düşündüren nedir?
enkryptor

4
@MohammedNoureldin RAM'inizin meşgul olmasının bir nedeni olmalı (birkaç işlem çalışıyor ve bir şeyler yapıyor). Bu, cihazın gecikmesinin nedeni aynı olabilir. RAM yüklemesi nedenin kendisi değil sadece bir belirti olabilir.
enkryptor

Yanıtlar:


70

Burada çok işin var ancak bunu mümkün olduğunca basit ve herhangi bir işletim sistemi için geçerli bir şekilde açıklamaya çalışacağım.

Burada 2 temel ilke var:

  1. RAM'de olması gereken her şeyin toplamı ve RAM'de olmasından fayda sağlayacak olanların toplamı, RAM boyutundan hemen hemen her zaman daha yüksektir. RAM'de olmanın faydaları, süreç çalışma setlerini ve bekleme listesini içerir. Sonuncusu, bir kez aktif kullanımda olan, ancak o zamandan beri etkinlik dışı kalmasına neden olan veri ve kodları içerir. Bunun çoğu tekrar kullanılacak, bazıları çok yakında olacak, bu yüzden bunu RAM'de tutmakta fayda var. Bu bellek bir önbellek görevi görür, ancak gerçekten gerekli değildir, bu nedenle mevcut bellek kategorisindedir. Boş hafıza gibi, ihtiyacı olan herhangi bir programa hızlıca verilebilir. Performansın çıkarları doğrultusunda bekleme belleği büyük olmalıdır.

  2. Bellek bloklarının kullanım sıklığı rastgele olmaktan uzaktır ancak önemli bir doğrulukla tahmin edilebilir. Bellek genellikle 4K bayt olmak üzere bloklara bölünür. Bazı bloklara saniyede birçok kez erişilirken, sisteme yeterince uzun süre kaldıysa diğerlerine uzun dakikalar, saatler, günler veya hatta haftalar boyunca erişilmez. Bu iki aşırı uç arasında geniş bir kullanım alanı vardır. Hafıza yöneticisi son zamanlarda hangi bloklara erişildiğini ve hangilerinin erişmediğini biliyor. Son zamanlarda erişilmiş bir bellek bloğuna kısa süre sonra tekrar ihtiyaç duyulacağı makul bir varsayımdır. Yakın zamanda erişilmemiş bir hafızaya muhtemelen yakın bir zamanda ihtiyaç duyulmayacak. Uzun deneyim bunun geçerli bir ilke olduğunu kanıtlamıştır.

Hafıza yöneticisi, ilkinin istenmeyen sonuçlarını büyük ölçüde azaltmak için ikinci prensipten yararlanır. Bunu yapmak için, son zamanlarda erişilen verileri RAM'de tutarken, nadiren kullanılan verileri orijinal dosyalarda veya sayfa dosyasında tutarken dengeleyici bir işlem yapar.

RAM bol olduğunda bu dengeleme eylemi kolaydır. Son zamanlarda kullanılmayan verilerin çoğu RAM'de tutulabilir. Bu iyi bir durum.

İş yükü arttıkça işler daha da karmaşıklaşıyor. Kullanılan veri ve kodların toplamı daha büyük ancak RAM'in boyutu aynı kalıyor. Bu, bunun daha küçük bir alt kümesinin RAM'de tutulabileceği anlamına gelir. Daha az kullanılmış olan verilerden bazıları artık RAM'de olamaz, ancak diskte bırakılması gerekir. Hafıza yöneticisi aktif kullanımdaki hafıza ile mevcut hafıza arasında iyi bir denge kurmak için çok çaba harcıyor. Ancak iş yükü arttıkça, hafıza yöneticisi çalışan işlemlere daha fazla hafıza vermek zorunda kalacak. Bu iyi bir durum değil ama hafıza yöneticisinin başka seçeneği yok.

Sorun, programları çalıştırırken verileri RAM'e ve RAM'den taşımak zaman alıyor. RAM bol olduğunda, çok sık olmaz ve fark edilmez. Ancak RAM kullanımı yüksek seviyelere ulaştığında, çok daha sık olur. Durum o kadar kötü hale gelebilir ki verileri RAM'e ve RAM'e taşıyarak harcayarak harcadığınızdan daha fazla zaman harcanır. Bu, çökmekte olan bir şeydir, bellek yöneticisinin kaçınması çok zor bir şeydir, ancak yüksek iş yüküyle çoğu zaman önlenemez.

Hafıza yöneticisi yanınızdadır, her zaman olumsuz koşullarda bile optimum performansı korumanın en iyisini yapmaya çalışıyorum. Ancak iş yükü büyük olduğunda ve kullanılabilir hafıza yetersiz olduğunda, çalışmaya devam etmesi için kötü şeyler yapması gerekir. Aslında en önemli şey budur. Öncelikle ilk önce işleri devam ettirmek, sonra da mümkün olduğunca hızlı hale getirmektir.


1
Cevabınız bana çok yardımcı oldu, teşekkür ederim! Bu memory mangerbenim OShakkımın bir parçası mı? Öyleyse, işaretçilerle ve bu çok düşük seviyeli şeylerle uğraşıyorsam, yine de sayfalama yapabilir mi?
Mohammed Noureldin

7
Bellek yöneticisi işletim sisteminin bir parçasıdır. Çağrı, hafıza yöneticisinin temel bir işlevidir ve nefes alıp verme işlemi sizin ve benim için olduğu kadar önemlidir.
LMiller7

2
@MohammedNoureldin: Kullanıcı alanı uygulamaları yazarken (bellek görünümleri çekirdekten ve diğer işlemlerden izole edilmiştir) doğrudan fiziksel belleğe erişemezsiniz . All erişebilir tarafından yönetilen belleğinde bir görünümdür - (muhtemelen) çağrı dahil tüm özellikleri ile bellek yöneticisi - tahmin. Bellek işaretçileri, yalnızca bellek görünümünün adres alanlarındaki noktalara işaret eder. Hem çekirdek hem de kullanıcı alanı kodunda kullanılan bir dil kavramıdır, ancak bu iki bellek görünümünün aynı olduğu anlamına gelmez. İşlem belleği yönetimini çekirdek MM ile karıştırmayın!
David Foerster

6
'Açıktır' veya 'iyi bilinir', ancak belki de hala bu cevaba eklemelisiniz: bellek (ram) sabit diskten 1000 kat daha hızlıdır (peki, pek çok şeye bağlı, örneğin ssd / ide). / sata, vb.) İşletim sistemi kodu diskten değil, ram (+ önbellek) kodundan çalıştırır. Bellek azaldığında ve işletim sisteminin ("kullanılmayan") kod bölümlerini "diskten diske" takması ", başka bir şeyi çalıştırmak için ram serbest bırakması gerektiğinde, bu çok zaman alır (değiştirme) ve eğer bu sık sık gerçekleşirse (örneğin: birçok programınız varsa, her birinin kodunu belleğe yüklemek için bir takas yapmanız gerekiyordu), işleri yavaşlatır.
Olivier Dulac

3
Genellikle "takas" terimini, kodun belleğe yüklenmesini ifade etmek için kullanmayız. Buna genellikle "hata" denir. Genellikle "takas" terimi sadece RAM'den çıkarılmadan önce diske yazılması gereken bilgiler için kullanılır.
David Schwartz

29

Tüm modern işletim sistemleri, verileri önbelleğe almak için kullanılmayan belleği kullanır; böylece daha yavaş depolama yerine hızlı RAM'den erişilebilir. Genelde boş bellek olarak bildirir, çünkü uygulamalar önbelleği temizleyebilir ve gerektiğinde kullanabilirler, ancak hala kullanılıyor. Ne kadar az olursa, o kadar az veri önbelleğe alınabilir ve bilgisayar o kadar yavaş olur.


11
Aslında, uygulamaların önbelleği "temizlemesi" gerekmez. Sadece işletim sisteminden RAM talep ediyorlar. Kullanılmayan bir RAM olmadığını gören işletim sistemi, dosya önbelleğinin bir bölümünü temizler ve şimdi sıfırlanmış RAM'i uygulamaya verir. Uygulama, RAM'in nereden geldiğini söyleyemez.
MSalters

5
@ MSalters Evet, katılıyorum, uygulama RAM ister ve gerekirse işletim sistemi önbelleğini temizler. Basit tutmaya çalışıyordum.
Mike Scott,

Bu biraz netti, ama detaylar hakkında biraz daha farkındayım, bu yüzden bir şeylerin eksik olduğu ve daha fazla ayrıntıya ihtiyacım olduğu hissine kapıldım @MMiller cevap aslında bana yardımcı oldu, bu düzeltmeyi çok iyi içindeki bilgiler.
Mohammed Noureldin

4

Bu cevap çoğunlukla yapıyı yeniden düzenlemek ve mesajı netleştirmek için yeniden yazılmıştır. Ayrıca bir topluluk wiki cevabı olarak da açtım; Düzenlemek için çekinmeyin.

Disk belleği, sabit boyutlu bellek bloklarının kendilerine atanmış işlemlere sahip olduğu bir bellek yönetimi şemasıdır. Bellek kullanımı yüksek bir seviyeye (yani% 80 kapasite) yükseldiğinde, disk belleği RAM'den vRAM'a (sanal RAM) yayılmaya başlar.

vRAM sistem depolama alanında, genellikle bir sabit sürücü veya diğer büyük depolama alanlarında bulunur.

İşlemler, sabit sürücünüzün bir parçası olarak bellek olarak çalışacak ve bölümlerini RAM olarak değerlendirecek. Bu tamamen normal bir işlemdir, ancak vRAM'a veri aktarımı için harcanan zaman arttığında, sistem performansı düşer.

Özel RAM'e, ana kart üzerinden CPU'dan hızlı bir bağlantı sağlayan doğrudan erişilirken, sanal RAM kart ile vRAM'ın yeri arasında kablo geçişi yapmak zorundadır.

Ancak bu, yalnızca hafif bir performans etkisine neden olur. Disk belleği vRAM'a gerçekleştiğinde, şiddetli bir şekilde arttığında (özel RAM kapasiteye yaklaştığında), çökme gerçekleşir.

Thrashing, bellek sayfalarını hızlı ve hızlı bir şekilde sanal belleğinize aktarma uygulamasıdır. Verilerin alınması ve ele alınması için daha fazla zaman harcanması gerektiğinden, bu performans üzerinde büyük bir zahmete neden olur.

Diyelim ki, 30 rakam uzunluğunda bir sayı yazmak istiyorsunuz. Ekranınızın yanına not defterinizle oturabilir ve (özel hafızayı kullanarak) yazabilir veya 5 parçalarını hatırlayabilir, bir sonraki odaya girebilir ve oradaki not defterinize yazabilirsiniz (sanal belleği kullanarak). Her ikisi de işi halleder ama hangisi daha hızlı olacak?

Burada thashing hakkında daha fazla bilgi edinin !

Daniel B , xenoid ve Jon Bentley de dahil olmak üzere bu cevabın katılımcılarına teşekkür ederiz .


3
Gıcık kasıtlı olduğu gibi değil. Bu sadece fiziksel hafıza için çağrı ve rekabet yan etkisi. Ayrıca sanal disk, sayfaları diske taşıyarak “oluşturulmaz”.
Daniel B,

Thrashing, bir yan üründür, doğru, ancak süreçlerin aktığı zaman, ızgara kilitlenmesini önlemeye yardımcı olan, son derece yararlıdır. Ve evet, sanal hafıza yaratılmaktan ziyade işgal altında. Bunu düzenleyeceğim.
Will

8
Hayır, paramparça etmek ve çağrı yapmakla karıştırıyorsun. Trashing sadece sayfalama patolojik hale geliyor.
xenoid

@ xenoid Çağrı, bir bellek yönetim şemasıdır; Tıpkı arabamla ve otoyol sistemiyle bir geyiği vurmakla karıştırdığım gibi. Thrashing, performanstaki bu düşüşe neden olan süreçtir; Bununla birlikte, bunun çağrı sisteminin bir sonucu olduğuna katılıyorum.
Will

1
Yorum yazdı, wiki yanıtı yapıldı, düzenleme yapmaktan çekinmeyin.
Will

1

Bunun nedeni, işletim sisteminizin yazılımınızın çalışmasını sağlamak için çok fazla sayfalama (etkin programların parçalarını yükleme) ve takas etme (RAM’de HD’ye taşıma ve tam tersi) yapmasıdır. Kullanılabilir% 20'den daha fazla alana ihtiyaç duyacak yeni sayfaların yüklenmesi gerektiğinde, işletim sisteminin RAM'de yakında kullanılmasının daha az muhtemel olduğunu düşündüğü mevcut sayfaları değiştirmek zorunda kalacaktır. Özellikle diğer programların başlangıcında. Sayfaları değiştirmek ve tekrar değiştirmek çok zaman alıyor ve PC'nizin performansını önemli ölçüde yavaşlatıyor çünkü siz RAM'de değil, HD hızında çalışıyorsunuz.

HD'nizde özel bir bölüm oluşturmak için sabit disk üzerinde biraz yardımcı olur ve bunu “takas” ("gerçek" dosyalar için kullanmayın) alanı olarak atar, böylece takas işlemi HD parçalanmasından daha az etkilenir.


ROM, önbelleğe alma, çağrı, vb. Hakkında konuşurken yalnızca HD'nin isimlendirilmesidir. Ve ROM genellikle RAM'den daha yavaştır, neredeyse her zaman olmuştur. Eski bilgisayarlar, önyükleme yaparken daha hızlı çalıştığı için verileri ROM'dan RAM'e (ROM Shadowing) kopyaladı.
Gilles Lesire,

1
Tabii, fakat ROM ve RAM aynı zamanda kalıcı bellek olarak mı kullanılıyor? BTW ROM genellikle daha yavaştır, ROM performans kazanımları için önyüklemede RAM’e (ROM Gölgeleme) kopyalanır. Ama elbette, nitpicking'ınızı düzeltmek için bir referansı değiştireceğim. ;)
Gilles Lesire

1

Unutmayın, sabit sürücüler RAM'den daha yavaş bir büyüklük sırasıdır ve RAM'in başlaması o kadar hızlı değildir (genel olarak mimaride). Erişim hızını (her basamağın yukarıdakinden daha yavaş olduğu bir büyüklük sırası olduğu)

  1. İşlemci kayıtları - Pratik açıdan, 1 işlemci döngüsü içinde kayıtlar kullanılabilir . İşlemcilerin saniyede milyarlarca döngü (bir saniyede 3 GHz = 3 milyar döngü) yaptığı göz önüne alındığında, bu çok hızlı.
  2. İşlemci önbelleği - Seviyeye bağlı, ancak bunlar hala oldukça hızlı (L1 önbellek için 3-5 döngü kullanılabilirliği).
  3. Rasgele Erişim Belleği (RAM) - Rasgele bölüm, eriştiğinizde hangi durumda olduğunu bilmediğiniz anlamına gelir. Durması, paketi kaldırması, kapıya yürümesi ve kapı zilini çalması ve cevap beklemesi gereken bir paket teslim adamı düşünün. Belki de hiç beklemiyorsunuz ya da Bayan Smith'in evin arkasındaki kapıyı karıştırması için bir veya iki dakika beklemektesiniz. Pratik olarak, 14-27 devir arasında herhangi bir yerde konuşuyoruz (ona erişirken RAM'in hangi duruma bağlı olduğuna bağlı olarak).
  4. Sabit Disk Sürücüsü - Burada şimdi fiziksel bir işlem var ve mümkün olduğu kadar hızlı olduğunda kafaların hareket etmesini ve bu kafaların altında hareket etmesini bekliyorsunuz. Pratik açıdan, bir 7.200 RPM HDD, bir 3 GHz işlemci için yaklaşık 4 ms veya yaklaşık 750.000 döngüde bir devrimi tamamlayabilir . Bu yavaş.

Sanal Bellek Yöneticisi bir kumarbazdır. Her zaman RAM'inize her zaman ihtiyaç duymadığınıza bahse girer, bu nedenle eğitimli bir tahmin yapar ve belge programınızın (bunu okurken son 10 dakikadır arka planda bulunan) zar atmadığı anlamına gelir gerçekten önemli ve onu HDD'ye zorluyor.

Ama sonra belgeye geri dön! Şimdi VMM'nin tüm bu verileri HDD'den geri yüklemesi gerekiyor. Daha da kötüsü, RAM'ınız düşükse, şimdi kullanılabilir alanı boşaltmak için diğer verileri (daha fazla kumar) HDD’ye itmek zorundadır. Linux burada sınırda yaşamayı seviyor. RAM'ın büyük çoğunluğunu sık kullanılan verilerle dolduracaktır (az sayıda işleme sahip sunucular için idealdir).


1
Evet, hafıza yöneticisi bir kumarbaz ama bu çok kolay bir şekilde yanlış anlaşılabilir. Eğer hafıza erişimi gerçekten rastgele olsaydı, hafıza yöneticisi doğru sıklıkta yanlış olurdu ve tüm sistem bozulurdu. Ancak, programlar güçlü bir referans yeri gösterme eğilimindedir. Bu, çoğu hafıza erişiminin nispeten küçük bir hafıza alanına lokalize olma eğilimindedir. Hareket ediyorlar ancak sistemin çalışması için yeterince yavaş. Oranlar hafıza yöneticilerinin lehine toplandı ve hatalar hızla düzeltildi. Bu, onlarca yıllık deneyim boyunca kanıtlanmıştır
LMiller7,

Rastgele Erişim Belleğindeki Rastgele, herhangi birine rastgele erişebileceğiniz gerçeğini ifade eder. (Verilerin, bir sabit sürücü veya kasette olduğu gibi okuma kafalarının altından geçmesini beklemek zorunda kalmamak ve ardından verilere sırayla erişmek.).
Phil

0

Thrashing cevapları hemen hemen çiviledi. Yapabiliyorsanız, bu değişimin ne kadar hızlı olacağını en aza indirebilirsiniz (takas alanını değiştirmeden önce sistemin kullanılmasına ne kadar ram olacağı). Sunucu uygulamaları için ram% 99'a ulaşana kadar sistemleri değiş tokuş etmeyecek şekilde ayarlamayı seviyorum, çünkü varsayılan olarak etkili bir şekilde itme için cezalandırılmadan önbellekleme avantajından yararlanmak için koçun yalnızca% 80'ini kullanacak şekilde kodlama yapmam gerekeceği anlamına geliyor. Sistem takas alanına.

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.