鏈式維持程式

鏈式維持程式

將一個用戶源程式變為一個可在記憶體中執行的程式,通常都要經過以下幾個步驟:首先是要編譯,由編譯程式(Compiler)將用戶原始碼編譯成若干個目標模組(Object Module);其次是連結,由連結程式(Linker)將編譯後形成的一組目標模組,以及它們所需要的庫函式連結在一起,形成一個完整的裝入模組(Load Module);最後是裝入,由裝入程式(Loader)將裝入模組裝入記憶體。鏈式維持程式是指源程式經過編譯後,可得到一組目標模組,再利用連結程式將這組目標模組連結,形成裝入模組。根據連結時間的不同,可把連結分成如下三種:靜態連結,裝入時動態連結,運行時動態連結。

基本介紹

  • 中文名:鏈式維持程式
  • 外文名:chain maintenance program
  • 學科:計算機
  • 定義:利用連結程式將這組目標模組連結
  • 分類:靜態連結,裝入時動態連結
  • 領域:計算機系統
靜態連結方式,裝入時動態連結,運行時動態連結,

靜態連結方式

我們通過一個例子來說明在實現靜態連結(Static Linking)時應解決的一些問題。在圖1(a)中示出了經過編譯後所得到的三個目標模組 A、B、C,它們的長度分別為 L、M 和 N。在模組 A 中有一條語句 CALL B,用於調用模組 B。在模組 B 中有一條語句 CALL C,用於調用模組 C。B 和C 都屬於外部調用符號,在將這幾個目標模組裝配成一個裝入模組時,須解決以下兩個問題:
鏈式維持程式
圖1
(1) 對相對地址進行修改。在由編譯程式所產生的所有目標模組中,使用的都是相對地址,其起始地址都為 0,每個模組中的地址都是相對於起始地址計算的。在連結成一個裝入模組後,原模組 B 和 C 在裝入模組的起始地址不再是 0,而分別是 L 和 L+M,所以此時須修改模組 B 和 C 中的相對地址,即把原 B 中的所有相對地址都加上 L,把原 C 中的所有相對地址都加上 L+M。
(2) 變換外部調用符號。將每個模組中所用的外部調用符號也都變換為相對地址,如把B 的起始地址變換為 L,把 C 的起始地址變換為 L+M,如圖1(b)所示。這種先進行連結所形成的一個完整的裝入模組,又稱為執行檔。通常都不再拆開它,要運行時可直接將它裝入記憶體。這種事先進行連結,以後不再拆開的連結方式,稱為靜態連結方式。

裝入時動態連結

用戶源程式經編譯後所得的目標模組,是在裝入記憶體時邊裝入邊連結的,即在裝入一個目標模組時,若發生一個外部模組調用事件,將引起裝入程式去找出相應的外部目標模組,並將它裝入記憶體,還要按照圖1所示的方式來修改目標模組中的相對地址。裝入時動態連結方式有以下優點:
(1) 便於修改和更新。對於經靜態連結裝配在一起的裝入模組,如果要修改或更新其中的某個目標模組,則要求重新打開裝入模組。這不僅是低效的,而且有時是不可能的。若採用動態連結方式,由於各目標模組是分開存放的,所以要修改或更新各目標模組是件非常容易的事。
(2) 便於實現對目標模組的共享。在採用靜態連結方式時,每個套用模組都必須含有其目標模組的拷貝,無法實現對目標模組的共享。但採用裝入時動態連結方式,OS 則很容易將一個目標模組連結到幾個套用模組上,實現多個應用程式對該模組的共享。

運行時動態連結

在許多情況下,應用程式在運行時,每次要運行的模組可能是不相同的。但由於事先無法知道本次要運行哪些模組,故只能是將所有可能要運行到的模組都全部裝入記憶體,並在裝入時全部連結在一起。顯然這是低效的,因為往往會有些目標模組根本就不運行。比較典型的例子是作為錯誤處理用的目標模組,如果程式在整個運行過程中都不出現錯誤,則顯然就不會用到該模組。
近幾年流行起來的運行時動態連結方式,是對上述在裝入時連結方式的一種改進。這種連結方式是將對某些模組的連結推遲到程式執行時才進行連結,亦即,在執行過程中,當發現一個被調用模組尚未裝入記憶體時, 立即由 OS 去找到該模組並將之裝入記憶體, 把它連結到調用者模組上。凡在執行過程中未被用到的目標模組,都不會被調入記憶體和被連結到裝入模組上,這樣不僅可加快程式的裝入過程,而且可節省大量的記憶體空間。

相關詞條

熱門詞條

聯絡我們