免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Linux內存管理
內存運行機制
1)linux系統(tǒng)會不時地進行頁面交換操作,保持盡可能多的空閑物理內存,即使并不需要內存,linux會交換出暫時不用的內存頁面。

2)內核根據(jù)“最近最經常使用”算法,僅僅將一些不經常使用的頁面文件交換到虛擬內存。有時我們會看到這么一個現(xiàn)象:Linux物理內存還有很多,但是交換空間也使用了很多。其實,這并不奇怪,例如,一個占用很大內存的進程運行時,需要耗費很多內存資源,此時就會有一些不常用頁面文件被交換到虛擬內存中,但后來這個占用很多內存資源的進程結束并釋放了很多內存時,剛才被交換出去的頁面文件并不會自動的交換進物理內存,除非有這個必要,那么此刻系統(tǒng)物理內存就會空閑很多,同時交換空間也在被使用,就出現(xiàn)了剛才所說的現(xiàn)象了。

3)交換空間的頁面在使用時會首先被交換到物理內存,如果此時沒有足夠的物理內存來容納這些頁面,它們又會被馬上交換出去,如此以來,虛擬內存中可能沒有足夠空間來存儲這些交換頁面,最終會導致Linux出現(xiàn)假死機、服務異常等問題,Linux雖然可以在一段時間內自行恢復,但是恢復后的系統(tǒng)已經基本不可用了。

內存監(jiān)控常用命令
Linux監(jiān)控內存最常使用的命令有free、top等。如圖:
 第一行:
total:物理內存的總大小
used:已經分配的物理內存大小
free:空閑的物理內存大?。ㄎ幢徊僮飨到y(tǒng)分配)
shared:多個進程共享的內存大小,主要用于進程間的通訊
buffers/cached:共同表示磁盤緩存的大小
第二行Mem:代表物理內存使用情況
第三行(-/+ buffers/cached):代表磁盤緩存使用狀態(tài)
第四行:Swap表示交換空間內存使用狀態(tài)

        第二行的數(shù)據(jù)實際上是從操作系統(tǒng)的角度來看的。used僅僅代表操作系統(tǒng)已經分配的物理內存大小,而不一定是已被使用的內存大小。例如,一個應用申請了1000KB的內存,不會立刻全部使用,可能當前只使用了600KB的內存,剩余的400KB就可以被“借”給操作系統(tǒng)來作為緩存使用。這些就以第二行的buffers和cashed的形式表示出來。
        buffers與cached都是內存操作,用來保存系統(tǒng)曾經打開過的文件以及文件屬性信息,這樣當操作系統(tǒng)需要讀取某些文件時,會首先在buffers與cached內存區(qū)查找,如果找到,直接讀出傳送給應用程序,如果沒有找到需要數(shù)據(jù),才從磁盤讀取,這就是操作系統(tǒng)的緩存機制,通過緩存,大大提高了操作系統(tǒng)的性能。但buffers與cached緩沖的內容卻是不同的。
           buffers是用來緩沖塊設備做的,它只記錄文件系統(tǒng)的元數(shù)據(jù)(metadata)以及 tracking in-flight pages,而cached是用來給文件做緩沖。更通俗一點說:buffers主要用來存放目錄里面有什么內容,文件的屬性以及權限等等。而cached直接用來記憶我們打開過的文件和程序。
         Linux會在需要內存的時候,或在系統(tǒng)運行逐步推進時,將buffers和cached狀態(tài)的內存變?yōu)閒ree狀態(tài)的內存,以供系統(tǒng)使用。

    第三行的數(shù)據(jù)則是從應用程序的角度來看內存分配。這里的“-/+”實際上分別指的是兩個部分:
-buffers/cashed  =   used(第二行) - buffers - cached ;   (即當前系統(tǒng)所有程序真實使用的物理內存大小)
+buffers/cashed = buffers + cached;    (暫時借給系統(tǒng)作為緩沖區(qū)的內存大?。?。
       從上面的論述也可以看出,第三行的free對應的一欄實際上是應用程序可以使用的內存大小,它的值 = free(第二行)+ buffers(第二行) + cached(第二行)。

       如果那些“借給”系統(tǒng)內存的程序需要“借出去”的內存,則從第二行的free一欄分給該程序。如果有必要的話,就會從buffers/cashed中釋放內存,同時將釋放內存中的數(shù)據(jù)寫回到硬盤中。如果連buffers/cashed也沒有了,則從硬盤處借,分配SWAP空間。
      你也可以通過命令行強制要求系統(tǒng)歸還這些內存,命令如下:
      echo 3 > /proc/sys/vm/drop_caches     (3代表釋放所有bufferes/cashed能釋放的空間)
      不過你需要root權限?,F(xiàn)象如圖:

 可以看見buffers/cashed兩個部分的空間大大縮小。

內存管理
內存管理的目標是提供一種方法,為實現(xiàn)各種目的而在各個用戶之間實現(xiàn)內存共享。內存管理方法應該實現(xiàn)以下兩個功能:
1)最小化管理內存所需的時間
2)最大化用于一般應用的可用內存(最小化管理開銷)


內存管理實際上是一種關于權衡的零和游戲。您可以開發(fā)一種使用少量內存進行管理的算法,但是要花費更多時間來管理可用內存。也可以開發(fā)一個算法來有效地管理內存,但卻要使用更多的內存。最終,特定應用程序的需求將促使對這種權衡作出選擇。

每個內存管理器都使用了一種基于堆的分配策略。在這種方法中,大塊內存(稱為 堆)用來為用戶定義的目的提供內存。當用戶需要一塊內存時,就請求給自己分配一定大小的內存。堆管理器會查看可用內存的情況(使用特定算法)并返回一塊內存。搜索過程中使用的一些算法有 first-fit(在堆中搜索到的第一個滿足請求的內存塊)和 best-fit(使用堆中滿足請求的最合適的內存塊)。當用戶使用完內存后,就將內存返回給堆。(注意 :這里的堆和數(shù)據(jù)結構中的堆不是一個概念

這種基于堆的分配策略的根本問題是碎片(fragmentation)。當內存塊被分配后,它們會以不同的順序在不同的時間返回。這樣會在堆中留下一些洞,需要花一些時間才能有效地管理空閑內存。這種算法通常具有較高的內存使用效率(分配需要的內存),但是卻需要花費更多時間來對堆進行管理。

另外一種方法稱為 buddy memory allocation,是一種更快的內存分配技術,它將內存劃分為 2 的冪次方個分區(qū),并使用 best-fit 方法來分配內存請求。當用戶釋放內存時,就會檢查 buddy 塊,查看其相鄰的內存塊是否也已經被釋放。如果是的話,將合并內存塊以最小化內存碎片。這個算法的時間效率更高,但是由于使用 best-fit 方法的緣故,會產生內存浪費。

Slab分配器
     Linux 所使用的 slab 分配器的基礎是 Jeff Bonwick 為 SunOS 操作系統(tǒng)首次引入的一種算法。
       最高層是cache_chain,這是一個slab緩存的連接列表,這對于best-fit算法非常有用,可以用來查找最適合所需要的分配大小的緩存(遍歷列表)。cache_chain每個元素都是一個kmem_cache結構的引用,它定義了一個要管理的給定大小的對象池。
每個緩存都包含一個slabs列表,存在三種slab:slabs_full、slabs_patial、slabs_empty.
    由于對象是從 slab 中進行分配和釋放的,因此單個 slab 可以在 slab 列表之間進行移動。例如,當一個 slab 中的所有對象都被使用完時,就從 slabs_partial 列表中移動到 slabs_full 列表中。當一個 slab 完全被分配并且有對象被釋放后,就從 slabs_full 列表移動到 slabs_partial 列表。當所有對象都被釋放后,就從 slabs_partial 列表移動到 slabs_empty 列表.

內存分配
回收目標
    不是所有的物理內存都可以參與回收的,一般內核代碼段、數(shù)據(jù)段、內核kmalloc()出來的內存,內核線程占用的內存都是不可以回收的,除此之外的內存都是回收的對象。回收的內存主要是由用戶態(tài)進程占用的內存和內核自己在運行時所使用的一些內存組成。用戶態(tài)進程占用的內存主要是我們常見的進程代碼段,數(shù)據(jù)段,堆棧等,內核運行使用的內存主要是磁盤高速緩存(如索引節(jié)點,目錄項高速緩存),頁面高速緩存(訪問文件時系統(tǒng)生成的頁面cache),mmap()文件時所用的有名映射所使用的物理內存。

 回收時機
    1)內存緊缺回收:grow_buffers()無法獲取緩沖區(qū)頁,alloc_page_buffers()無法獲取頁臨時緩沖區(qū)首部,__alloc_pages()無法再給定的內存區(qū)分配一組連續(xù)頁框。
    2)周期回收:必要時,激活相應內核線程執(zhí)行內存回收算法:kswapd()內核線程,檢查某個內存管理區(qū)的空閑頁框數(shù)是否已低于pages_high值的標高。events內核線程,一個工作者線程,回收位于高速內存緩存中的所有空閑的slab。 

  回收的分類
    主要回收兩類內存:最近最少使用內存以及高速內存緩存中空閑的slab。前者主要包括用戶態(tài)進程的代碼段,數(shù)據(jù)段,堆棧,文件映射內存,頁高速內存,后者主要包括磁盤高速緩存及一些其他的空閑內存高速緩存。

內存緊缺回收及短期回收
    主要調用try_to_free_pages(),該函數(shù)會執(zhí)行一個循環(huán),按照優(yōu)先級從12到0依次調用shrink_cashes(),shrink_slabs()來回收頁面,直到回收至少32個內存頁面。
    shrink_caches():調用shrink_zone()對傳入的zone鏈表中的每個zone,進行l(wèi)ru上面的頁面回收。
    shrink_slab():對磁盤索引節(jié)點cache和目錄項索引節(jié)點等磁盤高速緩存進行回收,由于磁盤索引節(jié)點和目錄項索引節(jié)點都是從slab高速緩存中分配的,這樣就會導致空閑slab的產生,空閑slab后續(xù)會在周期性回收的cache_reap工作隊列中被回收。估計也就是因為最終會清零空閑slab,才會起這么一個函數(shù)名。^_^
    shrink_zone():對內存管理區(qū)上的lru鏈表中的非活躍頁面進行回收,在非活躍頁面不足的時候,調用refill_inactive_zone()對lru上的inactive鏈表補充非活躍頁面,同時shrink_zone()調用shrink_cache()來進行頁面的回收,該函數(shù)的具體解析可以參照下面的源碼淺析。
    shrink_list():該輔助函數(shù)在shrink_cache()中被調用,該函數(shù)對在shrink_cache()中傳入的非活躍page列表進行遍歷,對每個頁面進行回收工作,該函數(shù)的具體解析可以參考下面的源碼解析。
    refill_inactie_zone():該輔助函數(shù)根據(jù)一定的規(guī)則將處于lru active鏈表上的活躍頁面移動到inactive鏈表上,以補充可以回收的頁面,在lru鏈表里有兩類頁,一類是屬于用戶態(tài)空間的頁,比如用戶態(tài)進程的代碼段,數(shù)據(jù)段,一類是在頁高速緩存中的頁,系統(tǒng)為了降低對應用程序的影響,將要優(yōu)先將頁高速緩存頁進行回收,同時為了系統(tǒng)整體性能也會適當回收用戶態(tài)進程頁。




本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
CentOS,清理緩存(drop
linux內核分析筆記----內存管理
Linux學習筆記
linux內存管理
Linux slab
工程師深度:學通Linux內核(含詳細代碼)
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服