下面是free的運行結果,一共有4行。爲了方便說明,我加上了列號。這樣能夠把free的輸出當作一個二維數組FO(Free Output)。例如:windows
1 | 2 | 3 | 4 | 5 | 6 | ||
1 | total | used | free | shared | buffers | cached | |
2 | Mem: | 24677460 | 23276064 | 1401396 | 0 | 870540 | 12084008 |
3 | -/+ buffers/cache | 10321516 | 14355944 | ||||
4 | Swap: | 25151484 | 224188 | 24927296 |
一、交換分區使用狀況數組
free的輸出一共有四行,第四行爲交換區的信息,分別是交換的總量(total),使用量(used)和有多少空閒的交換區(free),這個比較清楚,不說太多。ide
二、系統分區使用狀況函數
free輸出地第二行和第三行是比較讓人迷惑的。這兩行都是說明內存使用狀況的。第一列是總量(total),第二列是使用量(used),第三列是可用量(free)。性能
第一行的輸出時從操做系統(OS)來看的。也就是說,從OS的角度來看,計算機上一共有:測試
這裏獲得第一個等式:spa
FO[2][4]表示被幾個進程共享的內存的,如今已經deprecated,其值老是0(固然在一些系統上也可能不是0,主要取決於free命令是怎麼實現的)。操作系統
三、buffer與cache使用詳情 進程
FO[2][5]表示被OS buffer住的內存。FO[2][6]表示被OS cache的內存。在有些時候buffer和cache這兩個詞常常混用。不過在一些比較低層的軟件裏是要區分這兩個詞的,看老外的洋文:內存
也就是說buffer是用於存放要輸出到disk(塊設備)的數據的,而cache是存放從disk上讀出的數據。這兩者是爲了提升IO性能的,並由OS管理。
Linux和其餘成熟的操做系統(例如windows),爲了提升IO read的性能,老是要多cache一些數據,這也就是爲何FO[2][6](cached memory)比較大,而FO[2][3]比較小的緣由。咱們能夠作一個簡單的測試:
echo 3>/proc/sys/vm/drop_caches
第二次讀應該比第一次快不少。原來我作過一個BerkeleyDB的讀操做,大概要讀5G的文件,幾千萬條記錄。在個人環境上,第二次讀比第一次大概能夠快9倍左右。
四、應用程序的角度看內存使用情況
free輸出的第二行是從一個應用程序的角度看系統內存的使用狀況。
由於被系統cache和buffer佔用的內存能夠被快速回收,因此一般FO[3][3]比FO[2][3]會大不少。
這裏還用兩個等式:
這兩者都不難理解。
free命令由procps.*.rpm提供(在Redhat系列的OS上)。free命令的全部輸出值都是從/proc/meminfo中讀出的。
在系統上可能有meminfo(2)這個函數,它就是爲了解析/proc/meminfo的。procps這個包本身實現了meminfo()這個函數。能夠下載一個procps的tar包看看具體實現,如今最新版式3.2.8。