linux內存回收機制

無論計算機上有多少內存都是不夠的,因而linux kernel需要回收一些很少使用的內存頁面來保證系統持續有內存使用。頁面回收的方式有頁回寫、頁交換和頁丟棄三種方式:如果一個很少使用的頁的后備存儲器是一個塊設備(例如文件映射),則可以將內存直接同步到塊設備,騰出的頁面可以被重用;如果頁面沒有后備存儲器,則可以交換到特定swap分區,再次被訪問時再交換回內存;如果頁面的后備存儲器是一個文件,但文件內容在內存不能被修改(例如可執行文件),那么在當前不需要的情況下可直接丟棄。

?

1 回收的時機

2 哪些內存可以回收

2.1 頁框的回收

LRU(Least Recently Used),近期最少使用鏈表,是按照近期的使用情況排列的,最少使用的存在鏈表末尾,通過以下宏定義即可看出:

#define lru_to_page(_head) (list_entry((_head)->prev, struct page, lru))

每個zone有5個LRU鏈表用以存放各種最近使用狀態的頁面。

enum lru_list {

???????? LRU_INACTIVE_ANON = LRU_BASE,

???????? LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE,

???????? LRU_INACTIVE_FILE = LRU_BASE + LRU_FILE,

???????? LRU_ACTIVE_FILE = LRU_BASE + LRU_FILE + LRU_ACTIVE,

???????? LRU_UNEVICTABLE,

???????? NR_LRU_LISTS

};

其中INACTIVE_ANON、ACTIVE_ANON、INACTIVE_FILE、ACTIVE_FILE 4個鏈表中的頁面是可以回收的。ANON代表匿名映射,沒有后備存儲器;FILE代表文件映射。

頁面回收時,會優先回收INACTIVE的頁面,只有當INACTIVE頁面很少時,才會考慮回收ACTIVE頁面。

為了評估頁的活動程度,kernel引入了PG_referend和PG_active兩個標志位。為什么需要兩個位呢?假定只使用一個PG_active來標識頁是否活動,在頁被訪問時,設置該位,但是何時清楚呢?為此需要維護大量的內核定時器,這種方法注定是要失敗的。

使用兩個標志,可以實現一種更精巧的方法,其核心思想是:一個表示當前活動程度,一個表示最近是否被引用過,下圖說明了基本算法。

?

基本上有以下步驟:

(1)如果頁是活動的,設置PG_active位,并保存在ACTIVE LRU鏈表;反之在INACTIVE;

(2)每次訪問頁時,設置PG_referenced位,負責該工作的是mark_page_accessed函數;

(3)PG_referenced以及由逆向映射提供的信息用來確定頁面活動程度,每次清除該位時,都會檢測頁面活動程度,page_referenced函數實現了該行為;

(4)再次進入mark_page_accessed。如果發現PG_referenced已被置位,意味著page_referenced沒有執行檢查,因而對于mark_page_accessed的調用比page_referenced更頻繁,這意味著頁面經常被訪問。如果該頁位于INACTIVE鏈表,將其移動到ACTIVE,此外還會設置PG_active標志位,清除PG_referenced;

(5)反向的轉移也是有可能的,在頁面活動程度減少時,可能連續調用兩次page_referenced而中間沒有mark_page_accessed。

如果對內存頁的訪問是穩定的,那么對page_referenced和mark_page_accessed的調用在本質上是均衡的,因而頁面保持在當前LRU鏈表。這種方案同時確保了內存頁不會再ACTIVE與INACTIVE鏈表間快速跳躍。

2.2 slab緩存回收

slab緩存回收相對比較靈活,所有注冊到shrinker_list中的方法都會被執行。

內核默認針對每個文件系統都注冊了prune_super方法,這個函數用來回收文件系統中不再使用的dentry和inode緩存;

android的lowmemorykiller機制注冊了選擇性殺死進程的方法,回收進程使用的內存。

3怎樣回收頁框

其中shrink_page_list是真正回收頁面的過程

?

4周期性回收的頻率

4.1 kswapd

kswapd是內核為每個內存node創建的內存回收線程,為什么有了緊缺回收機制還需要周期性回收呢?因為有些內存分配是不允許阻塞等待回收的,比如中斷和異常處理程序中的內存分配;還有些內存分配不允許激活I/O訪問的。只有少數情況的內存緊缺可以完整執行回收過程,所以利用系統空閑時間回收內存非常必要。

該函數記錄了上一次均衡操作時所用的分配order,如果kswapd_max_order大于上一次的值,或者classzone_idx小于上一次的值,則調用balance_pgdat再次均衡該內存域,否則可以進行短暫休眠,休眠的時間是HZ/10,對于arm(HZ=100)來說,休眠的時間就是1ms。

balance_pgdat均衡操作直到該內存域的zone_wartermark_ok為止。

4.2 cache_reap

cache_reap用來回收slab中的空閑對象,如果空閑對象可以還原成一個頁面,則釋放回buddy system。每次調用cache_reap會把所有的slab_caches遍歷一遍,之后休眠2*HZ,對于arm(HZ=100)來說,周期就是20ms。

5 參考文獻

(1)《understanding the linux kernel》

(2)《professional linux kernel architecture》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284146.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284146.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284146.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

編譯源碼 JAVA out of memory

轉載于:https://www.cnblogs.com/dyufei/p/6612032.html

安卓 Input Events(輸入事件)

在安卓中,有不止一種方法從你的應用截取用戶交互事件。在你的用戶界面中考慮事件,途徑就是從用戶界面中的一個指定的view對象中捕獲事件。該view提供了這樣做的方法。 在你用來組成你布局的不同的view類中,你或許注意到了一些公共的回調方法似…

【GlobalMapper精品教程】029:柵格重分類案例詳解

重分類就是對原有柵格像元值重新分類從而得到一組新值并輸出。重分類工具有多種方法將像元值重新分類或更改為替代值,Globalmapper提供了柵格重分類的功能。 文章目錄 一、柵格重分類簡介二、柵格重分類案例【參考閱讀】:ArcGIS實驗教程——實驗四十三:ArcGIS柵格重分類(Re…

Mybatis 和 JPA 用哪個好? 優缺點 ?

本文不會下關于 Mybatis 和 JPA 兩個持久層框架哪個更好這樣的結論。只是擺事實,講道理,所以,請各位看官勿噴。 一、事件起因 關于 Mybatis 和 JPA 孰優孰劣的問題,爭論已經很多年了。一直也沒有結論,畢竟每個人的喜…

SkiaSharp 之 WPF 自繪 五環彈動球(案例版)

此案例基于拖曳和彈動球兩個技術功能實現,如有不懂的可以參考之前的相關文章,屬于遞進式教程。五環彈動球好吧,名字是我起的,其實,你可以任意個球進行聯動彈動,效果還是很不錯的,有很多前端都是…

【GlobalMapper精品教程】032:瀏覽地理照片及航線信息(航測應用)

本文講述globalmapper軟件在無人機航測了內業處理中的應用之:瀏覽地理照片及航線信息、相機參數、元數據編輯器。 文章目錄 1. 航線信息瀏覽2. 地理圖像瀏覽2.1 數字化工具2.2 要素信息工具2.3 屬性表3. 照片原數據編輯1. 航線信息瀏覽 打開globalmapper軟件,加載無人機航測…

Spring Boot 2.7.0發布,2.5停止維護

這幾天是Spring版本日,很多Spring工件都發布了新版本, Spring Framework 6.0.0 發布了第 4 個里程碑版本,此版本包含所有針對 5.3.20 的修復補丁,以及特定于 6.0 分支的 39 項修復和改進。而今天Spring Boot 2.7.0和Spring Securi…

【GlobalMapper精品教程】031:Globalmapper在航測內業數據處理中的應用舉例

Globalmapper在航測內業數據處理中的應用舉例索引。 文章目錄 1. 圖像及航線瀏覽2. 3D重建3. 點云分類4. 創建地形5. 地形分析1. 圖像及航線瀏覽 擴展閱讀:【GlobalMapper精品教程】032:瀏覽地理照片及航線信息(航測應用) 2. 3D重建 從Global Mapper的19版本開始,Pixels-…

移動工具V和選區工具M

移動工具快捷鍵:V 屬性: 自動選擇 在默認情況下,移動工具的“自動選擇”一項是沒有勾選的。表示只能選中圖層窗口中選定的固定圖層,不能隨意的點擊選擇別的圖層。在這里,我們也勾選“自動選擇”,可任意選擇…

SeleniumWebDriver擴展插件開發

Selenium WebDriver 是一組開源 API,用于自動測試 Web 應用程序,利用它可以通過代碼來控制chrome edge等瀏覽器!有時候我們需要mock接口的返回,或者攔截和轉發請求,今天就來實現這個功能本插件代碼已開源:h…

ZooKeeper的工作原理

ZooKeeper是一個分布式的應用程序協調服務。 2 ZooKeeper的工作原理 Zookeeper 的核心是原子廣播,這個機制保證了各個Server之間的同步。實現這個機制的協議叫做Zab(Zookeeper Atomic Broadcast)協議。Zab協議有兩種模式,它們分別是恢復模式(…

memcache的學習路線圖

memcache學習材料//memcache自帶的github 上的 wiki//席劍飛 Memcache(MC)系列 1~8系列評注: memcache系統寫的最深的一博客,建議一讀。http://blog.csdn.net/xifeijian/article/details/21994941//mysql與memcache的使用https://…

[轉]錢嶺:別擔心“35歲危機”,要成為“老專家”

從清華大學到貝爾實驗室,再到中國移動,作為“IT老人”,錢嶺的技術人生幾乎覆蓋了20世紀90年代至今的信息產業革命。2007年開始,錢嶺在中國移動經歷了基礎科研到產品落地,再到團隊孵化;也經歷了云計算從無到…

【GIS前沿】周成虎院士:GIS的大數據時代展望(PPT分享)

本文源自微信公眾號:宋關福GIS筆記。版權歸原作者及刊載媒體所有,如有侵權請立即與我們聯系,我們將及時處理。更多GIS前言技術,請關注《GIS前言》專欄。 GIS的大數據時代展望

DataV:可視化大屏展示神器實戰分享

由于公司年即將發布新的產品,傳統意義上的PPT顯得不太生動化,所以想采用具體化,可視化的數據大屏進行業務數據的事實展示,第一時間想到了來自于阿里云旗下的DataV,廢話不多說,老司機開始發牌照!…

數據庫性能系列之索引(中)

GOOD NIGHT前言上一篇中,我們已經了解到了索引的基本概念和一些用法。那索引為什么會提升查詢的速度,以及索引究竟是怎么工作的呢?也許大家心里還是有一些迷茫,這一切,還要從索引背后的算法說起。GOOD NIGHT概述大家知…

微服務架構的設計原則和核心話題

目錄 一、前言 二、微服務架構的設計原則 1.拆分足夠微 2.輕量級通信 3.單一職責原則 4.領域驅動原則 三、微服務架構的核心話題 1.服務拆分 2.服務注冊與發現 3.負載均衡 4.API網關 5.服務部署與發布 四、總結 一、前言 毫無疑問,微服務架構的設計原…

4.3.2 基于集合的操作

在SQL Server處理select命令時,會在內存中建立一個結構,以返回結果集。這個結構實質上是一個有行和列的二維數組,稱為“游標(cursor)”。“游標”這個詞是“CURrent set of Records(當前記錄集)”的縮寫。它表示從表或…

Golang GOPATH 包

2019獨角獸企業重金招聘Python工程師標準>>> Golang GOPATH & 包的定義 & 包的導入 GOPATH 設置 go 命令依賴一個重要的環境變量:$GOPATH 可以在 .zshrc 配置文件中加上一行這樣的配置, export GOPATH/Users/flyme/mygo Go從1.1版本到…

PPK大疆無人機應用教程

文章目錄 一、新建項目二、導入數據三、解算過程四、結果導出一、新建項目 新建工程,設置項目名稱,保存位置,控制等級,坐標系統(坐標系統選擇高斯克呂格,中央子午線根據實際數據所在位置進行選擇) 二、導入數據 選擇大疆數據,找到對應的文件夾 數據有:圖片,EVENT.b…