您好,登錄后才能下訂單哦!
這篇文章主要介紹了Linux的虛擬內(nèi)存怎么理解的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Linux的虛擬內(nèi)存怎么理解文章都會(huì)有所收獲,下面我們一起來看看吧。
為了正確的理解虛擬內(nèi)存管理器的工作原理,磨刀不誤砍柴工,我們先來了解一下虛擬內(nèi)存的組成。雖然對(duì)于虛擬內(nèi)存低層級(jí)組成概念很有益處,但是有必要更深入地了解虛擬內(nèi)存如何工作以及怎樣才能優(yōu)化其性能。
圖表1. 高級(jí)虛擬內(nèi)存子系統(tǒng)組成圖
Linux系統(tǒng)中的虛擬內(nèi)存子系統(tǒng)復(fù)雜極其復(fù)雜,但是我們可以通過下面的組件更深入地了解虛擬內(nèi)存:
內(nèi)存管理單元(MMU, Memory Management Unit,下面簡(jiǎn)稱MMU)是作為實(shí)現(xiàn)虛擬內(nèi)存系統(tǒng)的物理硬件基礎(chǔ),MMU可以允許軟件通過一個(gè)別名的地址跟物理地址建立映射,通常是多于一個(gè)。這是通過使用分頁(pages)和分頁表(分頁表:分頁表是一種數(shù)據(jù)結(jié)構(gòu),為使用電腦操作系統(tǒng)之虛擬內(nèi)存技術(shù),將內(nèi)存空間切割成分頁的形式,用于儲(chǔ)存虛擬內(nèi)存及實(shí)體內(nèi)存間的對(duì)應(yīng)). MMU再使用一部分內(nèi)存,通過一系列的查找表(Table lookups)來翻譯虛擬地址到物理地址的映射。
Zoned Buddy Allocator (暫譯為:區(qū)域內(nèi)存分配器 沒有找到中文標(biāo)準(zhǔn)的翻譯, Buddy Allocator暫譯為友內(nèi)存分配器)
區(qū)域內(nèi)存分配器負(fù)責(zé)整個(gè)虛擬內(nèi)存系統(tǒng)分頁存儲(chǔ)管理。 這部分代碼管理連續(xù)物理內(nèi)存分頁的鏈表并且讓他們映射到MMU的分頁表(page tables),當(dāng)其他系統(tǒng)和核心子系統(tǒng)請(qǐng)求分配物理地址的時(shí)候,由其提供有效的物理地址(物理地址到虛擬內(nèi)存地址的映射是被虛擬內(nèi)存系統(tǒng)較高層處理的)。通過友內(nèi)存分配器的名字我們就可以推斷出子系統(tǒng)用來維護(hù)空閑列表的算法。所有在內(nèi)存中的物理分頁是被友內(nèi)存分配器分類和分組進(jìn)入列表的。每一個(gè)列表代表了2n分頁個(gè)的簇,這里的n會(huì)隨著每個(gè)逐步自增。如果在請(qǐng)求列表中沒有任何請(qǐng)求,下一個(gè)里誒包的請(qǐng)求將會(huì)被分在兩個(gè)隔離的簇中并且在下一個(gè)請(qǐng)求到達(dá)的時(shí)候返回給請(qǐng)求者。當(dāng)分配返回請(qǐng)求給到好友分配器友內(nèi)存分配器的時(shí)候,反轉(zhuǎn)處理便開始了;注意到友內(nèi)存分配器也管理著定義不同用途的內(nèi)存池的內(nèi)存區(qū)域。目前友內(nèi)存分配器能夠管理進(jìn)入一下三種內(nèi)存池:
DMA-這個(gè)區(qū)域包含內(nèi)存最開始的16MB空間,這部分是作為遺留設(shè)備(legacy devices)用作直接對(duì)內(nèi)存進(jìn)行操作的空間的。
NORMAL-這部分區(qū)域包括接下來的16MB到1GB的內(nèi)存地址,被用作內(nèi)核的內(nèi)部數(shù)據(jù)結(jié)構(gòu)以及系統(tǒng)和用戶的空間來分配使用。
HIGHMEM-這部分區(qū)域包含1GB以上的地址,被專門留給操作系統(tǒng)分配使用(如文件系統(tǒng)緩沖,用戶空間分配,等等)。
Slab分配器提供了一種可用性更高的前端實(shí)現(xiàn)來配合Buddy(伙伴算法)分配器,它主要用來應(yīng)對(duì)內(nèi)核中某些部分需求大小更加靈活內(nèi)存(并非常用的4KB)的請(qǐng)求。Slab分配器允許內(nèi)核組件創(chuàng)建給定大小的內(nèi)存對(duì)象緩存。Slab分配器負(fù)責(zé)將盡可能多的緩存對(duì)象放在一頁并且監(jiān)控哪些對(duì)象已經(jīng)釋放,哪些內(nèi)存已經(jīng)被分配。當(dāng)有內(nèi)存分配請(qǐng)求但是頁面中沒有內(nèi)存可用時(shí),Slab分配器會(huì)向Buddy分配器請(qǐng)求更多的頁來滿足分配請(qǐng)求。這就使得內(nèi)核組件用一種更簡(jiǎn)單的方法來使用內(nèi)存。使用這種方法,很多只利用一小部分內(nèi)存的組件就不需要各自獨(dú)立實(shí)現(xiàn)內(nèi)存管理的代碼,從而不需要浪費(fèi)很多的頁。Slab分配器只可能從DMA和NORMAL區(qū)域分配內(nèi)存。
最后一個(gè)虛擬內(nèi)存子系統(tǒng)的組件是內(nèi)核線程,包括:kscand, kswapd, kupdated, 和bdflush。這些線程負(fù)責(zé)正在使用的內(nèi)存的恢復(fù)和管理。虛擬內(nèi)存中的所有頁面都有一個(gè)關(guān)聯(lián)的狀態(tài)(更多關(guān)于內(nèi)存狀態(tài)機(jī)的信息請(qǐng)參考"頁面的生命周期"章節(jié))一般來說,內(nèi)核中虛擬內(nèi)存相關(guān)的活躍線程負(fù)責(zé)嘗試將頁面移出RAM的操作。它們定期的檢查RAM,嘗試識(shí)別和釋放非活躍的內(nèi)存,從而使得這一部分內(nèi)存可以在系統(tǒng)中另作他用。
所有由虛擬內(nèi)存管理的內(nèi)存都會(huì)被一個(gè)狀態(tài)標(biāo)記。這些狀態(tài)幫助虛擬內(nèi)存知道在各種各樣的情形下對(duì)給定的頁面該做些什么。依賴于當(dāng)前系統(tǒng)的需要,虛擬內(nèi)存可能依據(jù)狀態(tài)機(jī)(圖示2. "虛擬內(nèi)存頁面狀態(tài)機(jī)")將頁面從一種狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài)。利用這些狀態(tài), 虛擬內(nèi)存可以決定操作系統(tǒng)在某個(gè)時(shí)間對(duì)某個(gè)頁面做了什么,并且它還可以決定對(duì)這個(gè)頁面做什么操作。這些有特殊意義的狀態(tài)如下所示
1.FREE —— 所有可被分配的頁面從這個(gè)狀態(tài)開始。這個(gè)狀態(tài)告訴虛擬內(nèi)存本頁面沒有被用于任何目的,并且可分配。
2.ACTIVE —— 頁面已經(jīng)被Buddy分配器分配了之后進(jìn)入ACTIVE狀態(tài)。這個(gè)狀態(tài)告訴虛擬內(nèi)存本頁面已經(jīng)被分配,并且它已經(jīng)被內(nèi)存進(jìn)程或者用戶進(jìn)程所使用。
3. INACTIVE DIRTY —— 這個(gè)狀態(tài)預(yù)示著本頁面已經(jīng)被要求分配它的進(jìn)程所拋棄,并且它成為將要從主存中被剔除的候選者。kscand任務(wù)會(huì)定期掃描內(nèi)存中的頁面,并記下頁面自從最后一次訪問的到當(dāng)前呆在內(nèi)存的總時(shí)間。如果kscand任務(wù)發(fā)現(xiàn)自從上次它掃面這個(gè)頁面以來,這個(gè)頁面有被訪問,它會(huì)增加這個(gè)頁面的年齡計(jì)數(shù)器的值,否則,它會(huì)減少這個(gè)頁面的年齡計(jì)數(shù)器的值。當(dāng)kscand任務(wù)發(fā)現(xiàn)這個(gè)頁面的年齡計(jì)數(shù)器的值為0,它會(huì)將這個(gè)頁面的狀態(tài)置成INACTIVE DIRTY狀態(tài)。在INACTIVE DIRTY狀態(tài)下的頁面被保存在將要被清除的頁面列表里面。
4. INACTIVE LAUNDERED —— 這是一個(gè)臨時(shí)的狀態(tài),在這個(gè)狀態(tài)下的頁面已經(jīng)被選擇出要從主存中剔除,與此同時(shí)這個(gè)頁面的內(nèi)容將被保存在磁盤上。只有在INACTIVE DIRTY狀態(tài)下的頁面才能進(jìn)入這個(gè)狀態(tài)。一旦磁盤I/O操作(寫磁盤操作)完成,這個(gè)頁面的狀態(tài)轉(zhuǎn)移到INACTIVE CLEAN,在INACTIVE CLEAN 狀態(tài)下,這個(gè)頁面可能會(huì)被釋放或者由于其他目的而被重寫。如果在(寫)磁盤操作期間,這個(gè)頁面被訪問了, 它的狀態(tài)將變成ACTIVE。
5. INACTIVE CLEAN —— 這個(gè)狀態(tài)下的頁面已經(jīng)被從內(nèi)存中清除了。這意味著此頁面的內(nèi)容已經(jīng)同步到磁盤上。從而,此頁面可能會(huì)被虛擬內(nèi)存釋放或者由于其他目的而被重寫。
關(guān)于“Linux的虛擬內(nèi)存怎么理解”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Linux的虛擬內(nèi)存怎么理解”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。