Linux Free命令與cache和buffer的主要區別

本文是轉載的,不知道爲啥不能直接轉載到51,所以copy了下,原文地址是:

http://blog.sina.com.cn/s/blog_7a1285bb0100ziep.html

free 命令相對於top 提供了更簡潔的查看系統內存使用情況,用來顯示內存的使用情況,使用權限是所有用戶

語法

free [-b|-k|-m|-g] [-l] [-o] [-t] [-s delay] [-c count] [-V]

常用參數詳解
-b, -k,-m,-g:分別以字節( bytes、KB、MB、GB)爲單位顯示內存使用情況
-s  delay:顯示每隔多少秒數來顯示一次內存使用情況(與-c一起使用)
-c:按每隔幾秒顯示內存使用情況時的刷新次數(與-s一起使用)
-t:顯示內存總和列。
-o:不顯示緩衝區調節列
-V:free的版本

# free -m

                   total       used       free     shared    buffers     cached
Mem:          3034       2938         96          0        101       1300
-/+ buffers/cache:       1536       1497
Swap:         1983         71       1912
Total:        5018       3010       2008

Mem:表示物理內存統計

-/+ buffers/cached:表示物理內存的緩存統計

Swap:表示硬盤上交換分區的使用情況,這裏我們不去關心。

系統的總物理內存:3034M,但系統當前真正可用的內存b並不是第一行free 標記的 96M,它僅代表未被分配的內存。

我們使用total1、used1、free1、used2、free2 等名稱來代表上面統計數據的各值,1、2 分別代表第一行和第二行的數據。

total1:表示物理內存總量。

used1:表示總計分配給緩存(包含buffers 與cache )使用的數量,但其中可能部分緩存並未實際使用。

free1:未被分配的內存。

shared1:共享內存,一般系統不會用到,這裏也不討論。

buffers1:系統分配但未被使用的buffers 數量。

cached1:系統分配但未被使用的cache 數量。buffer 與cache 的區別見後面。

used2:實際使用的buffers 與cache 總量,也是實際使用的內存總量。

free2:未被使用的buffers 與cache 和未被分配的內存之和,這就是系統當前實際可用內存。

可以整理出如下等式:

total1 = used1 + free1

total1 = used2 + free2

used1 = buffers1 + cached1 + used2

 

free2 = buffers1 + cached1 + free1

1)第一行:mem,表示操作系統物理內存使用情況( 針對操作系統而言)
total 241:表示物理內存總量爲241M
used 61:表示總計分配給緩存(包含buffers 與cache,及應用程序 )使用的數量,但其中可能部分緩存並未實際使用,即61M
free 180:表示未被分配的內存數據爲180M
share 0:表示應該程序的共享內存爲0M
buffers 7:表示系統分配但未被使用的buffers數量
cached 36:表示系統分配但未被使用的cache數量
公式如下:
(1)total=used+free=61M+180M=241M
(2)used=buffers+cached (maybe add shared also)+application=7+36+17=60(因採用MB爲單位,所以存在誤差)
注意: 爲了提高磁盤存取效率, Linux做了一些精心的設計, 除了對dentry進行緩存(用於VFS,加速文件路徑名到inode的轉換), 還採取了兩種主要Cache方式:Buffer Cache和Page Cache。(呵呵!看到了吧,所以針對操作系統的內存使用情況,usered=buffers+cached+application)前者針對磁盤塊的讀寫,後者針對文件inode的讀寫。這些Cache有效縮短了 I/O系統調用(比如read,write,getdents)的時間

2)第二行:-/+ buffers/cached,表示應用程序的內存使用情況  (針對應用程序而言)
-buffers/cache:應用程序使用的內存大小(等於used-緩存值=61-7-36=18M,因採用MB爲單位,所以存在誤差)
+buffers/cache:所有可供應用程序使用的內存大小(等於free+緩存值=180+7+36=223M)
所以-buffer/cache反映的是:程序實實在在吃掉的內存;而+buffer/cache反映的是:可以挪用的內存總數
公式如下:
(1)-buffers/cache=used-buffers-cached
(2)+buffers/cache=free+buffers+cached
注意:由於第二行描述的是應用程序的內存使用情況,所以這裏的used表示當前應用程序所佔用的內存,而free則表示應用程序還可以使用內存(總的物理內存 - 應用程序已經使用的)

3)第三行:Swap,表示硬盤上交換分區的使用情況
total 1019:表示總的交換分區的空間大小
used 0:表示當前還沒有使用交換分區那部分空間
free 1019:表示還可用的交換分區的空間大小
注意:linux 系統中,如果swap分區的空量也開始使用的話,則表示你的內存可能不夠用,需要加一些內存了,因爲linux是先使用內存的容量,當內存不夠用時,纔會 使用swap分區的空間,這一點也正是與windows的區別;windows是使用swap分區,後使用內存的(看了很生氣,有內存不用,反而使用磁盤 中所劃分出來的虛擬內存,你說直接使用內存好,還是讀取磁盤好,當然是直接讀內存)



二、 buffer 與cache 的區別

A buffer is something that has yet to be "written" to disk. A cache is something that has been "read" from the disk and stored for later use.

更詳細的解釋參考:Difference Between Buffer and Cache

對於共享內存(Shared memory),主要用於在UNIX 環境下不同進程之間共享數據,是進程間通信的一種方法,一般的應用程序不會申請使用共享內存,筆者也沒有去驗證共享內存對上面等式的影響。如果你有興趣,請參考:What is Shared Memory?

cache 和 buffer的區別:

Cache:高速緩存,是位於CPU與主內存間的一種容量較小但速度很高的存儲器。由於CPU的速度遠高於主內存,CPU直接從內存中存取數據要等待一 定時間週期,Cache中保存着CPU剛用過或循環使用的一部分數據,當CPU再次使用該部分數據時可從Cache中直接調用,這樣就減少了CPU的等待 時間,提高了系統的效率。Cache又分爲一級Cache(L1 Cache)和二級Cache(L2 Cache),L1 Cache集成在CPU內部,L2 Cache早期一般是焊在主板上,現在也都集成在CPU內部,常見的容量有256KB或512KB L2 Cache。

Buffer:緩衝區,一個用於存儲速度不同步的設備或優先級不同的設備之間傳輸數據的區域。通過緩衝區,可以使進程之間的相互等待變少,從而使從速度慢的設備讀入數據時,速度快的設備的操作進程不發生間斷。

Free中的buffer和cache:(它們都是佔用內存):

buffer : 作爲buffer cache的內存,是塊設備的讀寫緩衝區

cache: 作爲page cache的內存, 文件系統的cache

如果 cache 的值很大,說明cache住的文件數很多。如果頻繁訪問到的文件都能被cache住,那麼磁盤的讀IO bi會非常小。

參考:http://bbs.chinaunix.net/archiver/tid-478109.htmlhttp://bbs.chinaunix.net/archiver/tid-478109.html

另:

說一下我的理解:
        cache, 是用來加速讀取的一種方法。目的是加速讀取。物理上,有cpu管理的L1 cache, L2 cache (both data cache and instruction cache), 和memory裏的cache (如os管理的文件系統cache).

      對於cache的訪問, 分爲cache hit or cache miss. 通常cache越大, cache命中率就越高,訪問速度越快。訪問者不知道數據一定在cache中。

       Buffer, 只指memory的區域, 軟件用來保存特定的信息。buffer按需分配,足夠保存數據就行了,不求最大。軟件有合適的機制,知道數據在buffer裏。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章