任何操作系統(tǒng)中最基本的部分之一就是管理內(nèi)存。該子系統(tǒng)通常稱(chēng)為內(nèi)存管理單元或MMU。這個(gè)子系統(tǒng)是一個(gè)非常復(fù)雜的子系統(tǒng),但是對(duì)我們來(lái)說(shuō)幸運(yùn)的是,它有很多文獻(xiàn)記錄。
當(dāng)Linux使用系統(tǒng)RAM時(shí),它將創(chuàng)建一個(gè)虛擬內(nèi)存層,然后將進(jìn)程分配給虛擬內(nèi)存。虛擬內(nèi)存實(shí)際上是RAM和交換空間的結(jié)合。交換空間是硬盤(pán)驅(qū)動(dòng)器中的一部分,如果可用的RAM用完了,則指定為可用空間。
如前所述,操作系統(tǒng)允許進(jìn)程訪問(wèn)RAM的一部分。該進(jìn)程完全無(wú)法控制內(nèi)存分配。因此,在應(yīng)用程序上工作的開(kāi)發(fā)人員,尤其是用高級(jí)代碼編寫(xiě)的開(kāi)發(fā)人員,不必?fù)?dān)心使用內(nèi)存。
通常,任何文件或文件系統(tǒng)的一部分都使用系統(tǒng)命令mmap進(jìn)行映射,并稱(chēng)為內(nèi)存映射文件。如果一個(gè)內(nèi)存頁(yè)面文件沒(méi)有任何關(guān)聯(lián)的文件,則稱(chēng)為匿名內(nèi)存,并且使用“malloc”函數(shù)分配ut。
通過(guò)使用分配文件映射的內(nèi)存和匿名內(nèi)存的方式,操作系統(tǒng)可以使使用相同文件的進(jìn)程與相同的虛擬內(nèi)存頁(yè)面一起工作,從而更有效地使用內(nèi)存。有時(shí),一個(gè)進(jìn)程正在占用另一個(gè)進(jìn)程所需的內(nèi)存。
“Cgroups”是用于將進(jìn)程隔離到特定內(nèi)存地址的實(shí)用程序,該程序?qū)⑦M(jìn)程分組為邏輯組并為其分配一定數(shù)量的內(nèi)存。Linux中包含cgroup實(shí)際上為當(dāng)今使用的容器(例如Docker和OpenVZ)奠定了基礎(chǔ)。
Linux還能夠使用NUMA(非統(tǒng)一內(nèi)存訪問(wèn))與多處理器系統(tǒng)一起使用。這樣做的目的是嘗試為最接近物理RAM的CPU上運(yùn)行的進(jìn)程分配內(nèi)存。