Linux記憶體管理機制簡介

2021-09-30 10:03:47 字數 1867 閱讀 6862

在linux中經常發現空閒記憶體很少,似乎所有的記憶體都被系統占用了,表面感覺是記憶體不夠用了,其實不然。這是linux記憶體管理的乙個優秀特性,在這方面,區別於 windows的記憶體管理。主要特點是,無論物理記憶體有多大,linux 都將其充份利用,將一些程式呼叫過的硬碟資料讀入記憶體,利用記憶體讀寫的高速特性來提高linux系統的資料訪問效能。而windows 是只在需要記憶體時,才為應用程式分配記憶體,並不能充分利用大容量的記憶體空間。換句話說,每增加一些物理記憶體,linux 都將能充分利用起來,發揮了硬體投資帶來的好處,而windows只將其做為擺設,即使增加8gb甚至更大。

linux 的這一特性,主要是利用空閒的物理記憶體,劃分出一部份空間,做為 cache 和 buffers ,以此提高資料訪問效能。

1、什麼是 cache ?

頁快取記憶體(cache)是 linux核心實現的一種主要磁碟快取。它主要用來減少對磁碟的i/o操作。具體地講,是通過把磁碟中的資料快取到物理記憶體中,把對磁碟的訪問變為對物理記憶體的訪問。

磁碟快取記憶體的價值在於兩個方面:第一,訪問磁碟的速度要遠遠低於訪問記憶體的速度,因此,從記憶體訪問資料比從磁碟訪問速度更快。第二,資料一旦被訪問,就很有可能在短期內再次被訪問到。

頁快取記憶體是由記憶體中的物理頁組成的,快取中每一頁都對應著磁碟中的多個塊。每當核心開始執行乙個頁i/o操作時(通常是對普通檔案中頁大小的塊進行磁碟操作),首先會檢查需要的資料是否在快取記憶體中,如果在,那麼核心就直接使用快取記憶體中的資料,從而避免訪問磁碟。

舉個例子,當使用文字編輯器開啟乙個源程式檔案時,該檔案的資料就被調入記憶體。編輯該檔案的過程中,越來越多的資料會相繼被調入記憶體頁。最後,當你編譯它的時候,核心可以直接使用頁快取記憶體中的頁,而不需要重新從磁碟讀取該檔案了。因為使用者往往會反覆讀取或操作同乙個檔案,所以頁快取記憶體能減少大量的磁碟操作。

2、cache 如何更新?

由於頁快取記憶體的快取作用,寫操作實際上會被延遲。當頁快取記憶體中的資料比後台儲存的資料更新時,那麼該資料就被稱做髒資料。在記憶體中累積起來的髒頁最終必須被寫回磁碟。在以下兩種情況發生時,髒頁被寫回磁碟:

◆當空閒記憶體低於乙個特定的閾值時,核心必須將髒頁寫回磁碟,以便釋放記憶體。

◆當髒頁在記憶體中駐留時間超過乙個特定的閾值時,核心必須將超時的髒頁寫回磁碟,以確保髒頁不會無限期地駐留在記憶體中。

在2.6核心中,由一群核心執行緒—pdflush後台回寫例程統一執行兩種工作。

首先,pdflush執行緒在系統中的空閒記憶體低於乙個特定的閾值時,將髒頁重新整理回磁碟。該後台回寫例程的目的在於在可用物理記憶體過低時,釋放髒頁以重新獲得記憶體。特定的記憶體閾值可以通過dirty_background_ratio sysctl系統呼叫設定。當空閒記憶體比閾值:dirty_background_ratio還低時,核心便會呼叫函式wakeup_bdflush()喚醒乙個pdflush執行緒,隨後pdflush執行緒進一步呼叫函式background_writeout()開始將髒頁寫回磁碟。函式background_ writeout()需要乙個長整型引數,該引數指定試圖寫回的頁面數目。函式background_writeout()會連續地寫出資料,直到滿足以下兩個條件:

◆已經有指定的最小數目的頁被寫出到磁碟。

◆空閒記憶體數已經回公升,超過了閾值dirty_background_ratio。

上述條件確保了pdflush操作可以減輕系統中記憶體不足的壓力。回寫操作不會在達到這兩個條件前停止,除非pdflush寫回了所有的髒頁,沒有剩下的髒頁可再被寫回了。

為了滿足第二個目標,pdflush後台例程會被週期性喚醒(和空閒記憶體是否過低無關),將那些在記憶體中駐留時間過長的髒頁寫出,確保記憶體中不會有長期存在的髒頁。如果系統發生崩潰,由於記憶體處於混亂之中,所以那些在記憶體中還沒來得及寫回磁碟的髒頁就會丟失,所以週期性同步頁快取記憶體和磁碟非常重要。在系統啟動時,核心初始化乙個定時器,讓它週期地喚醒pdflush執行緒,隨後使其執行函式wb_kupdate()。

Linux記憶體管理機制

經常遇到一些剛接觸linux 的新手會問記憶體占用怎麼那麼多?在linux中經常發現空閒記憶體很少,似乎所有的記憶體都被系統占用了,表面感覺是記憶體不夠用了,其實不然。這是linux記憶體管理的乙個優秀特性,在這方 面,區別於windows的記憶體管理。主要特點是,無論物理記憶體有多大,linux ...

linux記憶體管理機制

linux系統的 物理記憶體就是實際記憶體 虛擬記憶體是為了避免物理記憶體不足而產生的概念,其是磁碟空間虛擬出來的一塊邏輯記憶體,即交換空間 swap space 將不經常使用的資料放在虛擬空間,這樣物理空間有足夠的空閒空間放經常使用的資料。交換空間的大小一般是物理記憶體的幾倍。使用命令free m...

記憶體管理機制

記憶體管理 jvm將記憶體分成三大主要區域 堆,棧,方法區,用來儲存資料。堆 堆中主要儲存引用型別物件,給成員變數分配空間。棧 jvm在執行程式時,在棧中會為每乙個方法都提供儲存空間叫棧幀,用來儲存方法中的區域性變數。方法區 用來儲存jvm載入的位元組碼檔案的資訊 類的資訊 包含類的方法,方法只有乙...