Linux 的記憶體分配問題。

時間 2021-06-01 04:02:14

1樓:海楓

其實這個話題分成兩個部分:

虛擬記憶體分配與空閒物理記憶體的關係

如果物理記憶體不足了,核心會怎麼辦如果單單從Linux的虛擬記憶體角度理解,虛擬記憶體和物理記憶體是沒有直接關係的。當程序mmap一塊記憶體時, Linux只是給她分配乙個虛擬記憶體空間,只有等她使用該空間時,才分配物理記憶體。理論上所有程序虛擬記憶體空間加起來,會超過物理記憶體總量。

一旦這些程序使用物理記憶體越來越多時,物理記憶體就不夠用了。

噢,引入swap不是可以解決了嗎? 其實不能完全解決,只能緩解,或者增加記憶體使用的緩衝,那是因為:swap分割槽也有乙個總容量的。

如果真的嘗測寫測試用例,可以寫乙個占用大量匿名記憶體程式,並且執行很多個例項,那他們的虛擬記憶體總和超越物理記憶體和swap記憶體的總和。

其實,我們想到的問題,各位OS前輩早已看到了。根據不同的場景制定不同的虛擬記憶體使用策略,具體策略在/proc/sys/vm/overcommit_memory 這個檔案控制 (策略控制說明原文在這裡),我在這裡簡單說一下:

值為0時:虛擬記憶體控制策略就是大名鼎鼎的銀行家演算法,程序申請的虛擬空間,必須小於當前可用物理記憶體空間,才能申請通過。

值為1時:不做任何檢查,所有虛擬記憶體申請都通過。

值為2時:不允許記憶體超量使用原則,所有程序的空虛記憶體空間總和,不能超過物理內物理總量 (實際上還是要乘以乙個小於1的因子,以保證核心態使用記憶體)

物理記憶體一定有不夠用的可能,上述談到3種虛擬記憶體分配策略,都可能出現物理記憶體不足。值為1和2時,就不用說了,虛擬記憶體總量一定會超過物理記憶體。值為2時,使用者態不會超,但核心態會種造成物理記憶體不足。

如果物理記憶體不足,就會發生OOM(out-of-memory)行為。

核心使用oom-killer模組去殺程序,釋放記憶體,讓當前系統可用。

oom-killer會根據每程序使用的記憶體量和活躍做個綜合評分,得分高者會被殺死,直到記憶體充足為止。當然,也會遇到無法釋放足夠的記憶體給當前系統使用,如果真發生這種情況,核心只能噗一聲(panic),表示無力回天。

2樓:「已登出」

1. 說試一下的,顯然不妥,因為這次試了可以,並不能證明下次是可以的。

2. 從實現上說,Linux對這個策略是可調的,文件看Documentation/sysctl/vm.txt

簡單總結,預設情況下,如果Linux能給你虛擬空間,就會判斷它的物理空間是否夠用。但如果實在發生不夠用的,就是OOMKill Takeover,這個演算法會殺掉程序來補充空間的。

3樓:大江

缺頁應該會引發14號中斷page_fault~linux好像從1.0就是帶有swap的啦,置換應該都是放在中斷裡實現的

沒有swap的作業系統我猜會做如下限制:

1.最大能開啟的程序數,到上限禁止建立程序2.每個程序能使用的最大記憶體

3.記憶體不夠直接禁止建立程序

4.記憶體不夠你就等著唄,或者強行kill掉某些程序?

5.反正程序排程都是乙個乙個切換的,記憶體不足那就標記下,不進行上下文切換,你就發現某些程序一直掛起了....

佔位看看別人怎麼回答的

4樓:「已登出」

結果就是已修改型別和備用型別頁面的數量大大增加。一旦備用頁面不夠用,就把已修改型別的頁面寫入頁面檔案。並把該頁面的型別設定為備用,供急需需要使用記憶體的程式使用。

為什麼linux需要物理記憶體分配器?

核心也是用的類似malloc的東西申請記憶體的。對核心來說,kmalloc 也是乙個記憶體分配器。你說的 linux需要物理記憶體分配器 不管是使用者態的應用級的,還是上面說的,核心態的 應用級 的,其實都是乙個東西。但是,在它倆下面,還有乙個系統級的 記憶體管理層 或 虛擬記憶體管理層 管理頁表的...

linux怎麼管理空閒記憶體?

在Linux中,malloc的時候你還沒有得到這塊記憶體。當你對記憶體實際讀寫的時候才分配。所以你可以開一百個程序,每個程序分配1G的記憶體,然後不對該區域進行任何讀寫操作,就直接讓程序去睡覺,會發現這個分配了100G記憶體的系統系統並沒有任何異常與崩潰。這個原理告訴我們乙個道理,就是在Linux中...

Linux 多程序共享記憶體資料?

Xi Yang 這麼複雜的配置體系,起個MongoDB專門管這事怎麼樣?鑑於你已經有一坨XML體系了,那不妨弄個指令碼程序,專門負責讀取XML並且設定MongoDB的庫內容。資料庫我不是很熟悉。如果MongoDB太重,那就找個更輕量的非關聯式資料庫。 大寬寬 簡單搞的話,用mmap做一下呢?就是每個...