{eval=Array;=+count(Array);}
任何操作系統(tǒng)中最基本的部分之一就是管理內(nèi)存。該子系統(tǒng)通常稱為內(nèi)存管理單元或MMU。這個子系統(tǒng)是一個非常復(fù)雜的子系統(tǒng),但是對我們來說幸運的是,它有很多文獻記錄。
當我們談?wù)搩?nèi)存時,通常是我們所指的物理RAM。總物理RAM是您要在新PC或服務(wù)器中尋找的最重要屬性之一。但是,最終使用RAM的是操作系統(tǒng)。操作系統(tǒng)充當應(yīng)用程序和物理內(nèi)存之間的抽象層。該層將物理RAM劃分為虛擬“頁面”,這是操作系統(tǒng)可以使用的最小數(shù)據(jù)單元。默認情況下,在Linux系統(tǒng)中,頁面大小為4KB,因為多帶帶處理每個位將太復(fù)雜而無法高效。
當Linux使用系統(tǒng)RAM時,它將創(chuàng)建一個虛擬內(nèi)存層,然后將進程分配給虛擬內(nèi)存。虛擬內(nèi)存實際上是RAM和交換空間的結(jié)合。交換空間是硬盤驅(qū)動器中的一部分,如果可用的RAM用完了,則指定為可用空間。這里是額外的抽象層,因此每個正在運行的進程都不會重疊,并嘗試使用已被另一個進程使用的內(nèi)存。這也意味著虛擬內(nèi)存可以擴展到物理RAM容量之外,即使在效率不高的情況下,這也可能有用。
如前所述,操作系統(tǒng)允許進程訪問RAM的一部分。該進程完全無法控制內(nèi)存分配。因此,在應(yīng)用程序上工作的開發(fā)人員,尤其是用高級代碼編寫的開發(fā)人員,不必擔心使用內(nèi)存。
通常,任何文件或文件系統(tǒng)的一部分都使用系統(tǒng)命令mmap進行映射 , 并稱為內(nèi)存映射文件。如果一個內(nèi)存頁面文件沒有任何關(guān)聯(lián)的文件,則稱為匿名內(nèi)存,并且使用“ malloc”函數(shù)分配ut。
通過使用分配文件映射的內(nèi)存和匿名內(nèi)存的方式,操作系統(tǒng)可以使使用相同文件的進程與相同的虛擬內(nèi)存頁面一起工作,從而更有效地使用內(nèi)存。 有時,一個進程正在占用另一個進程所需的內(nèi)存。在這種情況下,操作系統(tǒng)使用OOM(內(nèi)存不足)殺手。該實用程序選擇一個進程,然后將其內(nèi)存頁重新分配給其他進程。在Linux中,默認情況下啟用此OOM殺手。如果禁用它,則除了擴展到硬盤驅(qū)動器之外,如果系統(tǒng)用盡了內(nèi)存,則基本上無權(quán)使用系統(tǒng)。
“ Cgroups”是用于將進程隔離到特定內(nèi)存地址的實用程序,該程序?qū)⑦M程分組為邏輯組并為其分配一定數(shù)量的內(nèi)存。Linux中包含cgroup實際上為當今使用的容器(例如Docker和OpenVZ)奠定了基礎(chǔ)。
Linux還能夠使用NUMA(非統(tǒng)一內(nèi)存訪問)與多處理器系統(tǒng)一起使用。這樣做的目的是嘗試為最接近物理RAM的CPU上運行的進程分配內(nèi)存。
內(nèi)核也是用的類似malloc的東西申請內(nèi)存的。對內(nèi)核來說,kmalloc()也是一個內(nèi)存分配器。
你說的“l(fā)inux需要物理內(nèi)存分配器”,不管是用戶態(tài)的應(yīng)用級的,還是上面說的,內(nèi)核態(tài)的“應(yīng)用級”的,其實都是一個東西。
但是,在它倆下面,還有一個系統(tǒng)級的“內(nèi)存管理層”,或“虛擬內(nèi)存管理層”,管理頁表的創(chuàng)建,維護什么的。
你提的問題,應(yīng)該是兩個不同層面的問題,不要把它們放在一起想
malloc是在進程址空間中分配,并不能完成實際物理內(nèi)存分配。
再說為什么不直接訪問物理內(nèi)存:
其次,虛擬內(nèi)存管理以及到物理內(nèi)存的映射是現(xiàn)代處理器和操作系統(tǒng)必備功能,因為沒有虛擬內(nèi)存管理的話,就不能實現(xiàn)諸如動態(tài)分頁,Swap等。如果直接訪問物理內(nèi)存,就像feature phone或嵌入式系統(tǒng),內(nèi)存訪問出錯容易導(dǎo)致系統(tǒng)崩潰或者破壞其它程序的數(shù)據(jù)。
再次,有虛擬內(nèi)存管理,才可能有多進程。
最后,Linux確實是對內(nèi)存分頁了,但不可能按你說的方法,因為頁的大小是固定的,而內(nèi)核與應(yīng)用申請時不一定是固定大小,這會導(dǎo)致內(nèi)存使用效率低下。
最后,你可以去讀一下關(guān)于Linux內(nèi)存管理的文檔,或者《深入理解Linux內(nèi)核》中關(guān)于內(nèi)存管理
0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答