掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
Linux操作系統(tǒng)被廣泛使用,因?yàn)槠浞€(wěn)定性和開放性,使其成為許多企業(yè)和個(gè)人的首選。在Linux系統(tǒng)中,內(nèi)存管理是一個(gè)非常重要且復(fù)雜的任務(wù)。在這篇文章中,我們將,了解該機(jī)制對(duì)Linux應(yīng)用程序的性能和穩(wěn)定性的影響。

創(chuàng)新互聯(lián)建站長(zhǎng)期為近千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為建鄴企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、成都網(wǎng)站制作,建鄴網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
1. 什么是內(nèi)存頁(yè)管理?
內(nèi)存頁(yè)管理是一種Linux內(nèi)核提供的管理內(nèi)存頁(yè)面的方法。在Linux中,內(nèi)存被分為許多小的頁(yè)面(通常為4KB),并且每個(gè)頁(yè)面都有一個(gè)唯一的標(biāo)識(shí)符,稱為頁(yè)幀號(hào)(PFN)。內(nèi)存頁(yè)管理的主要目的是為內(nèi)核和用戶空間應(yīng)用程序提供透明的內(nèi)存分配和管理機(jī)制。
2. Linux內(nèi)核中的內(nèi)存頁(yè)管理
Linux內(nèi)核中的內(nèi)存頁(yè)管理機(jī)制由以下三個(gè)部分組成:
– 物理內(nèi)存:這是計(jì)算機(jī)中實(shí)際的內(nèi)存,通常是隨機(jī)訪問(wèn)存儲(chǔ)器(RAM)。
– 邏輯內(nèi)存:這是系統(tǒng)中應(yīng)用程序使用的內(nèi)存,它分為用戶空間和內(nèi)核空間。
– 內(nèi)存管理單元(MMU):這是負(fù)責(zé)將邏輯內(nèi)存映射到物理內(nèi)存的硬件組件。
Linux內(nèi)核中的內(nèi)存頁(yè)管理機(jī)制包括以下幾個(gè)重要的功能:
– 內(nèi)存頁(yè)面分配:當(dāng)用戶空間應(yīng)用程序需要內(nèi)存時(shí),Linux內(nèi)核會(huì)使用頁(yè)幀號(hào)(PFN)來(lái)映射空閑的物理頁(yè)面,并為應(yīng)用程序分配邏輯內(nèi)存。
– 頁(yè)面交換:當(dāng)Linux內(nèi)核需要更多的內(nèi)存來(lái)運(yùn)行應(yīng)用程序時(shí),它會(huì)將一些內(nèi)存頁(yè)面交換到磁盤上以釋放物理內(nèi)存。
– 頁(yè)面緩存:為了加快訪問(wèn)文件和文件系統(tǒng)數(shù)據(jù)的速度,Linux內(nèi)核維護(hù)了一個(gè)頁(yè)面緩存,其中包含最近訪問(wèn)過(guò)的數(shù)據(jù)頁(yè)面。
– 頁(yè)表:該頁(yè)表是負(fù)責(zé)管理物理內(nèi)存和邏輯內(nèi)存之間的映射關(guān)系的數(shù)據(jù)結(jié)構(gòu)。
3. Linux中的內(nèi)存分配器
Linux中有多個(gè)內(nèi)存分配器,包括SLAB分配器、SLUB分配器和SLOB分配器。它們都有各自的優(yōu)點(diǎn)和缺點(diǎn)。
– SLAB分配器:SLAB分配器是Linux內(nèi)核中最古老的分配器,它可以提供高速的分配,但需要大量的內(nèi)存來(lái)管理分配。因此,它通常用于分配大塊內(nèi)存(例如文件系統(tǒng)緩存)。
– SLUB分配器:SLUB分配器是Linux內(nèi)核中較新的分配器,它提供了較快的分配速度和較低的內(nèi)存利用率。由于它使用的內(nèi)存比較少,因此通常用于分配小塊內(nèi)存(例如內(nèi)核數(shù)據(jù)結(jié)構(gòu))。
– SLOB分配器:SLOB分配器是最簡(jiǎn)單的分配器,它旨在處理低內(nèi)存環(huán)境中的內(nèi)存分配。它可以實(shí)現(xiàn)簡(jiǎn)化的內(nèi)存管理,但可能會(huì)導(dǎo)致更高的內(nèi)存碎片。因此,它通常用于嵌入式系統(tǒng)或其他具有非常受限內(nèi)存的系統(tǒng)。
4. 內(nèi)存管理的性能和穩(wěn)定性
在Linux系統(tǒng)中,內(nèi)存管理的性能和穩(wěn)定性是至關(guān)重要的。如果內(nèi)存管理不良,則可能會(huì)導(dǎo)致系統(tǒng)崩潰或出現(xiàn)其他問(wèn)題。
Linux中的內(nèi)存管理器需要處理多個(gè)因素,包括內(nèi)存壓力、內(nèi)存碎片和頁(yè)面交換。它必須平衡這些因素,并通過(guò)使用適當(dāng)?shù)姆峙淦骱退惴▉?lái)優(yōu)化內(nèi)存使用。
此外,Linux系統(tǒng)中的內(nèi)存頁(yè)管理機(jī)制具有高度的靈活性和可配置性。管理員可以使用不同的內(nèi)存分配器和管理器來(lái)優(yōu)化內(nèi)存使用,而不會(huì)對(duì)系統(tǒng)的可靠性和穩(wěn)定性產(chǎn)生負(fù)面影響。
Linux內(nèi)存頁(yè)管理機(jī)制是一個(gè)非常復(fù)雜但又非常重要的部分,對(duì)于系統(tǒng)的性能和穩(wěn)定性有著巨大的影響。理解內(nèi)存頁(yè)管理機(jī)制的工作原理可以幫助管理員優(yōu)化內(nèi)存使用,并確保系統(tǒng)的可靠性和穩(wěn)定性。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
太多了,我就做一次搬運(yùn)工了。
相信很多人在看內(nèi)核內(nèi)存管理部分的時(shí)候,都有這樣一個(gè)疑問(wèn),為什么物理頁(yè)面的大小選擇4K,而不是大一些或者小一些呢?
這個(gè)問(wèn)題沒有固定的答案,仁者見仁智者見智,每個(gè)人的關(guān)注點(diǎn)不一樣。所以這篇文章不是說(shuō)給出一個(gè)固定的答案,更多的只是一篇討論性的文章。
內(nèi)核的頁(yè)面大小首先跟CPU有關(guān),不同的架構(gòu)支持的頁(yè)面大小也不相同,但有一個(gè)共同點(diǎn),那就是肯定支持4K的頁(yè)面大小。為什么處理器在設(shè)計(jì)
的時(shí)候會(huì)選擇4K,而不是其他,這個(gè)只有熟悉CPU歷史的人才能給出答案,本人才疏學(xué)淺,回答不上來(lái),有興趣的自己找一找。當(dāng)然處理器的設(shè)計(jì)者在考慮頁(yè)面
大小的時(shí)候,也不是憑空就選擇了這個(gè)大小,除了歷史因素,肯定綜合了考慮了大頁(yè)面、小頁(yè)面的優(yōu)缺點(diǎn),所以這里主要列出這些優(yōu)缺點(diǎn),通過(guò)這些比較來(lái)發(fā)現(xiàn)內(nèi)核
為什么將默認(rèn)的頁(yè)面大小選擇為4K。
現(xiàn)在更多爭(zhēng)論的是大頁(yè)面還是維持現(xiàn)在的頁(yè)面4K大小,所以小頁(yè)面的情況我們就不考慮了,通過(guò)比較前兩者也可以得出小頁(yè)面的情況。支持大頁(yè)面的人通常認(rèn)為大頁(yè)面有以下好處:
1、減小page table占用的內(nèi)存。
假設(shè)內(nèi)存一定的話,頁(yè)面大桐襲旅小越大,管理頁(yè)面占用的內(nèi)存也越小。現(xiàn)在內(nèi)核中每個(gè)頁(yè)面假設(shè)是4K的話,這4K不是全都可用,還有一部分用作
struct
page(大約是64bytes),如果是2.6.32的話,每個(gè)頁(yè)還有一個(gè)page_cgroup(32bytes),也就是說(shuō)內(nèi)存大小的2.3%
(96/4096)會(huì)被內(nèi)核固定使用。如果頁(yè)面大小是4M的話,這個(gè)比率大約是0.0006%。假設(shè)內(nèi)存時(shí)64G的話,頁(yè)面大小是4K,管理頁(yè)占用的內(nèi)存
為1.472G,而頁(yè)面大小是4M,管理頁(yè)面占用的內(nèi)存為0.393M。所以頁(yè)面比較大時(shí),節(jié)省的內(nèi)存比較多。
2、提高TLB的命中率
每次訪問(wèn)內(nèi)存的時(shí)候,都要將
虛擬
地址轉(zhuǎn)換為
物理地址
,如果每次都訪問(wèn)頁(yè)表的話,消耗比較大。因此,通常使用TLB來(lái)加速這個(gè)過(guò)程。但是
TLB的可以直接轉(zhuǎn)換的地址范圍是有限的(具體就是項(xiàng)數(shù)乘以頁(yè)面大小),一旦出現(xiàn)TLB
miss,這時(shí)就必須去頁(yè)表中查找。所以,如果是大頁(yè)面的話,同樣TLB項(xiàng)數(shù)的情況下,可以跟蹤更大的內(nèi)存。
3、提高磁盤I/O
我們知道在訪問(wèn)磁盤時(shí),最耗時(shí)的操作就是查找寫入盤區(qū)的起始位置,也就是在磁盤盤片上將讀寫頭置于正確的位置上。所以如果是大頁(yè)面的話,可以減少寫入磁盤的次數(shù)。比如要寫入4M的緩存,頁(yè)面大小是4M的話,局凳只需寫入1次,而頁(yè)面大小是4K的話,則需要寫入4次。
4、提供緩存利用率
如果是大頁(yè)面的話,可以減少訪問(wèn)伙伴系統(tǒng)的次數(shù)。調(diào)用伙伴系統(tǒng)的操作隊(duì)系統(tǒng)的數(shù)據(jù)和指令
高速緩存
有相當(dāng)?shù)挠绊?。?nèi)核越浪費(fèi)這些資源,這些資源對(duì)用戶空間進(jìn)程就越不可用。
除了上面提高的好處,肯定還有的好處,就不一一列舉了。那既然有這么好處,而且現(xiàn)在內(nèi)存越來(lái)越大,為什么不更多地采用大頁(yè)面呢?比如4M?
軟件開發(fā)中,從來(lái)不會(huì)有
非常完美
的方案,都是在優(yōu)缺點(diǎn)之間找到平衡點(diǎn)。同樣,大頁(yè)面有這樣那樣的好處,缺點(diǎn)也很明顯。
1、更大的問(wèn)題就是內(nèi)存浪費(fèi),而且這個(gè)問(wèn)題非常嚴(yán)重。比如這時(shí)要分配的內(nèi)存是4M+1byte,這時(shí)需要兩個(gè)頁(yè)面才能滿足分配的需要,這個(gè)
時(shí)候浪費(fèi)的內(nèi)存為4M-1byte。如果頁(yè)面是4K的話,浪費(fèi)的內(nèi)存數(shù)量為4k-1byte。頁(yè)面太大,可能導(dǎo)致每個(gè)頁(yè)面都只使用了部分空間,剩余的空間
就被浪費(fèi)了。當(dāng)然對(duì)于數(shù)據(jù)庫(kù)這樣的系統(tǒng)來(lái)說(shuō),頁(yè)面越大會(huì)越好,但是內(nèi)核要考慮到通用的情況,而不是專注于特殊的應(yīng)用場(chǎng)景。再比如,現(xiàn)在系統(tǒng)都是只分配虛擬
地址空間,虛擬地址空間只有在真正被訪問(wèn)的時(shí)候,才映射物理頁(yè)面,而且為了減少物理頁(yè)面的浪費(fèi),對(duì)不訪問(wèn)的部分,則不作映射。如果頁(yè)面太大,在映射很小的
部分時(shí),分配的內(nèi)存會(huì)越大,浪費(fèi)也就越大。系統(tǒng)在運(yùn)行時(shí),會(huì)頻繁地請(qǐng)求內(nèi)存頁(yè)的操作,這樣導(dǎo)致潛在的浪費(fèi)會(huì)非常嚴(yán)重。這樣的浪費(fèi)會(huì)完全抵消減小page
table的優(yōu)勢(shì)。
2、頁(yè)面太大,會(huì)導(dǎo)致大量的內(nèi)存碎片。因?yàn)榈讓拥膬?nèi)存管理是以頁(yè)面為單位。如果系統(tǒng)運(yùn)行了很長(zhǎng)時(shí)間,空閑的內(nèi)存很多,但是連續(xù)的內(nèi)存塊都小
于要分配的頁(yè)面數(shù)。這時(shí)可以通過(guò)移動(dòng)內(nèi)存塊或者利用swap來(lái)獲取可用內(nèi)存,但是會(huì)導(dǎo)致分配內(nèi)存的操作很慢,這種慢會(huì)形成惡性循環(huán),嚴(yán)重影響系統(tǒng)的禪嫌性能。
如果是小頁(yè)面的話,內(nèi)存的利用會(huì)比較緊湊,分配頁(yè)面時(shí)需要的連續(xù)內(nèi)存塊的大小不像大頁(yè)面那樣需要的那么大。
3、如果CPU崩潰,TLB可以訪問(wèn)的內(nèi)存越大,對(duì)系統(tǒng)的影響也越大。這時(shí)一把
雙刃劍
,大頁(yè)面可以提供TLB訪問(wèn)的內(nèi)存數(shù)量,但是CPU崩潰時(shí),會(huì)導(dǎo)致很多內(nèi)存訪問(wèn)要去頁(yè)表中請(qǐng)求物理地址。
4、兼容性問(wèn)題。X86處理器支持的頁(yè)面大小只有4K,所以如果頁(yè)面過(guò)大的話,會(huì)導(dǎo)致兼容性問(wèn)題。
5、如果頁(yè)面太大,在將內(nèi)存頁(yè)換出到swap分區(qū)時(shí),需要換出的內(nèi)存也就越大,會(huì)影響性能。
總之,這個(gè)頁(yè)面大小4K是在計(jì)算機(jī)發(fā)展過(guò)程中選擇的,也是在實(shí)踐中經(jīng)過(guò)檢驗(yàn)的,現(xiàn)在看來(lái)這個(gè)頁(yè)面是合適的。
198 unsigned long get_free_page(void)
199{
200 unsigned long result;
201
202repeat:
203 __a__(“std ; repne ; sca\此判n\t”
204 “jne 1f\n\t”
205 “movb $1,1(%%edi)\n\t”
206 “sall $12,%%ecx\n\t”
207 …
215 :”0″ (0),”i” (LOW_MEM),”c” (PAGING_PAGES),
216 “D” (mem_map+PAGING_PAGES-1)
217 :”di”,”cx”,”dx”);
…
223 }
224 if (!result && swap_out())
225 goto repeat;
226 return result;
227}
在這段代碼中, 沒有存在中斷屏蔽cli , 而在fork系統(tǒng)調(diào)用中直接使用這個(gè)函數(shù), 如果在執(zhí)行到204的時(shí)森彎改候被中斷, 并且其他進(jìn)鬧橋程也調(diào)用fork系統(tǒng)調(diào)用執(zhí)行完這個(gè)函數(shù), 這樣就會(huì)導(dǎo)致同一頁(yè)被引用兩次, 而mark數(shù)值 1 而造成數(shù)據(jù)重復(fù)的錯(cuò)誤. 不知道會(huì)不會(huì)造成這樣子的錯(cuò)誤.
問(wèn)題關(guān)鍵在于理解以下棚敏槐指令:
“std ; repne ; sca\n\t”
1、std:方向位DF置位,即DI進(jìn)行自減操作。
2、repne; sca
這兩條組合指令實(shí)現(xiàn)循環(huán)比較。ecx初值為15*1024,al=0,di初值為&mem_map,即從數(shù)組mem_map的最后一項(xiàng)開始,依次與al(=0)進(jìn)行比較。假設(shè)數(shù)組第i項(xiàng)mem_map==0,則結(jié)束循環(huán),此時(shí)ecx=i, edi=&mem_map(因?yàn)閑cx初值為15*1024,di初值為數(shù)組最后一項(xiàng)15*1024-1的地址)。找到空閑頁(yè)面后,將該數(shù)組項(xiàng)置1,即*(edi+1)=mem_map=1,即語(yǔ)鏈友句“movb $1,1(%%edi)”實(shí)現(xiàn)的功能。此時(shí),ecx即為空閑頁(yè)面索引。
幾點(diǎn)說(shuō)明:
1、rep循環(huán)結(jié)束條件拿春:
Repeat Prefix Termination Condition 1 Termination Condition 2
REPRCX or (E)CX = None
REPE/REPZRCX or (E)CX = ZF = 0
REPNE/REPNZ RCX or (E)CX = ZF = 1
2、rep循環(huán)執(zhí)行順序:
WHILE CountReg ≠ 0
DO
Service pending interrupts (if any);
Execute associated string instruction; // 1、執(zhí)行相關(guān)指令。例如scan指令,除了執(zhí)行al與*di的比較外,di也會(huì)被影響,即di自減1(當(dāng)DF==1時(shí))或自加1(當(dāng)DF==0時(shí))
CountReg ← (CountReg – 1); // 2、ECX自減
IF CountReg = 0 // 3、判斷ECX是否已減到0
THEN exit WHILE loop; FI;
IF (Repeat prefix is REPZ or REPE) and (ZF = 0) // 4、最后才判斷其他相關(guān)標(biāo)志。
or (Repeat prefix is REPNZ or REPNE) and (ZF = 1)
THEN exit WHILE loop; FI;
OD;
3、sca指令對(duì)di的影響:
After the comparison, the (E)DI register is incremented or decremented automatically according to the setting of
the DF flag in the EFLAGS register. If the DF flag is 0, the (E)DI register is incremented; if the DF flag is 1, the (E)DI
register is decremented. The register is incremented or decremented by 1 for byte operations, by 2 for word operations, and by 4 for doubleword operations.
linux 內(nèi)存頁(yè)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux 內(nèi)存頁(yè),深入解析Linux內(nèi)存頁(yè)管理機(jī)制,為什么linux kernel默認(rèn)的頁(yè)面大小是4K,而不是4M或8M,linux內(nèi)核0.11 獲取之一個(gè)空閑物理內(nèi)存頁(yè)的函數(shù) get_free_page函數(shù) 問(wèn)題的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)-老牌IDC、云計(jì)算及IT信息化服務(wù)領(lǐng)域的服務(wù)供應(yīng)商,業(yè)務(wù)涵蓋IDC(互聯(lián)網(wǎng)數(shù)據(jù)中心)服務(wù)、云計(jì)算服務(wù)、IT信息化、AI算力租賃平臺(tái)(智算云),軟件開發(fā),網(wǎng)站建設(shè),咨詢熱線:028-86922220

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流