OS存储器管理(一)
存儲器的層次:
分為寄存器、主存(內存)和 輔存(外存)三個層次。
?
主存:高速緩沖存儲器、主存儲器、磁盤緩沖存儲器,
???????? 主存又稱為可執行存儲器;
輔存:固定磁盤存儲器、可移動的外部存儲器;
???????? 其可長期保存數據,但不能被處理器直接訪問。
?
此處針對的是在OS層面上對主存(內存)的管理。
?
內(主)存儲器管理的主要功能:①?邏輯地址到物理地址的轉換 ? ? ②?內存(主存)空間的分配與回收 ? ? ③?內存信息(數據)的共享與保護 ? ? ④?內存的邏輯擴充(虛擬存儲器的實現)
一個用戶程序在運行之前需要經歷若干步驟,為了執行,程序應被調入內存并放在進程內: 在這些步驟中,地址可能有不同的表示形式: 符號(源程序中),可重定位的地址(目標模塊),絕對地址(內存映像) 邏輯地址:目標代碼的相對編址。由CPU生成,也稱為虛擬地址 物理地址:內存存儲單元的編址,內存單元的實際地址 邏輯地址空間:目標代碼用邏輯地址編址對應的區域 內存存儲空間:內存若干存儲單元用物理地址編址對應的區域 重定位:邏輯地址轉換為物理地址的操作(過程) 接下來,將指令與數據捆綁到內存地址,可以在以下步驟的任何一步中執行: 編譯時:MS-DOS的COM格式程序 加載時:編譯器生成可重定位代碼 執行時:進程在執行時可以從一個內存段移到另一內存段,那么捆綁必須延遲到執行時才進行。 運行時從虛擬地址映射到物理地址的硬件設備稱為內存管理單元(MMU) 用戶進程所生成的地址在送交內存之前,都將加上重定位寄存器的值。 用戶程序處理的是邏輯地址,它不會看到真實的物理地址。 原理圖如下: ? 例如: 重定位的方式: 靜態重定位:目標代碼裝入內存時,一次性進行邏輯地址到物理地址的地址轉換。 動態重定位:目標代碼裝入內存時,先不進行地址轉換(即原代碼裝入),在執行時,再實施地址轉換。 內存分配的方式:連續分配和非連續分配 內存通常分為兩個區域: 一個用于駐留操作系統,常與中斷向量一起放在低內存 另一個用于用戶進程,常放在高內存。 一、連續分配 四種方式: ①單一連續區分配
②固定分區分配
③可變(動態)分區分配
④可重定位分區分配
?
?
①單分區分配方法(Single-partition allocation)
?
重定位寄存器方案用來保護用戶進程之間,用戶進程與操作系統之間不會相互修改代碼與數據
重定位寄存器包含了最小的物理地址;界限寄存器包含了邏輯地址的范圍,每個邏輯地址必須小于界限寄存器
?
②固定分區分配 * 算法思想 內存可用區劃分成若干個大小固定的存區,每個存區分別裝入一道作業的代碼(數據)。 * 算法實現 建立分區說明表,記錄各分區大小、地址及分配情況 例如:| 分區號 | 分區大小 | 起始地址 | 狀態 |
| 1 | 12k | 20k | 已分配 |
| 2 | 32k | 32k | 已分配 |
| 3 | 64k | 64k | 已分配 |
| 4 | 128k | 128k | 空閑 |
| 5 | ? | ? | ? |
?
?
?
?
?
?
?
?
分配:查分區說明表,找到一個足夠大的空閑分區分配之;
回收:將回收分區對應的分區說明表狀態改為“空閑”。
?
優點:內存可同時裝入多道作業代碼,算法實現簡單;?
缺點:存在浪費(分區一次性全部分配出去);會產生內部碎片。
?
③動態存儲分配問題
?
算法思想:事先不劃分分區,待作業需要分配內存時,再按需分配劃分分區(分區的大小及個數不固定)。
?
數據結構:
空閑分區表或空閑分區鏈表 ?----> ??記錄空閑分區的大小、地址等
?
?
空閑分區鏈表狀況:
?
?
?
分配:查空閑分區鏈表,找到第一個足夠大的分區,將其一分為二分配之;
分配策略(算法):首次適應算法,循環首次適應算法,最佳適應算法,最差適應算法
?
回收:先將回收分區與相鄰空閑分區合并再修改空閑分區鏈表。
回收算法:前鄰接合并,后鄰接合并,前、后鄰接合并,不鄰接處理
?
* 優、缺點
? ? ?按需分配,可解決浪費問題;
? ? ?分配算法復雜,會產生外部碎片;
? ? ?鄰接合并系統開銷大。
?
* 碎片問題
碎片:可變分區分配過程中形成的若干個非常小的無法再利用的小分區,形成外部碎片
?
?
碎片分為外部碎片和內部碎片。
?
處理碎片的方法:
1.緊縮(compaction,拼接):用來降低外部碎片移動內存內容,以便所有空閑空間合并成一整塊。
如果重定位是動態的,是在運行時進行的,那么就能采用緊縮
2.另一種可能解決外部碎片問題的方法是允許物理地址空間為非連續,這樣只要有物理內存就可為進程分配:分頁或分段
?
?
④可重定位分區分配
?
* 算法思想
???在可變分區分配算法的基礎上,采用動態重定位方式裝入程序(數據)。當無足夠大的分區供分配時,若總的空閑存儲容量夠用,則將各分區中的內容向內存一端移動(緊湊),使另一端形成一個大的空閑分區,然后再分配。
?
例:前例若要為作業10分配120k的存儲空間,因無足夠大分區(總空閑容量290k),則先進行合并處理:
?
?
?
內存的離散分配方式見下篇。
?
轉載于:https://www.cnblogs.com/z941030/p/5154483.html
總結
以上是生活随笔為你收集整理的OS存储器管理(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2016第3周五
- 下一篇: 基础知识(9)- Swing用户界面组件