自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux內(nèi)存管理之全局框架

存儲(chǔ) 存儲(chǔ)軟件 Linux
講解復(fù)雜繁瑣的機(jī)制原理,最通俗的方法就是用模型架構(gòu)的方式向讀者呈現(xiàn),先要在整體上了解大方向大架構(gòu),再根據(jù)大方向大架構(gòu)來(lái)進(jìn)行分支深入,猶如毛主席那句話“戰(zhàn)略上蔑視敵人,戰(zhàn)術(shù)上重視敵人”。

講解復(fù)雜繁瑣的機(jī)制原理,最通俗的方法就是用模型架構(gòu)的方式向讀者呈現(xiàn),先要在整體上了解大方向大架構(gòu),再根據(jù)大方向大架構(gòu)來(lái)進(jìn)行分支深入,猶如毛主席那句話“戰(zhàn)略上蔑視敵人,戰(zhàn)術(shù)上重視敵人”。下面我也以這種方式把各個(gè)大模型方式向大家畫出,并作出簡(jiǎn)略解述。

[[239583]]

一.  地址劃分。

1. CPU地址。

CPU地址是指CPU的地址總線能尋址的范圍,32bit-CPU尋址范圍為4G, 這個(gè)地址是虛擬的,實(shí)際上外部物理內(nèi)存是不會(huì)使用這么大的內(nèi)存。

CPU虛擬地址的4G空間,通常劃分為兩部分,一部分為內(nèi)核虛擬地址,通常為3G-4G之間,另一部分為用戶虛擬地址,通常為0G-3G之間,顯然,用戶進(jìn)程能使用的虛擬地址范圍遠(yuǎn)大于內(nèi)核可以使用的虛擬地址空間,但是,物理內(nèi)存只有局限性的幾M,幾G,內(nèi)核虛擬地址如何使用物理內(nèi)存,用戶空間如何使用物理內(nèi)存,這些問(wèn)題正是linux內(nèi)存管理的關(guān)鍵。

2.  物理內(nèi)存

物理內(nèi)存是指外部存儲(chǔ)數(shù)據(jù)的設(shè)備,有可以被CPU尋址到的地址總線,受到CPU的Cache 和TLB/MMU管理尋址。

需要澄清一個(gè)概念:任何代碼是在CPU上運(yùn)行的,而不是在物理內(nèi)存上,物理內(nèi)存是個(gè)設(shè)備,用于存放用戶進(jìn)程空間的可執(zhí)行代碼或者內(nèi)核關(guān)鍵數(shù)據(jù)結(jié)構(gòu),這些代碼或結(jié)構(gòu)終將是要受到CPU通過(guò)MMU尋址,Cache***指令數(shù)據(jù)來(lái)獲取的。

NUMA的全稱是非一致性內(nèi)存訪問(wèn),它通常是多核訪問(wèn)的概念,每一個(gè)CPU核都會(huì)有一個(gè)節(jié)點(diǎn)對(duì)應(yīng)使用一部分物理內(nèi)存,對(duì)這些節(jié)點(diǎn)的管理附加這些數(shù)據(jù)結(jié)構(gòu):perCPU變量,list表串聯(lián)各節(jié)點(diǎn)遍歷,zone的劃分,zonelist的管理等等。為了使問(wèn)題更加簡(jiǎn)單化,我們只分析UMA的一個(gè)節(jié)點(diǎn)的情況,當(dāng)然它也包含NUMA的一些數(shù)據(jù)結(jié)構(gòu)特征,這個(gè)后面會(huì)有所簡(jiǎn)述。

下圖是NUMA的一個(gè)簡(jiǎn)略圖抽象如圖2-1所示。

      圖2-1 NUMA多核物理內(nèi)存zone示意圖

3.  內(nèi)核虛擬地址空間劃分。

如果讀者僅僅了解一些皮毛,必然認(rèn)為內(nèi)核的虛擬地址空間僅有邏輯地址這一說(shuō),其實(shí)這只是內(nèi)存內(nèi)核虛擬地址劃分的一個(gè)特例,并非全部的完整表述,現(xiàn)在我劃出完整的圖形,并且改變改變對(duì)內(nèi)核虛擬地址空間名稱的叫法,如圖2-2

圖2-2 內(nèi)核虛擬地址空間劃分及其對(duì)物理內(nèi)存的映射

下面來(lái)改改名字咯,直接映射的地址我們可以叫為內(nèi)核物理直接映射地址或者邏輯地址。linux原則上只能使用虛擬空間1G中的896M,剩下的128M留作它用,所以直接映射之外的物理內(nèi)存稱為高端內(nèi)存。128M之間的空間又劃分為多個(gè)gap安全間隙,虛擬地址,固定映射和持久映射,注意這里的虛擬地址叫法通常和前述的內(nèi)核虛擬地址有些混雜,后者是指CPU內(nèi)核虛擬地址,是更廣的概念。由于直接映射的部分有了名字叫邏輯地址,那么這里的虛擬地址空間常專指這個(gè)部分。

虛擬地址有以下用途,使用vm_struct結(jié)構(gòu)體經(jīng)內(nèi)核管理高端內(nèi)存,它可以使用kmap方式獲取高端物理內(nèi)存的空間;也可以不映射物理高端內(nèi)存,將這段地址直接作為外部物理設(shè)備的ioremap地址,從而可以直接操縱設(shè)備,當(dāng)然這也將外部設(shè)備地址空間暴露出來(lái)并且容易造成干擾,所以通常不能直接訪問(wèn)ioremap映射的地址而是用readb/writeb讀寫,而且要做好優(yōu)化屏障設(shè)置并且用iounmap釋放,因?yàn)橛成淞说脑O(shè)備常具有’邊際效應(yīng)’.

如果沒(méi)有高端內(nèi)存,(當(dāng)然32bit的嵌入式系統(tǒng)通常不會(huì)使用高端內(nèi)存,至少我見(jiàn)過(guò)的那么多關(guān)于ARM,powerPC,MIPS32的嵌入式應(yīng)用都是沒(méi)有使用高端內(nèi)存的), 那么固定映射和持久映射也多半不會(huì)用到。固定映射可以指定長(zhǎng)期持有物理內(nèi)存某些地址頁(yè)的占用,這個(gè)映射關(guān)系可以在初始階段進(jìn)行配置,而持久映射在啟用時(shí)就建立了同高端內(nèi)存物理頁(yè)的映射關(guān)系,它在其他階段都不會(huì)被解除。

強(qiáng)調(diào)的是,我這里不關(guān)心高端內(nèi)存,內(nèi)核的直接映射邏輯地址就可以涵蓋全部物理內(nèi)存。

4.  用戶虛擬地址空間的劃分

用戶虛擬地址空間圖構(gòu)并不復(fù)雜,復(fù)雜的是它在虛擬內(nèi)存空間中的應(yīng)用,如何映射文件,如何組織區(qū)間映射,關(guān)聯(lián)的進(jìn)程是誰(shuí),對(duì)應(yīng)的內(nèi)存結(jié)構(gòu)體實(shí)例是什么等等問(wèn)題才是用戶虛擬映射最難的地方,下面僅僅劃出圖示,對(duì)用戶虛擬內(nèi)存空間可以先有一個(gè)大了解,如圖2-3。

圖2-3用戶空間虛擬內(nèi)存布局

既然用戶空間是虛擬的,那么它是怎么訪問(wèn)物理內(nèi)存的呢,當(dāng)然就是PGD,PUD,PMD,PTE,OFFSET及其TLB快表查詢了,上層目錄入口PUD和中間目錄入口一般不考慮,考慮二級(jí)目錄就可以了。從網(wǎng)上摘的圖2-4:

圖2-4 用戶進(jìn)程空間訪問(wèn)物理內(nèi)存的方法

二.  伙伴系統(tǒng)

伙伴系統(tǒng)是按階管理外界物理內(nèi)存的方法,***有11階,每一階有一個(gè)或者多個(gè)頁(yè)合并的集合并使用指針串聯(lián)起來(lái),同時(shí)在同一階中的一個(gè)或多個(gè)頁(yè)集合中形成各自的伙伴,要強(qiáng)調(diào)的是各個(gè)階的伙伴都是等頁(yè)個(gè)數(shù)的,用下圖2-5是比較好理解的。

            

圖2-5 伙伴系統(tǒng)在內(nèi)存中的大致模型

當(dāng)內(nèi)核申請(qǐng)一段按頁(yè)卻并非按照階數(shù)分配的內(nèi)存時(shí)候,通常會(huì)使用伙伴系統(tǒng)原理將其按照該申請(qǐng)空間的***階數(shù)分配,多出來(lái)的頁(yè)按照伙伴系統(tǒng)算法歸并到其他階的鏈表當(dāng)中形成其他階的新伙伴。釋放該內(nèi)存空間的時(shí)候,釋放的空間會(huì)嘗試找到能以它為伙伴的那個(gè)階進(jìn)行連接,如果大小超過(guò),則劈開(kāi),多余的再尋找其他可以以它為伙伴的階。夠拗口的,但還是很容易理解的,后面會(huì)有源代碼呈現(xiàn)出來(lái)以實(shí)例詳細(xì)分析。

三.  反碎片技術(shù):

反碎片機(jī)制其實(shí)還在伙伴系統(tǒng)之前,它主要是將各個(gè)zone區(qū)域的物理內(nèi)存分成可回收reclaimable但不可移動(dòng)unmovable,可移動(dòng)movable,不可移動(dòng)unmovable. 這些標(biāo)記按照一定得list串聯(lián)起來(lái)管理,當(dāng)外部條件申請(qǐng)物理內(nèi)存導(dǎo)致許多碎片的時(shí)候,它可以按照這些數(shù)據(jù)結(jié)構(gòu)的標(biāo)志,來(lái)從新組織歸類物理內(nèi)存,從而減少碎片頁(yè)或者孤獨(dú)頁(yè)。反碎片技術(shù)在嵌入式系統(tǒng)當(dāng)中少用,絕大部分由伙伴系統(tǒng)占據(jù)江山了,因此不會(huì)對(duì)此做具體分析,簡(jiǎn)略過(guò)之。

四.    Slab分配機(jī)制。

眾所周知,操作系統(tǒng)使用伙伴系統(tǒng)管理內(nèi)存,不僅會(huì)造成大量的內(nèi)存碎片,同時(shí)處理效率也較低下。SLAB是一種內(nèi)存管理機(jī)制,其擁有較高的處理效率,同時(shí)也有效的避免內(nèi)存碎片的產(chǎn)生,其核心思想是預(yù)分配。其按照SIZE對(duì)內(nèi)存進(jìn)行分類管理的,當(dāng)申請(qǐng)一塊大小為SIZE的內(nèi)存時(shí),分配器就從SIZE集合中分配一個(gè)內(nèi)存塊(BLOCK)出去,當(dāng)釋放一個(gè)大小為SIZE的內(nèi)存時(shí),則將該內(nèi)存塊放回到原有集合,而不是釋放給操作系統(tǒng)。當(dāng)又要申請(qǐng)相同大小的內(nèi)存時(shí),可以復(fù)用之前被回收的內(nèi)存塊(BLOCK),從而避免了內(nèi)存碎片的產(chǎn)生。[注:因SLAB處理過(guò)程的細(xì)節(jié)較多,在此只是做一個(gè)原理上的講解

1. 總體結(jié)構(gòu)

  圖1 SLAB內(nèi)存結(jié)構(gòu)

2.處理流程

如圖1中所示:SLAB管理機(jī)制將內(nèi)存大體上分為SLAB頭、SLOT數(shù)組、PAGES數(shù)組、可分配空間、被浪費(fèi)空間等模塊進(jìn)行分別管理,其中各模塊的功能和作用:

SLAB頭:包含SLAB管理的匯總信息,如最小分配單元(min_size)、最小分配單元對(duì)應(yīng)的位移(min_shift)、頁(yè)數(shù)組地址(pages)、空閑頁(yè)鏈表(free)、可分配空間的起始地址(start)、內(nèi)存塊結(jié)束地址(end)等等信息(如代碼1所示),在內(nèi)存的管理過(guò)程中,內(nèi)存的分配、回收、定位等等操作都依賴于這些數(shù)據(jù)。

SLOT數(shù)組:SLOT數(shù)組各成員分別負(fù)責(zé)固定大小的內(nèi)存塊(BLOCK)的分配和回收。在nginx中SLOT[0]~SLOT[7]分別負(fù)責(zé)區(qū)間在[1~8]、[9~16]、[17~32]、[33~64]、[65~128]、[129~256]、[257~512]、[513~1024]字節(jié)大小內(nèi)存的分配,但為方便內(nèi)存塊(BLOCK)的分配和回收,每個(gè)內(nèi)存塊(BLOCK)的大小為各區(qū)間的上限(8、16、32、64、128、256、512、1024)。比如說(shuō):假如應(yīng)用進(jìn)程請(qǐng)求申請(qǐng)5個(gè)字節(jié)的空間,因5處在[1~8]的區(qū)間內(nèi),因此由SLOT[0]負(fù)責(zé)該內(nèi)存的分配,但區(qū)間[1~8]的上限為8,因此即使申請(qǐng)5個(gè)字節(jié),卻依然分配8字節(jié)給應(yīng)用進(jìn)程。以此類推:假如申請(qǐng)12字節(jié),12處于區(qū)間[9~16]之間,取上限16,因此由SLOT[1]分配16個(gè)字節(jié)給應(yīng)用進(jìn)程;假如申請(qǐng)50字節(jié),50處于區(qū)間[33~64]之間,取上限64,因此由SLOT[2]分配64個(gè)字節(jié)給應(yīng)用進(jìn)程;假如申請(qǐng)84字節(jié),84處于區(qū)間[65~128]之間,取上限128,因此由SLOT[3]分配128個(gè)字節(jié);...;假如申請(qǐng)722字節(jié),722處于區(qū)間[513~1024]之間,取上限1024,因此由SLOT[7]分配1024字節(jié)。

PAGES數(shù)組:PAGES數(shù)組各成員分別負(fù)責(zé)可分配空間中各頁(yè)的查詢、分配和回收,其處理流程可參考3.2節(jié)的說(shuō)明。

可分配空間:SLAB在邏輯上將可分配空間劃分成M個(gè)內(nèi)存頁(yè),每頁(yè)大小為4K。每頁(yè)內(nèi)存與PAGES數(shù)組成員一一對(duì)應(yīng),由PAGES數(shù)組各成員負(fù)責(zé)各內(nèi)存頁(yè)的分配和回收。

被浪費(fèi)空間:按照每頁(yè)4K的大小對(duì)空間進(jìn)行劃分時(shí),滿足4K的空間,將作為可分配空間被PAGES數(shù)組進(jìn)行管理,而***剩余的不足4K的內(nèi)存將會(huì)被舍棄,也就是被浪費(fèi)了!

責(zé)任編輯:武曉燕 來(lái)源: 嵌入式Linux中文站
相關(guān)推薦

2013-10-11 17:32:18

Linux運(yùn)維內(nèi)存管理

2023-10-18 13:31:00

Linux內(nèi)存

2021-05-31 10:03:52

虛擬內(nèi)存管理

2011-01-11 13:47:27

Linux管理進(jìn)程

2011-01-11 13:53:33

Linux管理磁盤

2009-10-19 09:45:06

linux內(nèi)存內(nèi)存管理

2022-08-08 08:31:00

Linux內(nèi)存管理

2017-05-18 16:30:29

Linux內(nèi)存管理

2011-08-23 14:23:25

Oracle 10g內(nèi)系統(tǒng)全局區(qū)

2009-12-25 17:15:03

Linux內(nèi)存

2020-07-28 08:10:33

Linux內(nèi)存虛擬

2021-03-17 21:34:44

Linux內(nèi)存管理

2009-12-25 15:24:16

內(nèi)存管理

2020-04-08 09:20:25

Linux內(nèi)存系統(tǒng)

2020-06-28 09:30:37

Linux內(nèi)存操作系統(tǒng)

2022-02-11 07:45:10

Linuxsmem系統(tǒng)

2024-05-06 08:09:10

Linux內(nèi)存管理

2013-09-29 15:11:46

Linux運(yùn)維內(nèi)存管理

2021-05-27 05:28:18

Linux 內(nèi)存管理

2013-10-12 13:01:51

Linux運(yùn)維內(nèi)存管理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)