第四章存儲器管理
- 介紹
主存:保存進程運行時的程序和數據
寄存器:速度最快,價格昂貴容量不大,一般以字爲單位,只要存放指令一次操作的數據就夠了 。
層次觀念:(由上到下)cpu寄存器 高速緩存 主存 磁盤
存儲器的管理,重點是內存的管理,對其有效的管理直接影響到存儲器的利用率、系統性能
二、
1.程序的裝入和鏈接
創建進程的第一件事:將程序和數據裝入內存。
程序裝入內存的一般過程:
- 編譯compiler:編譯程序:將用戶源代碼編譯成若干個目標模
- 鏈接link:鏈接程序:將形成的一組目標模塊,及它們需要的庫函數鏈接在一起,形成一個完整的裝入模塊。
- 裝入load:由裝入程序將裝入模塊裝入內存,構造PCB,形成進程,開始運行(使用物理地址)。
※地址概念:包含邏輯地址(相對地址、虛地址) 物理地址(絕對地址、實地址)
1.邏輯地址:用戶的程序經過彙編或編譯後形成目標代碼,目標代碼中的指令地址是相對地址。(一般首地址爲0,其餘指令中的地址都相對於首地址來編址。)
2.物理地址
內存中存儲單元的地址 物理地址可直接尋址被執行
地址映射
將用戶程序中的邏輯地址轉換爲運行時由機器直接尋址的內存物理地址的過程。
注:程序鏈接、裝入過程圍繞着地址的處理
1.4程序裝入中的地址處理
1)絕對裝入方式
邏輯地址====物理地址
2)靜態可重定位裝入方式
邏輯地址---->重定位---->物理地址
3)動態運行時裝入方式
1)絕對裝入方式
編譯程序生成的“目標代碼”就是”裝入模塊” ,邏輯地址直接從某個地址R處增長,裝入模塊直接裝入內存地址R處。
※物理地址由誰生成?
一般由編譯或彙編程序給出;
或由程序員賦予(要求程序員熟悉內存使用情況)
優點 裝入過程簡單,不需任何地址變換,程序中的邏輯地址與實際內存物理地址完全相同。
缺點 過於依賴硬件結構,只適用於早期針對硬件直接編程、單道環境下。
※重定位:把目標程序中的指令和數據的邏輯地址變成內存中的物理地址的地址變換過程。
- 靜態可重定位裝入
- 地址映射在程序執行之前進行,重定位後物理地址不再改變。
- 可由專門設計的重定位裝配程序完成。裝入時根據所定位的內存地址去修改每個邏輯地址,添加相應的偏移量,重定位爲物理地址。
優點:不需硬件支持,可以裝入有限的多道程序
缺點:軟件一次裝入完成,一個程序通常需要佔用連續的內存空間,程序裝內存後不能移動,也不易實現共享。
- 動態運行時裝入方式
運行時進行地址映射
實際運行中經常需要重定位到不同的物理地址上。這種運行時移動程序要求地址變換要快速,實現時一般依靠硬件地址變換機構——一個重定位寄存器
程序裝入內存時,可多次重定位到不同位置。且可以不立即把裝入模塊中的相對地址轉換爲絕對地址,而是把這種地址轉換推遲到程序真正要執行時才進行。
更適用於部分裝入
裝入完了如何記錄下進程在內存的哪裏?
程序作爲整體連續裝在一塊內存的,記錄下基地址即可。
程序離散裝入在不同內存位置的,需記錄下多個偏移用的基地址(後面內存分配裏詳細討論);
動態重定位的,這些被記錄的基地址不一定固定不變,可能會根據內存使用情況變化更新。
不同的程序鏈接方式
裝入是使用內存的開始,但鏈接的不同會使內存的使用有差別
根據鏈接時間的不同,分成三種:
靜態鏈接:裝入運行前將多個目標模塊及所需庫函數鏈接成一個整體,以後不再拆開。
裝入運行前,生成可執行文件時進行的。
將多個目標模塊及所需庫函數鏈接成一個整體,以後不再拆開。
需解決的兩個問題:
- 對相對地址進行修改
- 變換外部調用符號
裝入時動態鏈接:裝入內存時,邊裝入邊鏈接的鏈接方式。
由一個目標模塊開始裝入,若又涉及外部模塊調用事件,裝入程序再找出相應的外部目標模塊,並將它裝入內存,還要修改目標模塊中的相對地址。
運行時動態鏈接:對某些目標模塊的鏈接,在執行中需要該目標模塊時,纔對它進行鏈接。
許多情況下,事先不知道某應用程序本次運行需要哪些模塊,只能全部裝入,裝入時全部鏈接在一起,效率低。
辦法:有的模塊不經常使用就暫時不裝入,運行時用到了再裝入。(如程序總不出錯,就不會用到錯誤處理模塊。)即運行時動態鏈接:運行時,將對某些模塊的鏈接推遲到執行時才鏈接裝入。
優點:程序運行裝入的內容少了,加快了裝入過程,而且節省大量的內存空間。