內(nèi)存分段
程序包含若干個(gè)邏輯分段,如可由代碼段、數(shù)據(jù)段、棧段、堆段組成,每個(gè)分段都有不同的屬性,所以?xún)?nèi)存以分段的形式把這些段分離出來(lái)進(jìn)行管理
在內(nèi)存分段方式下,虛擬地址和物理地址是如何映射的?
分段管理下的虛擬地址由兩部分組成,段號(hào)和段內(nèi)偏移量
通過(guò)段號(hào)映射段表的項(xiàng)
從項(xiàng)中獲取到段基地址
段基地址+段內(nèi)偏移量=使用的物理內(nèi)存
通過(guò)上述知道了,使用段號(hào)去映射段表的項(xiàng),使用項(xiàng)中的段基地址與偏移量計(jì)算出物理內(nèi)存地址,但實(shí)際上,分段方式會(huì)把程序的虛擬地址分為4段,每個(gè)段在段表中有一個(gè)項(xiàng),在這一項(xiàng)找到段的基地址,再加上偏移量計(jì)算出物理內(nèi)存地址
分段的方式,很好的解決了,程序本身不需要關(guān)心具體物理內(nèi)存地址的問(wèn)題,但是它仍有不足之處:
內(nèi)存碎片的問(wèn)題
內(nèi)存交換的效率低的問(wèn)題
接下來(lái)對(duì)這兩個(gè)問(wèn)題進(jìn)行分析
分段方式是如何產(chǎn)生內(nèi)存碎片的?
在說(shuō)內(nèi)存碎片之前,還是先弄明白,什么是內(nèi)存碎片?,8個(gè)人去外面吃飯,因?yàn)轱堻c(diǎn)原因,人比較多,剩下的都是4人小餐桌,這些4人小餐桌就是我們所說(shuō)的內(nèi)存碎片,此時(shí)會(huì)有小伙伴說(shuō),把2個(gè)4人小餐桌拼湊在一起就解決了這個(gè)問(wèn)題,非常簡(jiǎn)單,我們把這種方式稱(chēng)為內(nèi)存碎片整理(涉及到內(nèi)存交換)。
回到正題,我們來(lái)看一例子,假設(shè)物理內(nèi)存只有1GB (1024MB),用戶(hù)電腦上運(yùn)行了多個(gè)程序:
瀏覽器占用128MB
音樂(lè)軟件占用256MB
游戲占用了512MB
這個(gè)時(shí)候我們關(guān)閉瀏覽器,剩余物理內(nèi)存1024MB -(256MB+512MB)=256MB。但是這剩余的256MB物理內(nèi)存不是連續(xù)的,被分為了兩段128MB,導(dǎo)致沒(méi)有空間再打開(kāi)一個(gè)200MB的程序,如下圖所示
這里的內(nèi)存碎片問(wèn)題共有兩點(diǎn):
外部?jī)?nèi)存碎片,就是多個(gè)不連續(xù)的小物理內(nèi)存空間,導(dǎo)致新的程序無(wú)法被裝載
內(nèi)部?jī)?nèi)存碎片,程序所有的內(nèi)存都被裝載進(jìn)了物理內(nèi)存,但是程序有部分的內(nèi)存,可能不經(jīng)常使用,造成內(nèi)存的浪費(fèi)
解決外部?jī)?nèi)存碎片的方法就是使用內(nèi)存碎片整理
內(nèi)存碎片整理通過(guò)內(nèi)存交換的方式來(lái)實(shí)現(xiàn),我們可以把音樂(lè)軟件占用的256MB加載到硬盤(pán)上面去,再?gòu)挠脖P(pán)讀取回來(lái),但是讀取回來(lái)的位置不再是原來(lái)的位置,而是緊跟已經(jīng)占用的游戲512MB后面,這樣兩個(gè)128MB的空閑物理內(nèi)存就合并成了一個(gè)256MB的連續(xù)物理內(nèi)存,于是新的200MB新程序就能被裝載進(jìn)來(lái)
內(nèi)存交換空間,在 Linux 系統(tǒng)里,是我們??吹降?Swap 空間,這塊空間是從硬盤(pán)劃分出來(lái)的,用于內(nèi)存與硬盤(pán)的空間交換。
分段方式為什么內(nèi)存交換效率低?首先分段管理容易造成內(nèi)存碎片,導(dǎo)致內(nèi)存交換的頻率較高,因?yàn)橛脖P(pán)的訪問(wèn)速度比內(nèi)存慢太多了,然后每次交換的時(shí)候,把一大段連續(xù)的內(nèi)存寫(xiě)入到硬盤(pán),再又從硬盤(pán)讀取出來(lái),如果交換的是一個(gè)占內(nèi)存空間很大的程序,這樣整個(gè)機(jī)器都會(huì)顯得卡頓,過(guò)程也很慢的,所以說(shuō)分段方式內(nèi)存交換效率低。
為了解決內(nèi)存分段管理造成的內(nèi)存碎片與內(nèi)存交換效率低的問(wèn)題,就出現(xiàn)了內(nèi)存分頁(yè)。
-
硬盤(pán)
+關(guān)注
關(guān)注
3文章
1338瀏覽量
58438 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3122瀏覽量
75245 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7143瀏覽量
125555 -
程序
+關(guān)注
關(guān)注
117文章
3826瀏覽量
82959
發(fā)布評(píng)論請(qǐng)先 登錄
linux內(nèi)存相關(guān)知識(shí)科普
走進(jìn)Linux內(nèi)存系統(tǒng)探尋內(nèi)存管理的機(jī)制和奧秘
C語(yǔ)言malloc申請(qǐng)內(nèi)存時(shí)的碎片問(wèn)題

嵌入式系統(tǒng)中內(nèi)存碎片產(chǎn)生過(guò)程說(shuō)明

Linux內(nèi)核內(nèi)存規(guī)整總結(jié)

請(qǐng)問(wèn)mymalloc會(huì)產(chǎn)生內(nèi)存碎片嗎?
如何避免內(nèi)存碎片的產(chǎn)生
基于線段樹(shù)的內(nèi)存管理方法

如何避免Linux的物理內(nèi)存碎片化

你知道linux kernel內(nèi)存碎片防治技術(shù)?
OPPO內(nèi)存反碎片化引擎的作業(yè)
FreeRTOS內(nèi)存碎片是怎么來(lái)的

如何解決內(nèi)存碎片與內(nèi)存交換效率慢的問(wèn)題

內(nèi)存池的使用場(chǎng)景

評(píng)論