作業系統——第四章筆記(一)
儲存器管理
儲存部件的層次:
主存:儲存程序執行時的程式和資料
暫存器:速度最快,價格昂貴容量不大,一般以字為單位,只要存放指令一次操作的資料就夠了 。
快取記憶體(速度快、存放部分記憶體資料、硬體自動處理)
一種速度比記憶體快的儲存裝置,一般同暫存器一樣整合在CPU中。
存放記憶體的部分拷貝,把常用的資料放這裡可以提高速度。
將短時間內經常訪問的部分資料從記憶體放到快取記憶體中,減少CPU訪問記憶體的時間,是基於程式區域性性。
快取記憶體一般不能被程式直接更改,而由硬體自己處理對記憶體資料的拷貝。
磁碟快取:記憶體的一部分,將頻繁使用的一部分磁碟資料資訊預讀入在磁碟快取,減少磁碟讀寫時間。
儲存器管理:
容量雖不斷擴充,仍不能滿足現代軟體和使用者的需要,是一種寶貴、緊俏的資源;
多層次處理,協調CPU與儲存裝置的速度差距;
重點是記憶體管理,對其有效的管理直接影響儲存器的利用率、系統性能。
儲存器資源的分配和回收
地址變換(邏輯地址與實體地址的對應關係維護)
儲存共享和保護
虛擬儲存的排程演算法
外存的管理:磁碟儲存器管理、檔案系統等中涉及。
一、程式的裝入和連結
多道程式環境下,程式執行必須為之先建立程序。
建立程序的第一件事:將程式和資料裝入記憶體。
使用者源程式 記憶體中執行的程式
程式進記憶體的一般過程:
編譯compiler:編譯程式:將使用者原始碼編譯成若干個目標模組。
連結link:連結程式:將形成的一組目標模組,及它們需要的庫函式連結在一起,形成一個完整的裝入模組。
裝入load:由裝入程式將裝入模組裝入記憶體,構造PCB,形成程序,開始執行(使用實體地址)。
1.地址的概念
邏輯地址(相對地址,虛地址)
使用者的程式經過彙編或編譯後形成目的碼,目的碼中的指令地址是相對地址。
一般首地址為0,其餘指令中的地址都相對於首地址來編址。
不能用邏輯地址在記憶體中讀取資訊 。
實體地址(絕對地址,實地址)
記憶體中儲存單元的地址。
實體地址可直接定址被執行。
地址對映:
將使用者程式中的邏輯地址轉換為執行時由機器直接定址的記憶體實體地址的過程。
即:使用者的第10位元組處的指令在記憶體的第多少地址上。
程式連結、裝入過程圍繞著地址的處理
2程式裝入中的地址處理
2.1邏輯地址 ====== 實體地址:
① 絕對裝入方式(absolute loading)
編譯程式生成的“目的碼”就是“裝入模組” ,邏輯地址直接從某個地址R處增長,裝入模組直接裝入記憶體地址R處。
實體地址一般由編譯或彙編程式給出;或由程式設計師賦予(要求程式設計師熟悉記憶體使用情況)
優點:裝入過程簡單。不需任何地址變換,程式中的邏輯地址與實際記憶體實體地址完全相同。
缺點:過於依賴硬體結構, 只適用早期針對硬體直接程式設計、單道環境下。
現在程式裝入一般都要從邏輯地址對映到實體地址。
重定位:把目標程式中的指令和資料的邏輯地址變成記憶體中的實體地址的地址變換過程。(邏輯地址 == 實體地址)
2.2邏輯地址 à重定位à 實體地址:
① 靜態可重定位裝入方式(relocatable loading mode)
地址對映在程式執行之前進行,重定位後實體地址不再改變。
可由專門設計的重定位裝配程式完成(軟):裝入時根據所定位的記憶體地址去修改每個邏輯地址,新增相應偏移量,重定位為實體地址。
優點:不需硬體支援,可以裝入有限的多道程式
缺點:軟體裝入一次完成,一個程式通常需要佔用連續的記憶體空間,程式裝入記憶體後不能移動。也不易實現共享。
② 動態執行時(重定位)裝入方式(dynamic run-time loading)
實際執行中往往會需要程式在記憶體中的各位置移動,即經常需要重定位到不同的實體地址上。這種執行時移動程式要求地址變換要快速,實現時一般依靠硬體地址變換機構——一個重定位暫存器。
程式裝入記憶體時,可多次重定位到不同位置。且可以不立即把裝入模組中的相對地址轉換為絕對地址,而是把這種地址轉換推遲到程式真正要執行時才進行。
更適用於部分裝入
2.3裝入完了如何記錄下程序在記憶體哪裡?
程式作為整體連續裝在一塊記憶體的,記錄下基地址即可。
程式離散裝入在不同記憶體位置的,需記錄下多個偏移用的基地址(後面記憶體分配裡詳細討論);
動態重定位的,這些被記錄的基地址不一定固定不變,可能會根據記憶體使用情況變化更新。
3. 裝入是使用記憶體的開始,但連結的不同會使記憶體的使用有差別:
3.1根據連結時間的不同,分成三種:
靜態連結:裝入執行前將多個目標模組及所需庫函式連結成一個整體, 以後不再拆開。
需解決的兩個問題:(1) 對相對地址進行修改(2) 變換外部呼叫符號
裝入時動態連結:裝入記憶體時,邊裝入邊連結的連結方式。
由一個目標模組開始裝入,若又涉及外部模組呼叫事件,裝入程式再找出相應的外部目標模組,並將它裝入記憶體,還要修改目標模組中的相對地址。
比靜態連結好在哪裡?(1) 靜態連結好的程式,修改部分模組後,需重新連結成可裝入程式,動態方式則便於修改和更新。(2) 便於實現共享。靜態的N個程式都需要一個模組時,需要進行N次拷貝。
執行時動態連結:對某些目標模組的連結,在執行中需要該目標模組時,才對它進行連結。
3.2裝入時動態連結的問題
許多情況下,事先不知道某應用程式本次執行需要哪些模組,只能全部裝入,裝入時全部連結在一起,效率低。
辦法:有的模組不經常使用就暫時不裝入,執行時用到了再裝入。(如程式總不出錯,就不會用到錯誤處理模組。)即執行時動態連結:執行時,將對某些模組的連結推遲到執行時才連結裝入。
優點:程式執行裝入的內容少了,加快了裝入過程,而且節省大量的記憶體空間。