共享記憶體
對於共享記憶體(shared memory),主要用於在unix 環境下不同程序之間共享資料,是程序間通訊的一種方法,一般的應用程式不會申請使用共享記憶體,筆者也沒有去驗證共享記憶體對上面等式的影響。
例如linux平台的oracle為多程序程式,sga和pga都是各程序共享和通訊的資料區域,所有可以看到分配了很大的共享記憶體。而mysql為多執行緒,系統級表現為乙個程序,不需要共享記憶體。
linux的cache和buffer有何區別
linux下對檔案的訪問和裝置的訪問通常會被cache起來加快訪問速度,這個是系統的預設行為。 而cache需要耗費我們的記憶體,雖然這個記憶體最後可以通過echo 3>/proc/sys/vm/drop_caches這樣的命令來主動釋放。但是有時候我們還是需要理解誰消耗了我們的記憶體。
我們來先了解下記憶體的使用情況: :
page cache和buffer cache一直以來是兩個比較容易混淆的概念,在網上也有很多人在爭辯和猜想這兩個cache到底有什麼區別,討論到最後也一直沒有乙個統一和正
確的結論,在我工作的這一段時間,page cache和buffer cache的概念曾經困擾過我,但是仔細分析一下,這兩個概念實際上非常的清晰。如果能夠了解到這兩個cache的本質,那麼我們在分析io問題的時候可能會更加得心應手。 page cache實際上是針對檔案系統的,是檔案的快取,在檔案層面上的資料會快取到page cache。檔案的邏輯層需要對映到實際的物理磁碟,這種對映關係由檔案系統來完成。當page cache的資料需要重新整理時,page cache中的資料交給buffer cache,但是這種處理在2.6版本的核心之後就變的很簡單了,沒有真正意義上的cache操作。
buffer cache是針對磁碟塊的快取,也就是在沒有檔案系統的情況下,直接對磁碟進行操作的資料會快取到buffer cache中,例如,檔案系統的元資料都會快取到buffer cache中。
簡單說來,page cache用來快取檔案資料,buffer cache用來快取磁碟資料。在有檔案系統的情況下,對檔案操作,那麼資料會快取到page cache,如果直接採用
dd等工具對磁碟進行讀寫,那麼資料會快取到buffer cache補充一點,在檔案系統層每個裝置都會分配乙個def_blk_ops的檔案操作方法,這是裝置的操作方法,在每個裝置的inode下面會存在乙個radix tree,這個radix tree下面將會放置快取資料的page頁。這個page的數量將會在top程式的buffer一欄中顯示。如果裝置做了檔案系統,那麼會生成乙個inode,這個inode會分配ext3_ops之類的操作方法,這些方法是檔案系統的方法,在這個inode下面同樣存在乙個radix tree,這裡會快取檔案的page頁,快取頁的數量在top程式的cache一欄進行統計。從上面的分析可以看出,2.6核心中的buffer cache和page cache在處理上是保持一致的,但是存在概念上的差別,page cache針對檔案的cache,buffer是針對磁碟塊資料的cache,僅此而已。
更通俗一點說:buffers主要用來存放目錄裡面有什麼內容,檔案的屬性以及許可權等等。而cached直接用來記憶我們開啟過的檔案和程式。
測試[root@db01 soft]# more catalina.logaa >> catalina.logaa
^c[root@db01 soft]#
[root@db01 soft]# du -sh catalina.logaa
1.7g catalina.logaa
建立乙個catalina.logaa的檔案,裡面內容都是aaa
然後通過乙個sheel來理解。
#!/bin/bash
sync
sync
echo
3 > /proc/sys/vm/drop_caches
echo -e
"----------------------快取釋放後,記憶體使用情況(kb):----------------------
"free
cached1=`
free |
grep mem:|
awk''`
buffers1=`
free |
grep mem:|
awk''`
date1=`
date +
"%y%m%d%h%m%s
"`
cat catalina.logaa >
1date2=`
date +
"%y%m%d%h%m%s
"`
echo -e
"----------------------首次讀取大檔案後,記憶體使用情況(kb):----------------------
"free
cached2=`
free |
grep mem:|
awk''`
buffers2=`
free |
grep mem:|
awk''` #
echo $date1 #
echo $date2
interval_1=`
expr $ - $`
cached_increment1=`
expr $ - $`
buffers_increment1=`
expr $ - $`
date3=`
date +
"%y%m%d%h%m%s
"`
cat catalina.logaa >
1date4=`
date +
"%y%m%d%h%m%s
"`
echo -e
"----------------------再次讀取大檔案後,記憶體使用情況(kb):----------------------
"free
cached3=`
free |
grep mem:|
awk''`
buffers3=`
free |
grep mem:|
awk''` #
echo $date3 #
echo $date4
interval_2=`
expr $ - $`
cached_increment2=`
expr $ - $`
buffers_increment2=`
expr $ - $`
echo -e
"----------------------統計彙總資料如下:----------------------
"echo -e
"首次讀取大檔案,cached增量:$,單位:kb
"echo -e
"首次讀取大檔案,buffers增量:$,單位:kb
"echo -e
"首次讀取大檔案,耗時:$,單位:s \n
"echo -e
"再次讀取大檔案,cached增量:$,單位:kb
"echo -e
"再次讀取大檔案,buffers增量:$,單位:kb"
echo -e
"再次讀取大檔案,耗時:$,單位:s"
Linux記憶體管理
本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux 採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心...
Linux記憶體管理
本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心,...
Linux記憶體管理
首先我要說,我這是轉貼,轉的cu論壇上 nonameboy 的帖子,你可以連線過去看看。今天因為要解釋系統中可用記憶體的大小,用google看了半天,還有在cu上找了關天,竞然沒有發現有比較好的章,估計很多人都沒有注意到,懂了以後又沒有整理出來。在cu上看了很多文章說什麼memory leak和li...