新聞中心
Linux操作系統(tǒng)被廣泛使用,因?yàn)槠浞€(wěn)定性和開放性,使其成為許多企業(yè)和個(gè)人的首選。在Linux系統(tǒng)中,內(nèi)存管理是一個(gè)非常重要且復(fù)雜的任務(wù)。在這篇文章中,我們將,了解該機(jī)制對Linux應(yīng)用程序的性能和穩(wěn)定性的影響。

創(chuàng)新互聯(lián)建站長期為近千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(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)存頁管理?
內(nèi)存頁管理是一種Linux內(nèi)核提供的管理內(nèi)存頁面的方法。在Linux中,內(nèi)存被分為許多小的頁面(通常為4KB),并且每個(gè)頁面都有一個(gè)唯一的標(biāo)識(shí)符,稱為頁幀號(hào)(PFN)。內(nèi)存頁管理的主要目的是為內(nèi)核和用戶空間應(yīng)用程序提供透明的內(nèi)存分配和管理機(jī)制。
2. Linux內(nèi)核中的內(nèi)存頁管理
Linux內(nèi)核中的內(nèi)存頁管理機(jī)制由以下三個(gè)部分組成:
– 物理內(nèi)存:這是計(jì)算機(jī)中實(shí)際的內(nèi)存,通常是隨機(jī)訪問存儲(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)存頁管理機(jī)制包括以下幾個(gè)重要的功能:
– 內(nèi)存頁面分配:當(dāng)用戶空間應(yīng)用程序需要內(nèi)存時(shí),Linux內(nèi)核會(huì)使用頁幀號(hào)(PFN)來映射空閑的物理頁面,并為應(yīng)用程序分配邏輯內(nèi)存。
– 頁面交換:當(dāng)Linux內(nèi)核需要更多的內(nèi)存來運(yùn)行應(yīng)用程序時(shí),它會(huì)將一些內(nèi)存頁面交換到磁盤上以釋放物理內(nèi)存。
– 頁面緩存:為了加快訪問文件和文件系統(tǒng)數(shù)據(jù)的速度,Linux內(nèi)核維護(hù)了一個(gè)頁面緩存,其中包含最近訪問過的數(shù)據(jù)頁面。
– 頁表:該頁表是負(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)存來管理分配。因此,它通常用于分配大塊內(nèi)存(例如文件系統(tǒng)緩存)。
– SLUB分配器:SLUB分配器是Linux內(nèi)核中較新的分配器,它提供了較快的分配速度和較低的內(nèi)存利用率。由于它使用的內(nèi)存比較少,因此通常用于分配小塊內(nèi)存(例如內(nèi)核數(shù)據(jù)結(jié)構(gòu))。
– SLOB分配器:SLOB分配器是最簡單的分配器,它旨在處理低內(nèi)存環(huán)境中的內(nèi)存分配。它可以實(shí)現(xià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)其他問題。
Linux中的內(nèi)存管理器需要處理多個(gè)因素,包括內(nèi)存壓力、內(nèi)存碎片和頁面交換。它必須平衡這些因素,并通過使用適當(dāng)?shù)姆峙淦骱退惴▉韮?yōu)化內(nèi)存使用。
此外,Linux系統(tǒng)中的內(nèi)存頁管理機(jī)制具有高度的靈活性和可配置性。管理員可以使用不同的內(nèi)存分配器和管理器來優(yōu)化內(nèi)存使用,而不會(huì)對系統(tǒng)的可靠性和穩(wěn)定性產(chǎn)生負(fù)面影響。
Linux內(nèi)存頁管理機(jī)制是一個(gè)非常復(fù)雜但又非常重要的部分,對于系統(tǒng)的性能和穩(wěn)定性有著巨大的影響。理解內(nèi)存頁管理機(jī)制的工作原理可以幫助管理員優(yōu)化內(nèi)存使用,并確保系統(tǒng)的可靠性和穩(wěn)定性。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
為什么linux kernel默認(rèn)的頁面大小是4K,而不是4M或8M
太多了,我就做一次搬運(yùn)工了。
相信很多人在看內(nèi)核內(nèi)存管理部分的時(shí)候,都有這樣一個(gè)疑問,為什么物理頁面的大小選擇4K,而不是大一些或者小一些呢?
這個(gè)問題沒有固定的答案,仁者見仁智者見智,每個(gè)人的關(guān)注點(diǎn)不一樣。所以這篇文章不是說給出一個(gè)固定的答案,更多的只是一篇討論性的文章。
內(nèi)核的頁面大小首先跟CPU有關(guān),不同的架構(gòu)支持的頁面大小也不相同,但有一個(gè)共同點(diǎn),那就是肯定支持4K的頁面大小。為什么處理器在設(shè)計(jì)
的時(shí)候會(huì)選擇4K,而不是其他,這個(gè)只有熟悉CPU歷史的人才能給出答案,本人才疏學(xué)淺,回答不上來,有興趣的自己找一找。當(dāng)然處理器的設(shè)計(jì)者在考慮頁面
大小的時(shí)候,也不是憑空就選擇了這個(gè)大小,除了歷史因素,肯定綜合了考慮了大頁面、小頁面的優(yōu)缺點(diǎn),所以這里主要列出這些優(yōu)缺點(diǎn),通過這些比較來發(fā)現(xiàn)內(nèi)核
為什么將默認(rèn)的頁面大小選擇為4K。
現(xiàn)在更多爭論的是大頁面還是維持現(xiàn)在的頁面4K大小,所以小頁面的情況我們就不考慮了,通過比較前兩者也可以得出小頁面的情況。支持大頁面的人通常認(rèn)為大頁面有以下好處:
1、減小page table占用的內(nèi)存。
假設(shè)內(nèi)存一定的話,頁面大桐襲旅小越大,管理頁面占用的內(nèi)存也越小?,F(xiàn)在內(nèi)核中每個(gè)頁面假設(shè)是4K的話,這4K不是全都可用,還有一部分用作
struct
page(大約是64bytes),如果是2.6.32的話,每個(gè)頁還有一個(gè)page_cgroup(32bytes),也就是說內(nèi)存大小的2.3%
(96/4096)會(huì)被內(nèi)核固定使用。如果頁面大小是4M的話,這個(gè)比率大約是0.0006%。假設(shè)內(nèi)存時(shí)64G的話,頁面大小是4K,管理頁占用的內(nèi)存
為1.472G,而頁面大小是4M,管理頁面占用的內(nèi)存為0.393M。所以頁面比較大時(shí),節(jié)省的內(nèi)存比較多。
2、提高TLB的命中率
每次訪問內(nèi)存的時(shí)候,都要將
虛擬
地址轉(zhuǎn)換為
物理地址
,如果每次都訪問頁表的話,消耗比較大。因此,通常使用TLB來加速這個(gè)過程。但是
TLB的可以直接轉(zhuǎn)換的地址范圍是有限的(具體就是項(xiàng)數(shù)乘以頁面大?。坏┏霈F(xiàn)TLB
miss,這時(shí)就必須去頁表中查找。所以,如果是大頁面的話,同樣TLB項(xiàng)數(shù)的情況下,可以跟蹤更大的內(nèi)存。
3、提高磁盤I/O
我們知道在訪問磁盤時(shí),最耗時(shí)的操作就是查找寫入盤區(qū)的起始位置,也就是在磁盤盤片上將讀寫頭置于正確的位置上。所以如果是大頁面的話,可以減少寫入磁盤的次數(shù)。比如要寫入4M的緩存,頁面大小是4M的話,局凳只需寫入1次,而頁面大小是4K的話,則需要寫入4次。
4、提供緩存利用率
如果是大頁面的話,可以減少訪問伙伴系統(tǒng)的次數(shù)。調(diào)用伙伴系統(tǒng)的操作隊(duì)系統(tǒng)的數(shù)據(jù)和指令
高速緩存
有相當(dāng)?shù)挠绊?。?nèi)核越浪費(fèi)這些資源,這些資源對用戶空間進(jìn)程就越不可用。
除了上面提高的好處,肯定還有的好處,就不一一列舉了。那既然有這么好處,而且現(xiàn)在內(nèi)存越來越大,為什么不更多地采用大頁面呢?比如4M?
軟件開發(fā)中,從來不會(huì)有
非常完美
的方案,都是在優(yōu)缺點(diǎn)之間找到平衡點(diǎn)。同樣,大頁面有這樣那樣的好處,缺點(diǎn)也很明顯。
1、更大的問題就是內(nèi)存浪費(fèi),而且這個(gè)問題非常嚴(yán)重。比如這時(shí)要分配的內(nèi)存是4M+1byte,這時(shí)需要兩個(gè)頁面才能滿足分配的需要,這個(gè)
時(shí)候浪費(fèi)的內(nèi)存為4M-1byte。如果頁面是4K的話,浪費(fèi)的內(nèi)存數(shù)量為4k-1byte。頁面太大,可能導(dǎo)致每個(gè)頁面都只使用了部分空間,剩余的空間
就被浪費(fèi)了。當(dāng)然對于數(shù)據(jù)庫這樣的系統(tǒng)來說,頁面越大會(huì)越好,但是內(nèi)核要考慮到通用的情況,而不是專注于特殊的應(yīng)用場景。再比如,現(xiàn)在系統(tǒng)都是只分配虛擬
地址空間,虛擬地址空間只有在真正被訪問的時(shí)候,才映射物理頁面,而且為了減少物理頁面的浪費(fèi),對不訪問的部分,則不作映射。如果頁面太大,在映射很小的
部分時(shí),分配的內(nèi)存會(huì)越大,浪費(fèi)也就越大。系統(tǒng)在運(yùn)行時(shí),會(huì)頻繁地請求內(nèi)存頁的操作,這樣導(dǎo)致潛在的浪費(fèi)會(huì)非常嚴(yán)重。這樣的浪費(fèi)會(huì)完全抵消減小page
table的優(yōu)勢。
2、頁面太大,會(huì)導(dǎo)致大量的內(nèi)存碎片。因?yàn)榈讓拥膬?nèi)存管理是以頁面為單位。如果系統(tǒng)運(yùn)行了很長時(shí)間,空閑的內(nèi)存很多,但是連續(xù)的內(nèi)存塊都小
于要分配的頁面數(shù)。這時(shí)可以通過移動(dòng)內(nèi)存塊或者利用swap來獲取可用內(nèi)存,但是會(huì)導(dǎo)致分配內(nèi)存的操作很慢,這種慢會(huì)形成惡性循環(huán),嚴(yán)重影響系統(tǒng)的禪嫌性能。
如果是小頁面的話,內(nèi)存的利用會(huì)比較緊湊,分配頁面時(shí)需要的連續(xù)內(nèi)存塊的大小不像大頁面那樣需要的那么大。
3、如果CPU崩潰,TLB可以訪問的內(nèi)存越大,對系統(tǒng)的影響也越大。這時(shí)一把
雙刃劍
,大頁面可以提供TLB訪問的內(nèi)存數(shù)量,但是CPU崩潰時(shí),會(huì)導(dǎo)致很多內(nèi)存訪問要去頁表中請求物理地址。
4、兼容性問題。X86處理器支持的頁面大小只有4K,所以如果頁面過大的話,會(huì)導(dǎo)致兼容性問題。
5、如果頁面太大,在將內(nèi)存頁換出到swap分區(qū)時(shí),需要換出的內(nèi)存也就越大,會(huì)影響性能。
總之,這個(gè)頁面大小4K是在計(jì)算機(jī)發(fā)展過程中選擇的,也是在實(shí)踐中經(jīng)過檢驗(yàn)的,現(xiàn)在看來這個(gè)頁面是合適的。
linux內(nèi)核0.11 獲取之一個(gè)空閑物理內(nèi)存頁的函數(shù) get_free_page函數(shù) 問題
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)致同一頁被引用兩次, 而mark數(shù)值 1 而造成數(shù)據(jù)重復(fù)的錯(cuò)誤. 不知道會(huì)不會(huì)造成這樣子的錯(cuò)誤.
問題關(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的地址)。找到空閑頁面后,將該數(shù)組項(xiàng)置1,即*(edi+1)=mem_map=1,即語鏈友句“movb $1,1(%%edi)”實(shí)現(xiàn)的功能。此時(shí),ecx即為空閑頁面索引。
幾點(diǎn)說明:
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指令對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)存頁的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux 內(nèi)存頁,深入解析Linux內(nèi)存頁管理機(jī)制,為什么linux kernel默認(rèn)的頁面大小是4K,而不是4M或8M,linux內(nèi)核0.11 獲取之一個(gè)空閑物理內(nèi)存頁的函數(shù) get_free_page函數(shù) 問題的信息別忘了在本站進(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
當(dāng)前文章:深入解析Linux內(nèi)存頁管理機(jī)制(linux內(nèi)存頁)
文章網(wǎng)址:http://m.fisionsoft.com.cn/article/cdsjpdj.html


咨詢
建站咨詢
