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里。
?
?
轉載于:https://blog.51cto.com/unixlike/764885
總結
以上是生活随笔為你收集整理的Linux Free命令与cache和buffer的主要区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决flask端口被占用的问题
- 下一篇: linux如何挂载U盘