為什麼linux需要物理內存分配器?

楊旻威


任何操作系統中最基本的部分之一就是管理內存。該子系統通常稱為內存管理單元或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內核》中關於內存管理







分享到:


相關文章: