操作系統之內存管理(內存地址的轉換,內存的擴充,內存的保護,內存的分配與回收)

內存管理是一個很大的概念,那麼讓我們開始進入內存的世界吧

內存管理可分爲四部分

  • 內存地址的轉換(邏輯地址到物理地址)
    1.絕對裝入(早期單道批操作系統)
    2.靜態重定位(多道批操作系統)
    3.動態重定位
  • 內存的擴充(虛擬內存)
  • 內存的保護
  • 內存的分配與回收
    1.連續分配管理方式(重點)
    2.非連續管理方式(大重點 點擊查看)

前三點只需要瞭解即可,第四點內存的分配爲重點

內存地址的轉換

小馮:

喬老師 什麼時候會用到內存地址的轉換啊?

喬哥:

要說這個問題,就必須談談程序的編寫到運行間發生了什麼
程序在被編寫後,需要進行編譯,鏈接 和裝入

編譯: 本質上是將源程序(.c)編譯成若干個目標模塊(就是將高級語言轉化爲機器碼 .obj ),每一個目標模塊指令中的地址都是邏輯地址,並且每個邏輯地址都是從零開始的。
鏈接: 將各個目標模塊整合爲一個裝入模塊(.exe),並且將邏輯地址合併
裝入: 將目標模塊放入內存的相應位置即可

但!!!問題是目標模塊的地址是邏輯地址,但內存中地址是物理地址,這該怎麼轉換呢?

小馮:
對呀,該怎麼辦呢

喬哥 這裏有三種方法
1.絕對裝入 這種方法是在編譯階段,就已經知道了程序要放到內存的那個位置直接將指令中的邏輯地址改爲實際的物理地址,常用於單道批操作系統
2.靜態重定位裝入 在裝入時將邏輯地址改爲物理地址,但需要一次性分配所需全部的內存空間,且不可再修改地址
3.動態重定位裝入(常用 之後的分頁分片都是這種) 在裝入時並不修改邏輯地址 ,只有在程序運行時再寫改爲物理地址。怎麼修改呢? 系統會設置一個重定位寄存器(該寄存器會儲存程序在內存中的起始地址),將起始地址與邏輯地址相加即可得到物理地址

小馮: 能講講鏈接嗎
喬哥:
在這裏插入圖片描述

小馮: 哇,知識點還是很多啊,需要都記住嗎。

喬哥: 不需要的,這裏考試主要是選擇題,重在理解

內存的擴充

小喬:老師我不太理解 。。。。。。。。。。。

喬哥: 很簡單的啦 通常是兩種方法 覆蓋 和 對換
.
覆蓋:將程序分爲多個模塊,將常用的模塊常駐內存,不常用的使用是在調入內存。
內存分爲固定區和若干覆蓋區
.
“”固定區“”:常駐內存。“”覆蓋區“”:使用時調入內存,不使用時掉出內存。例如有A塊調出,B塊便可調入,就可以使"小內存"使用"大程序"啦.
缺點就是: 覆蓋結構需程序員聲明,對用戶不透明,增加了編程負擔
.
對換: 在內存不足時,將內存中某些進程按照一定規則放入外存。之前講的進程調度就是爲了實現該動能。點擊查看

內存的保護

兩種方式

1.CPU中設置一對上,下限寄存器,存放用戶作業在主存中的下限和上限,每當CPU要訪問一個地址時,分別和兩個寄存器的值相比,判斷有無越界。

2.通過採用重定位寄存器(或基址寄存器)和界地址寄存器(又稱限長寄存器)來實現這種保護,重定位寄存器含最小的物理地址值,界地址寄存器含邏輯地址的最大值,每個邏輯地址值必須小於界地址寄存器,內存管理機構動態的將邏輯地址與界地址寄存器進行比較,如果未發生地址越界。則加上重定位寄存器的值後映射成物理地址,再送交內存單元。

內存的分配與回收

連續分配管理方式

  • 單一連續分配
    內存中只能有一道程序
    無外部碎片,有內部碎片

  • 固定分區分配
    將內存分爲大小相等的分區。
    無外部碎片,有內部碎片

  • 動態分區分配

    • 不會預先建立分區,會根據進程的大小動態分配分區

    • 無內部碎片,有外部碎片,外部碎片可以通過緊湊技術來解決

    • 系統會提供空閒分區鏈(表),用於存儲分區信息

    分區回收:回收後有相鄰分區合併
    1.首次適應算法(效果最好)
    在這裏插入圖片描述
    2.最佳適應算法(可能導致產生許多小的外部碎片)
    在這裏插入圖片描述
    3.最差適應算法(可能導致大分區不足)
    在這裏插入圖片描述
    4.臨近適應算法(可能導致大分區不足)
    在這裏插入圖片描述

小馮:不是說這個知識點很重要嗎,爲什麼講的這麼少

喬哥:這裏很多知識單用一個文字很難講明白,主要供大家梳理框架和複習使用,記住下去一定要看書哦.

創作不易,點個贊吧,親。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章