linux記憶體管理

2021-08-04 06:14:56 字數 4055 閱讀 2354

共享記憶體

對於共享記憶體(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...