大多數(shù)計(jì)算和存儲(chǔ)部署如今面臨的情況是,計(jì)算機(jī)內(nèi)存空間都受到了上限的限制。現(xiàn)代系統(tǒng)的資源可能并不像內(nèi)存那樣受到限制,但操作系統(tǒng)、應(yīng)用程序和存儲(chǔ)設(shè)備總是需要采用更多的內(nèi)存。但內(nèi)存空間并不是無(wú)限的,在某些時(shí)候?qū)?huì)完全耗盡,這會(huì)導(dǎo)致系統(tǒng)不穩(wěn)定或數(shù)據(jù)丟失。
自從現(xiàn)代IT出現(xiàn)以來(lái),內(nèi)存空間耗盡的挑戰(zhàn)已由多種功能進(jìn)行處理,通常都?xì)w入內(nèi)存管理的內(nèi)容,以下對(duì)內(nèi)存管理的內(nèi)容進(jìn)行概述。
什么是內(nèi)存管理?
內(nèi)存管理就是要確保有盡可能多的可用內(nèi)存空間來(lái)執(zhí)行新的程序、數(shù)據(jù)和進(jìn)程。由于現(xiàn)代操作系統(tǒng)的多個(gè)部分使用內(nèi)存,因此內(nèi)存分配和內(nèi)存管理可以采取不同的形式。
•操作系統(tǒng)—Windows和Linux等操作系統(tǒng)可以利用物理內(nèi)存和硬盤(pán)交換空間來(lái)管理可用內(nèi)存的內(nèi)存池。
•編程語(yǔ)言—C語(yǔ)言要求開(kāi)發(fā)人員直接管理內(nèi)存利用率,而其他語(yǔ)言(如Java和C#)則提供自動(dòng)內(nèi)存管理。
•應(yīng)用程序—應(yīng)用程序使用和管理內(nèi)存,但通常受到基礎(chǔ)語(yǔ)言和操作系統(tǒng)定義的內(nèi)存管理功能的限制。
•存儲(chǔ)內(nèi)存管理—借助新的NVMe存儲(chǔ)驅(qū)動(dòng)器,操作系統(tǒng)可以從更快的存儲(chǔ)驅(qū)動(dòng)器中受益,以幫助擴(kuò)展和實(shí)現(xiàn)更持久的內(nèi)存管理形式。
為了有效處理,計(jì)算機(jī)的內(nèi)存管理功能必須位于硬件和操作系統(tǒng)之間。
內(nèi)存管理如何工作
內(nèi)存管理是關(guān)于有限物理資源的分配和優(yōu)化。例如,2GB RAM DIMM不能用作一大塊空間。而是使用存儲(chǔ)器分配技術(shù)將內(nèi)存劃分成可用的存儲(chǔ)器高速緩存塊。
操作系統(tǒng)或應(yīng)用程序中的內(nèi)存管理策略通常涉及了解內(nèi)存中可用的物理地址空間,并執(zhí)行內(nèi)存分配以從內(nèi)存地址空間正確放置、移動(dòng)、刪除進(jìn)程。
內(nèi)存地址的類型
操作系統(tǒng)中的靜態(tài)和動(dòng)態(tài)內(nèi)存分配鏈接到不同類型的內(nèi)存地址。從根本上說(shuō),有兩種核心類型的內(nèi)存地址:
•物理地址—是指系統(tǒng)內(nèi)存中的存儲(chǔ)位置,標(biāo)識(shí)為一組數(shù)字。
•邏輯地址—有時(shí)也稱為虛擬內(nèi)存,邏輯地址是操作系統(tǒng)和應(yīng)用程序訪問(wèn)執(zhí)行代碼的內(nèi)容,作為物理地址空間的抽象。
內(nèi)存管理單元(MMU)如何將虛擬地址轉(zhuǎn)換為物理地址?
計(jì)算系統(tǒng)內(nèi)的存儲(chǔ)器管理單元(MMU)是將虛擬邏輯地址空間轉(zhuǎn)換為物理地址的核心硬件組件。存儲(chǔ)器管理單元(MMU)通常是物理硬件,有時(shí)也稱為分頁(yè)存儲(chǔ)器管理單元(PMMU)。
存儲(chǔ)器管理單元(MMU)將虛擬地址轉(zhuǎn)換為物理地址的過(guò)程稱為虛擬地址轉(zhuǎn)換,并使用頁(yè)面目錄指針表(PDPT)將一種地址類型轉(zhuǎn)換為另一種地址類型。
該過(guò)程直接與頁(yè)表分配相關(guān)聯(lián),將一種地址類型匹配和管理到另一種地址類型。為了幫助加速虛擬地址轉(zhuǎn)換,有一種稱為轉(zhuǎn)換后備緩沖區(qū)(TLB)的緩存機(jī)制,它也是物理地址轉(zhuǎn)換過(guò)程的虛擬地址的一部分。
內(nèi)存分配:靜態(tài)加載與動(dòng)態(tài)加載
應(yīng)用程序和數(shù)據(jù)可以通過(guò)多種不同方式加載到內(nèi)存中,兩種核心方法是靜態(tài)加載和動(dòng)態(tài)加載。
•靜態(tài)加載—代碼在執(zhí)行之前加載到內(nèi)存中。用于結(jié)構(gòu)化編程語(yǔ)言,其中包括C語(yǔ)言。
•動(dòng)態(tài)加載—根據(jù)需要將代碼加載到內(nèi)存中。用于面向?qū)ο蟮木幊陶Z(yǔ)言,例如Java語(yǔ)言。
內(nèi)存碎片
當(dāng)在系統(tǒng)中分配內(nèi)存時(shí),并非所有可用內(nèi)存總是以線性方式使用,這可能導(dǎo)致碎片化。
內(nèi)存碎片有兩種核心類型:內(nèi)部碎片和外部碎片
•內(nèi)部碎片—內(nèi)存分配給進(jìn)程或應(yīng)用程序,未使用、未分配或碎片化的內(nèi)存。
•外部碎片—當(dāng)分配內(nèi)存然后釋放時(shí),可能會(huì)有較小的內(nèi)存剩余空間,留下不適合其他進(jìn)程的內(nèi)存漏洞或“碎片”。
分頁(yè)
在邏輯地址空間內(nèi),虛擬內(nèi)存使用分頁(yè)進(jìn)行劃分,這意味著它被分為固定的內(nèi)存單元,稱為頁(yè)面。頁(yè)面可以具有不同的大小,具體取決于底層系統(tǒng)體系結(jié)構(gòu)和操作系統(tǒng)。頁(yè)面管理過(guò)程可能非常復(fù)雜。
•有關(guān)如何在Linux中處理分頁(yè)的更多信息,需要查看完整的kernel.org文檔。
•而對(duì)于Windows系統(tǒng),微軟公司提供了有關(guān)其分頁(yè)過(guò)程的詳細(xì)信息。
分段
系統(tǒng)的主存儲(chǔ)器內(nèi)的存儲(chǔ)器分段是引用存儲(chǔ)器單元內(nèi)特定位的復(fù)雜過(guò)程。
系統(tǒng)內(nèi)存中的每個(gè)段都有自己的地址,以便改進(jìn)優(yōu)化和內(nèi)存分配。分段寄存器是現(xiàn)代系統(tǒng)處理內(nèi)存分段的主要機(jī)制。
交換
交換是操作系統(tǒng)從存儲(chǔ)設(shè)備中請(qǐng)求額外內(nèi)存的過(guò)程。
交換如何工作是操作系統(tǒng)定義用作“交換空間”的存儲(chǔ)區(qū)域,即存儲(chǔ)空間,存儲(chǔ)過(guò)程將被存儲(chǔ)并在物理和虛擬內(nèi)存空間耗盡、釋放和回收時(shí)運(yùn)行。交換空間與傳統(tǒng)存儲(chǔ)的使用是擴(kuò)展可用內(nèi)存的次優(yōu)方法,因?yàn)樗鼤?huì)產(chǎn)生與物理內(nèi)存之間傳輸?shù)拈_(kāi)銷。此外,傳統(tǒng)存儲(chǔ)設(shè)備以較慢的接口速度運(yùn)行內(nèi)存。
然而,現(xiàn)在正在重新考慮交換,以便通過(guò)更快的PCIe SSD硬盤(pán)來(lái)擴(kuò)展內(nèi)存,其提供高達(dá)16GB/s的接口連接速度。相比之下,SATA連接的SSD硬盤(pán)的最大連接速度為6.0GB/s。
為什么需要內(nèi)存管理?
內(nèi)存管理是所有現(xiàn)代計(jì)算系統(tǒng)的基本元素。隨著虛擬化的持續(xù)使用和優(yōu)化資源利用的需要,內(nèi)存不斷地被分配、刪除、分段、使用和重新使用。使用內(nèi)存管理技術(shù),可以減少可能導(dǎo)致系統(tǒng)和應(yīng)用程序不穩(wěn)定和故障的內(nèi)存管理錯(cuò)誤。
優(yōu)勢(shì)
•最大限度地提高程序的內(nèi)存可用性;
•允許重復(fù)使用和回收未主動(dòng)使用的內(nèi)存;
•可以通過(guò)交換幫助擴(kuò)展可用的物理內(nèi)存。
缺點(diǎn)
•可能導(dǎo)致內(nèi)存資源碎片化;
•增加了系統(tǒng)操作的復(fù)雜性;
•引入潛在的性能延遲。