內存管理是一個很大的概念,那麼讓我們開始進入內存的世界吧
內存管理可分爲四部分
- 內存地址的轉換(邏輯地址到物理地址)
1.絕對裝入(早期單道批操作系統)
2.靜態重定位(多道批操作系統)
3.動態重定位 - 內存的擴充(虛擬內存)
- 內存的保護
- 內存的分配與回收
1.連續分配管理方式(重點)
2.非連續管理方式(大重點 點擊查看)
前三點只需要瞭解即可,第四點內存的分配爲重點
內存地址的轉換
小馮:
喬老師 什麼時候會用到內存地址的轉換啊?
喬哥:
要說這個問題,就必須談談程序的編寫到運行間發生了什麼
程序在被編寫後,需要進行編譯,鏈接 和裝入。編譯: 本質上是將源程序(.c)編譯成若干個目標模塊(就是將高級語言轉化爲機器碼 .obj ),每一個目標模塊指令中的地址都是邏輯地址,並且每個邏輯地址都是從零開始的。
鏈接: 將各個目標模塊整合爲一個裝入模塊(.exe),並且將邏輯地址合併
裝入: 將目標模塊放入內存的相應位置即可但!!!問題是目標模塊的地址是邏輯地址,但內存中地址是物理地址,這該怎麼轉換呢?
小馮:
對呀,該怎麼辦呢
喬哥 這裏有三種方法
1.絕對裝入 這種方法是在編譯階段,就已經知道了程序要放到內存的那個位置,直接將指令中的邏輯地址改爲實際的物理地址,常用於單道批操作系統
2.靜態重定位裝入 在裝入時將邏輯地址改爲物理地址,但需要一次性分配所需全部的內存空間,且不可再修改地址
3.動態重定位裝入(常用 之後的分頁分片都是這種) 在裝入時並不修改邏輯地址 ,只有在程序運行時再寫改爲物理地址。怎麼修改呢? 系統會設置一個重定位寄存器(該寄存器會儲存程序在內存中的起始地址),將起始地址與邏輯地址相加即可得到物理地址了
小馮: 能講講鏈接嗎
喬哥:
小馮: 哇,知識點還是很多啊,需要都記住嗎。
喬哥: 不需要的,這裏考試主要是選擇題,重在理解
內存的擴充
小喬:老師我不太理解 。。。。。。。。。。。
喬哥: 很簡單的啦 通常是兩種方法 覆蓋 和 對換
.
覆蓋:將程序分爲多個模塊,將常用的模塊常駐內存,不常用的使用是在調入內存。
將內存分爲固定區和若干覆蓋區.
“”固定區“”:常駐內存。“”覆蓋區“”:使用時調入內存,不使用時掉出內存。例如有A塊調出,B塊便可調入,就可以使"小內存"使用"大程序"啦.
缺點就是: 覆蓋結構需程序員聲明,對用戶不透明,增加了編程負擔
.
對換: 在內存不足時,將內存中某些進程按照一定規則放入外存。之前講的進程調度就是爲了實現該動能。點擊查看
內存的保護
兩種方式
1.CPU中設置一對上,下限寄存器,存放用戶作業在主存中的下限和上限,每當CPU要訪問一個地址時,分別和兩個寄存器的值相比,判斷有無越界。
2.通過採用重定位寄存器(或基址寄存器)和界地址寄存器(又稱限長寄存器)來實現這種保護,重定位寄存器含最小的物理地址值,界地址寄存器含邏輯地址的最大值,每個邏輯地址值必須小於界地址寄存器,內存管理機構動態的將邏輯地址與界地址寄存器進行比較,如果未發生地址越界。則加上重定位寄存器的值後映射成物理地址,再送交內存單元。
內存的分配與回收
連續分配管理方式
-
單一連續分配
內存中只能有一道程序
無外部碎片,有內部碎片 -
固定分區分配
將內存分爲大小相等的分區。
無外部碎片,有內部碎片 -
動態分區分配
-
不會預先建立分區,會根據進程的大小動態分配分區
-
無內部碎片,有外部碎片,外部碎片可以通過緊湊技術來解決
-
系統會提供空閒分區鏈(表),用於存儲分區信息
分區回收:回收後有相鄰分區合併
1.首次適應算法(效果最好)
2.最佳適應算法(可能導致產生許多小的外部碎片)
3.最差適應算法(可能導致大分區不足)
4.臨近適應算法(可能導致大分區不足)
-
小馮:不是說這個知識點很重要嗎,爲什麼講的這麼少
喬哥:這裏很多知識單用一個文字很難講明白,主要供大家梳理框架和複習使用,記住下去一定要看書哦.
創作不易,點個贊吧,親。