-
1 # 天夢教程分享
-
2 # 你看我獨角獸嗎
任何作業系統中最基本的部分之一就是管理記憶體。該子系統通常稱為記憶體管理單元或MMU。這個子系統是一個非常複雜的子系統,但是對我們來說幸運的是,它有很多文獻記錄。
當我們談論記憶體時,通常是我們所指的物理RAM。總物理RAM是您要在新PC或伺服器中尋找的最重要屬性之一。但是,最終使用RAM的是作業系統。作業系統充當應用程式和物理記憶體之間的抽象層。該層將物理RAM劃分為虛擬“頁面”,這是作業系統可以使用的最小資料單元。預設情況下,在Linux系統中,頁面大小為4KB,因為單獨處理每個位將太複雜而無法高效。
當Linux使用系統RAM時,它將建立一個虛擬記憶體層,然後將程序分配給虛擬記憶體。虛擬記憶體實際上是RAM和交換空間的結合。交換空間是硬碟驅動器中的一部分,如果可用的RAM用完了,則指定為可用空間。這裡是額外的抽象層,因此每個正在執行的程序都不會重疊,並嘗試使用已被另一個程序使用的記憶體。這也意味著虛擬記憶體可以擴充套件到物理RAM容量之外,即使在效率不高的情況下,這也可能有用。
如前所述,作業系統允許程序訪問RAM的一部分。該程序完全無法控制記憶體分配。因此,在應用程式上工作的開發人員,尤其是用高階程式碼編寫的開發人員,不必擔心使用記憶體。
通常,任何檔案或檔案系統的一部分都使用系統命令mmap進行對映 , 並稱為記憶體對映檔案。如果一個記憶體頁面檔案沒有任何關聯的檔案,則稱為匿名記憶體,並且使用“ malloc”函式分配ut。
透過使用分配檔案對映的記憶體和匿名記憶體的方式,作業系統可以使使用相同檔案的程序與相同的虛擬記憶體頁面一起工作,從而更有效地使用記憶體。 有時,一個程序正在佔用另一個程序所需的記憶體。在這種情況下,作業系統使用OOM(記憶體不足)殺手。該實用程式選擇一個程序,然後將其記憶體頁重新分配給其他程序。在Linux中,預設情況下啟用此OOM殺手。如果禁用它,則除了擴充套件到硬碟驅動器之外,如果系統用盡了記憶體,則基本上無權使用系統。
“ Cgroups”是用於將程序隔離到特定記憶體地址的實用程式,該程式將程序分組為邏輯組併為其分配一定數量的記憶體。Linux中包含cgroup實際上為當今使用的容器(例如Docker和OpenVZ)奠定了基礎。
Linux還能夠使用NUMA(非統一記憶體訪問)與多處理器系統一起使用。這樣做的目的是嘗試為最接近物理RAM的CPU上執行的程序分配記憶體。
回覆列表
核心也是用的類似malloc的東西申請記憶體的。對核心來說,kmalloc()也是一個記憶體分配器。
你說的“linux需要物理記憶體分配器”,不管是使用者態的應用級的,還是上面說的,核心態的“應用級”的,其實都是一個東西。
但是,在它倆下面,還有一個系統級的“記憶體管理層”,或“虛擬記憶體管理層”,管理頁表的建立,維護什麼的。
你提的問題,應該是兩個不同層面的問題,不要把它們放在一起想
malloc是在程序址空間中分配,並不能完成實際物理記憶體分配。
再說為什麼不直接訪問物理記憶體:
其次,虛擬記憶體管理以及到物理記憶體的對映是現代處理器和作業系統必備功能,因為沒有虛擬記憶體管理的話,就不能實現諸如動態分頁,Swap等。如果直接訪問物理記憶體,就像feature phone或嵌入式系統,記憶體訪問出錯容易導致系統崩潰或者破壞其它程式的資料。
再次,有虛擬記憶體管理,才可能有多程序。
最後,Linux確實是對記憶體分頁了,但不可能按你說的方法,因為頁的大小是固定的,而核心與應用申請時不一定是固定大小,這會導致記憶體使用效率低下。
最後,你可以去讀一下關於Linux記憶體管理的文件,或者《深入理解Linux核心》中關於記憶體管理