挑戰408——操作系統(17)——程序的運行過程

進入了存儲管理的部分了。也是操作系統中的一大難題。這部分接在組成原理複習完存儲器部分來複習,會對存儲器和存儲系統會有個更深入的感觸。
內存管理的對象是內存,內存管理的方案有很多,從簡單的單一連續分配到頁式端式存儲方案,各有優點。爲操作系統選擇存儲方案,依賴於很多因素,特別是硬件的支持。下面先來看看一個程序運行的過程。

程序的運行過程

程序要運行,首先必須裝入內存,用戶源程序要變成一個可以在內存運行的程序,通常要經過編譯,鏈接,裝入3個步驟。

  1. 編譯。用戶源程序經過編譯產生目標模塊,目標模塊以“0”作爲開始地址,而目標模塊的地址稱爲邏輯地址。
  2. 鏈接。將編譯後的多個目標模塊以及它們所需要的庫函數鏈接在一起,形成裝入模塊,裝入模塊具有統一的地址空間,此階段,形成了程序的邏輯地址
  3. 裝入。將裝入模塊裝載入內存的實際物理空間,並修改程序中與地址有關的代碼,這個過程叫做地址的重定位。實現邏輯地址到物理地址的轉換。此階段形成了程序的物理地址

程序的裝入

程序的裝入的過程,實際上就是將邏輯地址轉換成物理地址的過程,又稱爲地址重定位或者地址映射。根據重定位時機的不同,又分爲靜態重定位和動態重定位。

  1. 靜態重定位。所謂靜態重定位,是指在程序執行之前進行重定位。它根據裝入模塊將要裝入的內存起始地址,修改裝入模塊中有關使用地址代碼。這種修改是在程序運行之前,程序裝入時一次完成,以後不再改變。
    靜態重定位無需硬件支持,但是卻存在一些缺點:程序在重定位後不能再內存中移動,並且要求存儲空間是連續的。
  2. 動態重定位。動態重定位,是指程序在執行的過程中進行地址重定位。即指令在每次訪問每個地址單元前再進行地址變換。這種方式需要硬件——重定位寄存器的支持。
    當程序運行的時候,CPU每取一條訪存指令,地址變換硬件邏輯會自動將指令中的相對地址與重定位寄存器的地址相加,所得的值爲絕對地址,然後根據絕對地址訪問。(這個過程就像組成原理中的指令系統中的基址尋址和變址尋址)。
    所以,物理地址 = 首地址 + 偏移地址
    優點:在裝入模塊裝入內存時,無需修改。存儲區域不一定就要順序存儲

程序的鏈接

編譯後得到的一組目標模塊以及它們所需要的庫函數裝配成一個完整的裝入模塊。這個過程稱爲鏈接。同樣的,根據鏈接方式的不同,又分爲靜態鏈接跟動態鏈接。

  1. 靜態鏈接。即在程序運行之前事先進行的鏈接,鏈接以後的文件通常不會再拆開,要運行的時候,可直接將它裝入內存。
  2. 動態鏈接。根據動態鏈接時機的不同,又分爲裝入時動態鏈接和運行時動態鏈接。
    • 裝入時動態鏈接。即在程序裝入內存的時候,邊裝入邊連接,遇到外部引用的時候,此時引用裝入程序,找出相應的外部目標模塊,並存入內存,同時修改目標模塊中的相對地址。即在程序裝入內存的時候,邊裝入邊連接,遇到外部引用的時候,此時引用裝入程序,找出相應的外部目標模塊,並存入內存,同時修改目標模塊中的相對地址。
      (用實例來了解,系統中我們常常會看到一個後綴爲dll的文件,這個就是動態鏈接庫。有時候當啓動某個程序的時候,出現錯誤提示,缺少XXX.dll,就是在鏈接的過程中缺少了動態鏈接庫。有時候dll常用於版本的更新,因爲大多數時候新版本的修改僅限於幾個模塊,所以只用更新或者替換相應的dll就可以達到更新的目的。我們常常看到的在線更新就是這個原理)
    • 運行時動態鏈接。即將目標模塊的鏈接推遲到程序執行的時候再進行,在執行過程中會發現被調用的模塊還未裝入內存,再去找出模塊,並將其裝入內存。(在現實軟件中,我們會看到一些VIP功能的軟件,當你賬號登錄後,是會員身份,那麼才允許你裝入相應的dll)。

內存保護

內存在分配前,需要保護操作系統不收用戶的影響,同時保護用戶進程不受其他用戶進程的影響,所以對於給出的邏輯地址,首先判斷是否越界,再進行重定位。原理如圖:
在這裏插入圖片描述

交換

基本思想爲:將處於等待狀態下的進程,從內存中移動到輔存,從而將內存的空間騰出來,這個過程稱爲換出。相反,將準備好競爭CPU運行的程序從輔存轉移到內存,這一過程稱爲換入。這個過程其實就是中級調度的過程。這個過程在虛擬存儲器中應用的相當廣泛。

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