內存分段
程序包含若干個邏輯分段,如可由代碼段、數據段、棧段、堆段組成,每個分段都有不同的屬性,所以內存以分段的形式把這些段分離出來進行管理
在內存分段方式下,虛擬地址和物理地址是如何映射的?
分段管理下的虛擬地址由兩部分組成,段號和段內偏移量
通過段號映射段表的項
從項中獲取到段基地址
段基地址+段內偏移量=使用的物理內存
通過上述知道了,使用段號去映射段表的項,使用項中的段基地址與偏移量計算出物理內存地址,但實際上,分段方式會把程序的虛擬地址分為4段,每個段在段表中有一個項,在這一項找到段的基地址,再加上偏移量計算出物理內存地址
分段的方式,很好的解決了,程序本身不需要關心具體物理內存地址的問題,但是它仍有不足之處:
內存碎片的問題
內存交換的效率低的問題
接下來對這兩個問題進行分析
分段方式是如何產生內存碎片的?
在說內存碎片之前,還是先弄明白,什么是內存碎片?,8個人去外面吃飯,因為飯點原因,人比較多,剩下的都是4人小餐桌,這些4人小餐桌就是我們所說的內存碎片,此時會有小伙伴說,把2個4人小餐桌拼湊在一起就解決了這個問題,非常簡單,我們把這種方式稱為內存碎片整理(涉及到內存交換)。
回到正題,我們來看一例子,假設物理內存只有1GB (1024MB),用戶電腦上運行了多個程序:
瀏覽器占用128MB
音樂軟件占用256MB
游戲占用了512MB
這個時候我們關閉瀏覽器,剩余物理內存1024MB -(256MB+512MB)=256MB。但是這剩余的256MB物理內存不是連續的,被分為了兩段128MB,導致沒有空間再打開一個200MB的程序,如下圖所示
這里的內存碎片問題共有兩點:
外部內存碎片,就是多個不連續的小物理內存空間,導致新的程序無法被裝載
內部內存碎片,程序所有的內存都被裝載進了物理內存,但是程序有部分的內存,可能不經常使用,造成內存的浪費
解決外部內存碎片的方法就是使用內存碎片整理
內存碎片整理通過內存交換的方式來實現,我們可以把音樂軟件占用的256MB加載到硬盤上面去,再從硬盤讀取回來,但是讀取回來的位置不再是原來的位置,而是緊跟已經占用的游戲512MB后面,這樣兩個128MB的空閑物理內存就合并成了一個256MB的連續物理內存,于是新的200MB新程序就能被裝載進來
內存交換空間,在 Linux 系統里,是我們常看到的 Swap 空間,這塊空間是從硬盤劃分出來的,用于內存與硬盤的空間交換。
分段方式為什么內存交換效率低?首先分段管理容易造成內存碎片,導致內存交換的頻率較高,因為硬盤的訪問速度比內存慢太多了,然后每次交換的時候,把一大段連續的內存寫入到硬盤,再又從硬盤讀取出來,如果交換的是一個占內存空間很大的程序,這樣整個機器都會顯得卡頓,過程也很慢的,所以說分段方式內存交換效率低。
為了解決內存分段管理造成的內存碎片與內存交換效率低的問題,就出現了內存分頁。
-
硬盤
+關注
關注
3文章
1290瀏覽量
57233 -
內存
+關注
關注
8文章
2999瀏覽量
73882 -
操作系統
+關注
關注
37文章
6737瀏覽量
123190 -
程序
+關注
關注
116文章
3776瀏覽量
80848
發布評論請先 登錄
相關推薦
評論