linux怎麼管理空閑內存?

當一個進程創立時,操作系統怎麼去從空閑的內存中去分配一塊或多塊內存給這個進程使用,這樣便引向了linux是怎麼來管理空閑內存的?

一般一個進程創建了,會分配多大的內存,當使用malloc動態申請內存時又是怎樣去得到申請的內存呢?malloc的實現原理是怎樣的?


對於?86:

1.內存組織層次:頁式管理—&>(numa)—&>node的zonelist—&>32位DMA/NORMAL/HIGHMEM三個區,64位沒有高端內存—&>夥伴分配系統—&>slab/slub/slob

2.創建進程時內存分配:實際上只分配task_struct和thread_info的內存,而且很可能是從slab緩存中分配的,當進程運行時由於缺頁中斷,才由內核層具體分配物理內存並與vm掛接

3.malloc是c runtime中的實現,是上層庫的內存分配層,至於內核層的,可以看看__alloc_pages/alloc_pages/kmalloc(小內存直接slab,大內存還是alloc_pages)/vmalloc(alloc_page分配不連續的物理頁,映射到連續的vm_struct中的pages指針數組)/vmap/map_vm_area等幾個函數

註:以上針對linux—3.19.3


在Linux中,malloc的時候你還沒有得到這塊內存。

當你對內存實際讀寫的時候才分配。

所以你可以開一百個進程,每個進程分配1G的內存,然後不對該區域進行任何讀寫操作,就直接讓進程去睡覺,會發現這個分配了100G內存的系統系統並沒有任何異常與崩潰。

這個原理告訴我們一個道理,就是在Linux中malloc返回有效的值並不意味著你的內存真的是可用的。實際上一般而言Linux編程都不需要處理malloc返回值為空的情況,因為這它只在極少數情況下出現。


給進程分配內存是分配的內存區域,沒有實際分配內存,當程序實際操作這塊內存時產生缺頁異常,通過缺頁異常來實際分配頁框給進程,詳見ulk頁表和內存管理兩章


malloc這個函數申請的內存是「假的」內存呢。

每一個程序運行的時候會自己維護一個虛擬內存,通常來說,這個虛擬內存的大小可能是4G(64位也是4G嗎)。

malloc這一類函數都是在這個內存中對內存進行分配的。

然後就是內核以輪轉(?)的方式來查看內存是否有變化,然後再建立和物理內存之間的映射(不要問我怎麼映射的,我不知道呀)。

然後就是,回答了那麼些,其實發現壓根沒有回答題主的問題。


推薦閱讀:

如何釋放Python佔用的內存?
看遊戲引擎架構內存管理有個地方不太清楚?
C語言和內存管理有什麼關係?為什麼說學習C語言的關鍵在內存管理?
講C語言內存管理的書籍或者博客?
筆記本內存佔用突然變高,本來29%左右,現在開機就58%,沒開任何程序啊,急求,感謝?

TAG:Linux | C編程語言 | 內存管理 | Linux內核 | 操作系統內核 |