在計算機組成原理中,程序裝載(Program Loading)是指將程序從外存(如磁盤)加載到內存中,并為其運行做好準備的過程。程序裝載是實現程序從靜態存儲狀態到動態運行狀態的關鍵環節,涉及地址映射、內存分配和鏈接等技術。
程序裝載
概念
程序裝載的目的是將存儲在外存上的程序(目標代碼)搬移到內存中,分配資源并確保它能在處理器上執行。
裝載過程主要包括:
- 讀取程序目標代碼(從外存載入)。
- 地址映射(將邏輯地址映射為物理地址)。
- 鏈接外部模塊或庫(靜態或動態)。
- 初始化運行環境(如棧和堆的分配)。
分類
根據程序裝載時的實現方式,裝載可以分為以下幾種類型:
絕對裝載
- 定義:
程序目標代碼使用絕對地址,裝載時直接按照目標代碼中的地址將程序放置到內存的固定位置。 - 特點:
- 編譯時就確定了程序的物理地址。
- 程序只能在特定地址運行。
- 優點:
- 簡單直接,裝載速度快。
- 缺點:
- 缺乏靈活性,程序位置固定。
- 程序間容易產生地址沖突,難以在多道程序環境中使用。
可重定位裝載
- 定義:
程序目標代碼使用相對地址(例如段內偏移地址)。裝載時,操作系統將程序的起始地址與相對地址結合,計算出程序的實際運行地址。 - 特點:
- 程序可以裝載到內存的任意位置運行。
- 裝載器通過修改目標代碼中的相對地址或利用硬件寄存器實現重定位。
- 優點:
- 靈活性高,適用于多道程序環境。
- 缺點:
- 裝載時需要地址計算,開銷較高。
動態運行時裝載
- 定義:
程序目標代碼在運行時根據需要動態加載到內存中。這種裝載方式通常用于支持動態鏈接庫或分段式程序。 - 特點:
- 程序運行期間按需加載未使用的模塊或數據。
- 提供更高的內存利用率和運行效率。
- 優點:
- 節省內存資源。
- 支持動態鏈接,便于程序更新與模塊復用。
- 缺點:
- 增加運行時的復雜性和開銷。
- 可能導致額外的運行時延遲。
程序裝載與地址空間
邏輯地址和物理地址
- 邏輯地址(Logical Address):
- 程序編譯或運行時產生的地址,通常以程序的起始位置為基準(相對地址)。
- 物理地址(Physical Address):
- 內存中實際的硬件地址,用于訪問物理存儲單元。
- 地址映射:
- 絕對裝載: 邏輯地址 = 物理地址。
- 可重定位裝載: 邏輯地址 + 重定位基址 = 物理地址。
- 動態裝載: 由操作系統或硬件在運行時完成地址映射。
虛擬內存的支持
程序裝載與虛擬內存技術結合后,可以實現:
- 按需分頁: 僅在程序運行時加載實際用到的內存頁。
- 地址轉換: 利用頁表或段表將虛擬地址映射到物理地址。
- 內存保護: 不同程序的虛擬地址空間相互隔離。
程序裝載與鏈接
靜態鏈接
- 在編譯階段,將所有引用的庫和模塊鏈接到目標代碼中。
- 裝載時不需要額外鏈接操作,直接運行。
- 優點:
- 裝載速度快。
- 運行時無需依賴外部庫,適合獨立運行的程序。
- 缺點:
- 程序體積大,浪費內存。
- 庫函數版本更新后需重新編譯。
動態鏈接
- 在程序運行時加載所需的庫和模塊,按需解析外部符號。
- 常用于操作系統提供的共享庫(如
.so
文件或.dll
文件)。 - 優點:
- 減少程序的體積和內存占用。
- 方便模塊復用和庫函數的更新。
- 缺點:
- 運行時需要額外處理,增加復雜性。
- 依賴動態鏈接器支持。
程序裝載與操作系統的關系
操作系統在程序裝載過程中起到了關鍵作用:
- 內存管理:
- 提供內存分配與地址重定位機制(分段、分頁、虛擬內存等)。
- 裝載器的實現:
- 引導裝載器(Bootstrap Loader): 負責加載操作系統核心程序。
- 用戶程序裝載器: 管理用戶程序的加載和初始化。
- 資源分配:
- 分配運行所需的內存、CPU、I/O設備等資源。
- 多道程序環境支持:
- 確保多個程序能同時裝載和運行,防止資源沖突。
程序裝載的優化技術
延遲加載(Lazy Loading)
- 僅在程序實際使用某模塊時才加載對應代碼或數據。
按需分頁
- 結合分頁技術,只有當前訪問的頁被加載到內存,未使用部分保持在外存中。
預取與緩存
- 裝載時預測程序下一步可能訪問的內存區域,提前加載以減少延遲。
內存分段
內存分段(Segmentation)是一種從邏輯結構出發的內存管理技術,將內存劃分為若干大小不等的邏輯段,每個段對應一個完整的邏輯單元(如代碼段、數據段、棧段等)。
概念
段(Segment):
- 一個段是一個邏輯單元,如一個函數、數組或全局變量。
- 每個段有自己的長度和起始地址。
邏輯地址(段式地址):
- 由段號和段內偏移組成,表示地址在某段中的相對位置。
段表(Segment Table):
- 保存每個段的基址(Base Address)和段長(Limit)。
- 系統通過段表將邏輯地址映射為物理地址。
內存分段的地址轉換
地址轉換的步驟如下:
- 根據邏輯地址中的段號查段表,找到該段的基址。
- 將段內偏移加上基址,得到物理地址。
- 如果段內偏移超出段長,產生段越界錯誤。
公式:
物理地址=段基址+段內偏移
特點
優點:
- 符合程序的邏輯結構,便于模塊化編程和共享。
- 每個段可以獨立管理和保護,增強安全性。
- 段可動態增長或縮小(適合堆、棧結構)。
缺點:
- 容易產生外部碎片,即不同段之間無法充分利用的小塊空閑內存。
- 硬件實現復雜,需要支持段表和段號管理。
內存分頁
內存分頁(Paging)是一種從物理實現出發的內存管理技術,將內存和程序分為大小固定的塊(頁),以提高內存利用率,解決碎片問題。
概念
頁(Page):
- 程序的邏輯內存按照固定大小分成若干頁(通常為4KB)。
頁框(Frame):
- 物理內存被劃分為與頁大小相同的頁框。
頁表(Page Table):
- 保存頁號到頁框號的映射關系。
邏輯地址(分頁地址):
- 由頁號和頁內偏移組成,頁號用于查頁表,頁內偏移用于定位頁內具體地址。
內存分頁的地址轉換
地址轉換的步驟如下:
- 根據邏輯地址中的頁號查頁表,找到對應的物理頁框號。
- 將頁內偏移加上物理頁框基址,得到物理地址。
公式:
物理地址=頁框基址+頁內偏移
特點
優點:
- 消除了外部碎片,頁與頁框大小固定,分配更高效。
- 實現虛擬內存機制,支持按需分頁和內存交換技術。
- 程序邏輯地址是連續的,物理地址可分散,提高內存利用率。
缺點:
- 可能產生內部碎片,即頁中未使用的部分浪費內存。
- 地址轉換需要額外的硬件支持(如頁表和TLB)。
- 頁表可能占用大量內存,尤其在大地址空間中。
分頁與分段的對比
特性 | 內存分段 | 內存分頁 |
---|---|---|
基本單位 | 段:邏輯單元,大小可變 | 頁:固定大小,通常為4KB或8KB |
管理視角 | 從邏輯結構出發(程序員視角) | 從物理內存出發(操作系統視角) |
地址組成 | 段號 + 段內偏移 | 頁號 + 頁內偏移 |
地址映射 | 段表(基址 + 段內偏移) | 頁表(頁號 + 頁內偏移) |
碎片問題 | 存在外部碎片,無內部碎片 | 無外部碎片,但可能產生內部碎片 |
優點 | 符合邏輯單元劃分,便于模塊化設計 | 內存利用率高,支持虛擬內存和按需加載 |
缺點 | 外部碎片問題嚴重,需要硬件段表支持 | 頁表存儲開銷大,需要額外硬件支持 |
靈活性 | 動態調整較靈活(段可擴展) | 頁固定大小,不適合動態擴展 |
參考:
虛擬內存、內存分段和內存分頁: https://blog.csdn.net/www_dong/article/details/115984208
段頁式內存管理和linux內存管理:https://blog.csdn.net/www_dong/article/details/116032029
《程序員的自我修養——鏈接、裝載和庫》