Linux'ta buffer vs cache memory arasındaki fark nedir?


179

Bana göre iki Linux bellek konsepti arasındaki farkın ne olduğu belli değil: bufferve cache. Ben baştan sona kadar okuduktan bu yazı ve aralarındaki farkın son kullanma politikası geliyor bana:

  1. arabellek ilk giren ilk çıkar
  2. önbellek politikası En Son Kullanılanlardır.

Haklı mıyım?

Özellikle, iki komuta bakıyorum: freevevmstat

james@utopia:~$ vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
5  0      0    173     67    912    0    0    19    59   75 1087 24  4 71  1
james@utopia:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2007       1834        172          0         67        914
-/+ buffers/cache:        853       1153
Swap:         2859          0       2859

Bize daha fazla bağlam vermelisiniz, her iki terim de farklı anlamlarla kullanılır. freeKomut çıkışına mı başvuruyorsunuz ?
leonbloy

3
haklısın, iki komuta bakıyorum: ücretsiz, vmstat. güncellemelerime bakın.
James.Xu

Yanıtlar:


69

"Tamponlar", RAM'in ne kadarının önbellek bloklarına ayrıldığını gösterir. "Önbellek", "Tamponlar" ile benzerdir, ancak bu sefer sayfaları dosya okumasından önbelleğe alır.

Alıntı yapmak:


3
Bunu büyük miktarda blok yazan basit bir python programı kullanarak test ettim. Ne olur sütun cachetarafından free -w -hdeğil rapor tarafından doldurulur doldurulur olduğunu buffers. Ben cachesütun hem disk yazma hem de disk okuma sayar ve buffersbaşka bir şey için kullanılır düşünüyorum.
CMCDragonkai

@CMCDragonkai deneysel kanıt için teşekkürler. İlginç soru, diskin temizlenebileceğinden daha hızlı yazıp yazmadığınızdır. (örneğin senkronizasyon uzun zaman alacaktır) bu da kirli blokların temiz bloklardan farklı sayıldığını gösterir. Linux kesinlikle her iki türü de önbelleğe alacaktır (soruda belirtildiği gibi) ancak biri bellek baskısı açısından çok daha ciddidir.
Seth Robertson

179

Tamponlar belirli bir blok cihazla ilişkilendirilir ve uçuş sistemi sayfalarının izlenmesinin yanı sıra dosya sistemi meta verilerinin önbelleğe alınmasını da kapsar. Önbellek yalnızca park edilmiş dosya verilerini içerir. Yani, arabellekler dizinlerde ne olduğunu, dosya izinlerinin ne olduğunu hatırlar ve belirli bir blok cihaz için hangi belleğin yazıldığını veya okunduğu belleğin kaydını tutar. Önbellek yalnızca dosyaların içeriğini içerir.

teklif bağlantısı


1
Kısa ve iyi açıklanmış. Teşekkürler.
curiousguy

84

Alıntılanan cevap (referans için):

Kısa cevap: Önbellek, sayfa önbelleğinin boyutudur. Tamponlar, bellek içi blok I / O tamponlarının boyutudur. Önbelleğe alınmış konular; Tamponlar büyük ölçüde ilgisizdir.

Uzun yanıt: Önbellek, SwapCached tarafından temsil edilen takas önbelleğindeki bellek eksi olarak Linux sayfa önbelleğinin boyutudur (bu nedenle toplam sayfa önbellek boyutu Önbellek + SwapCached'dir). Linux tüm dosya G / Ç'lerini sayfa önbelleği aracılığıyla gerçekleştirir. Yazmalar, sayfa önbelleğindeki karşılık gelen sayfaları kirli olarak işaretleyerek uygulanır; sifon iplikleri daha sonra düzenli aralıklarla kirli sayfaları diske yazar. Okumalar, sayfa önbelleğindeki veriler döndürülerek gerçekleştirilir; veriler henüz önbellekte değilse, önce doldurulur. Modern bir Linux sisteminde, Önbellek kolayca birkaç gigabayt olabilir. Sadece bellek basıncına tepki olarak küçülecektir. Sistem, gerektiğinde daha fazla bellek sağlamak için sayfa önbelleğini verileri diske değiştirerek temizler.

Tamponlar bellek içi blok I / O tamponlarıdır. Nispeten kısa ömürlüdürler. Linux çekirdek 2.4 sürümünden önce, Linux'un ayrı sayfa ve arabellek önbellekleri vardı. 2.4 sürümünden bu yana, sayfa ve arabellek önbelleği birleştirilmiştir ve Arabellekler, sayfa önbelleğinde temsil edilmeyen (yani dosya verileri değil) ham disk bloklarıdır. Tamponlar metriği bu nedenle çok az öneme sahiptir. Çoğu sistemde Tamponlar genellikle sadece onlarca megabayttır.


7
"Arabellekler büyük ölçüde ilgisizdir" - Hayır. Dosya içeriği önbelleğe almanın önemsiz olduğu, ancak meta verileri önbellekte tutmanın birçok şeyi hızlandırdığı durumlar vardır. Örneğin, bir video akışı NAS sunucusu.
Gunther Piez

Çok fazla G / Ç yapan her sistem arabellekler için çok fazla bellek kullanır. 100GB MySQL / InnoDB veritabanını toplu olarak yüklüyorum ve arabellekler her zaman 2GB'ın üzerine çıkıyor.
Marcelo Pacheco

21

Bu kadar basit değil, ama anlamaya yardımcı olabilir:

Arabellek dosya meta verilerini (izinler, konum vb.) Saklamak içindir. Her bellek sayfası buradan takip edilir.

Önbellek, gerçek dosya içeriğini depolamak içindir.


5
IOW, Buffer = Meta veri; Önbellek = Veri;
Freedom_Ben

13

RedHat tarafından açıklanmıştır :

Önbellek Sayfaları:

Önbellek, verileri şeffaf bir şekilde depolayan ve böylece bu veriler için gelecekteki isteklerin daha hızlı sunulabileceği bir parçasıdır. Bu bellek çekirdek tarafından disk verilerini önbelleğe almak ve G / Ç performansını artırmak için kullanılır.

Linux çekirdeği, yerel ve uzak dosya sistemlerinizden ve disklerinizdeki bilgileri önbelleğe almak için olabildiğince fazla RAM kullanacak şekilde oluşturulmuştur. Zaman, sistem üzerinde çeşitli okuma ve yazma işlemleri yapıldıkça, çekirdek sistemde çalışan çeşitli işlemler veya yakın gelecekte kullanılacak ilgili işlemlerin verileri için bellekte depolanan verileri tutmaya çalışır. Önbellek, işlemin durdurma / çıkış işleminin yapıldığı zamanda geri alınmaz, ancak diğer işlemler kullanılabilir boş bellekten daha fazla bellek gerektirdiğinde, çekirdek önbellek verilerini depolayarak ve bu belleği yeni işleme atayarak belleği geri almak için sezgisel tarama çalıştırır.

Herhangi bir dosya / veri istendiğinde, çekirdek kullanıcının üzerinde çalıştığı dosyanın bir kopyasını arayacak ve böyle bir kopya yoksa, yeni bir önbellek sayfası ayıracak ve uygun içerikler diskten okunur.

Önbellekte saklanan veriler, daha önce hesaplanan değerler veya diskte başka bir yerde saklanan orijinal değerlerin kopyaları olabilir. Bazı veriler istendiğinde, önbellek ilk önce bu verileri içerip içermediğini kontrol eder. Veriler önbellekten kaynak kökeninden daha hızlı bir şekilde alınabilir.

SysV paylaşılan bellek segmentleri de disklerde herhangi bir veri temsil etmese de önbellek olarak hesaplanır. Paylaşılan bellek segmentlerinin boyutu ipcs -m komutunu kullanarak ve bayt sütununu kontrol ederek kontrol edilebilir.

Tamponlar:

Arabellekler, sayfa önbellekleri altında depolanan verilerin disk bloğu temsilidir. Arabellekler, sayfa önbelleğinin altında bulunan dosyaların / verilerin meta verilerini içerir. Örnek: Sayfa önbelleğinde bulunan herhangi bir verinin talebi olduğunda, önce çekirdek, sayfa önbelleklerinde bulunan gerçek dosyaları / verileri gösteren meta verileri içeren tamponlardaki verileri kontrol eder. Meta verilerden, dosyanın gerçek blok adresi bilindikten sonra, işlem için çekirdek tarafından alınır.


12

arabellek ve önbellek.

Bir arabellek henüz diske "yazılmamış" bir şeydir.

Önbellek, diskten "okunan" ve daha sonra kullanılmak üzere saklanan bir şeydir.


2
yeni kullanıcı ipucu: Cevabınızı soru ile mümkün olduğunca açık bir şekilde ilişkilendirin. Eğer siz olsaydım, cevabınıza "Yani, örneğin ..." ile başlayan bir bölüm eklerdim ve bununla ilgili biraz ayrıntı veririm.
Piotr Wadas

25
Bu cevabın sorunun cevabı ile aynı bağlamda doğru olduğunu düşünmüyorum (yani, Linux çekirdeğinin "tampon" ve "önbellek" ile ne anlama geldiği
Freedom_Ben

8

Bu sayfanın tampon ve önbellek arasındaki farkı derinlemesine anlamaya yardımcı olacağını düşünüyorum. http://www.tldp.org/LDP/sag/html/buffer-cache.html

Diskten okuma, (gerçek) belleğe erişmeye kıyasla çok yavaştır. Ek olarak, nispeten kısa süreler boyunca bir diskin aynı kısmını birkaç kez okumak yaygındır. Örneğin, bir kişi önce bir e-posta mesajını okuyabilir, ardından mektubu yanıtlarken bir düzenleyiciye okuyabilir, sonra posta programının bir klasöre kopyalarken tekrar okumasını sağlayabilir. Veya, komutun lsbirçok kullanıcılı bir sistemde ne sıklıkta çalıştırılabileceğini düşünün . Diskteki bilgileri yalnızca bir kez okuyarak ve artık gerekmeyene kadar bellekte tutarak, ilk okuma dışındaki her şey hızlanabilir. Buna disk arabelleğe alma denir ve bu amaçla kullanılan belleğe tampon önbellek denir.

Bellek, ne yazık ki, sınırlı, nay, kıt bir kaynak olduğundan, tampon önbellek genellikle yeterince büyük olamaz (hiç kullanmak istediği tüm verileri tutamaz). Önbellek dolduğunda, en uzun süre kullanılmayan veriler atılır ve bu şekilde serbest bırakılan bellek yeni veriler için kullanılır.

Disk arabelleği yazma işlemleri için de kullanılabilir. Bir yandan, yazılan veriler genellikle kısa süre sonra tekrar okunur (örneğin, bir kaynak kod dosyası bir dosyaya kaydedilir, daha sonra derleyici tarafından okunur), bu nedenle önbelleğe yazılan verileri koymak iyi bir fikirdir. Öte yandan, verileri önbelleğe koyarak, bir kerede diske yazmamakla, yazan program daha hızlı çalışır. Daha sonra yazma işlemleri diğer programları yavaşlatmadan arka planda yapılabilir.


Bu, tampon önbelleğinin ne olduğunu açıklar, ancak vmstat ve free komutlarının çıktılarındaki tampon ve önbellek arasındaki farkın ne olduğunu açıklamaz.
Roel Schroeven

4

Seth Robertson'ın 2. Bağlantısı "Bu terimlerin tam olarak anlaşılması için Robert M. Love'ın Linux Çekirdek Geliştirme gibi Linux çekirdek kitabına bakın."

Kitabın 2. baskısında 'tampon' ile ilgili bazı içerikler buldum.

Fiziksel cihazın kendisi sektör düzeyinde ele alınabilse de, çekirdek tüm disk işlemlerini bloklar olarak gerçekleştirir.

Bir blok bellekte saklandığında (örneğin, okuduktan veya yazmayı bekledikten sonra), bir 'tamponda' saklanır. Her 'tampon' tam olarak bir blok ile ilişkilidir. 'Buffer' bellekte bir disk bloğunu temsil eden nesne olarak işlev görür.

'Tampon', tek bir fiziksel disk bloğunun bellek içi temsilidir.

Blok G / Ç işlemleri bir seferde tek bir disk bloğunu değiştirir. Genel bir blok G / Ç işlemi, düğümleri okumak ve yazmaktır. Çekirdek, diskten tek bir bloğun düşük düzeyde okunmasını sağlamak için bread () işlevini sağlar. 'Tamponlar' ile disk blokları ilişkili bellek içi sayfalarıyla eşlenir. "


2

Arabellek yazma performansını artırmaya yardımcı olan meta veriler içeriyor

Önbellek, okuma performansını artıran dosya içeriğini (bazen diske yazmak için) içerir.


1

Kitaptan alıntı: Bilgi Edinmeye Giriş

Önbellek

Hafızada, özellikle sık sık erişmemiz gereken verilerde olabildiğince fazla veri tutmak istiyoruz. Sık kullanılan disk verilerini ana bellek önbelleklemesinde tutma tekniğini çağırıyoruz.

Tampon

İşletim sistemleri genellikle tüm blokları okur ve yazar. Bu nedenle, diskten tek bir bayt okumak tüm bloğu okumak kadar zaman alabilir. 8, 16, 32 ve 64 kilobayt (KB) blok boyutları yaygındır. Ana belleğin, okunmakta veya yazılmakta olan bir bloğun bir arabellek depolandığı kısmını çağırıyoruz.


0

Arabellek, bir bilgisayardaki bir yerden başka bir yere taşınırken verileri geçici olarak tutmak için kullanılan bellek bölgesidir. Önbellek, hızlı erişim için sık erişilen verilerin saklanabileceği geçici bir depolama alanıdır. Veriler önbellekte saklandıktan sonra, orijinal verilerin yeniden getirilmesi yerine önbelleğe alınmış kopyaya erişilerek gelecekteki kullanım yapılabilir, böylece ortalama erişim süresi daha kısa olur.

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.