計算機組成原理(五):程序裝載

在計算機組成原理中,程序裝載(Program Loading)是指將程序從外存(如磁盤)加載到內存中,并為其運行做好準備的過程。程序裝載是實現程序從靜態存儲狀態到動態運行狀態的關鍵環節,涉及地址映射、內存分配和鏈接等技術。

程序裝載

概念

程序裝載的目的是將存儲在外存上的程序(目標代碼)搬移到內存中,分配資源并確保它能在處理器上執行。
裝載過程主要包括:

  1. 讀取程序目標代碼(從外存載入)。
  2. 地址映射(將邏輯地址映射為物理地址)。
  3. 鏈接外部模塊或庫(靜態或動態)。
  4. 初始化運行環境(如棧和堆的分配)。

分類

根據程序裝載時的實現方式,裝載可以分為以下幾種類型:

絕對裝載

  • 定義:
    程序目標代碼使用絕對地址,裝載時直接按照目標代碼中的地址將程序放置到內存的固定位置。
  • 特點:
    • 編譯時就確定了程序的物理地址。
    • 程序只能在特定地址運行。
  • 優點:
    • 簡單直接,裝載速度快。
  • 缺點:
    • 缺乏靈活性,程序位置固定。
    • 程序間容易產生地址沖突,難以在多道程序環境中使用。

可重定位裝載

  • 定義:
    程序目標代碼使用相對地址(例如段內偏移地址)。裝載時,操作系統將程序的起始地址與相對地址結合,計算出程序的實際運行地址。
  • 特點:
    • 程序可以裝載到內存的任意位置運行。
    • 裝載器通過修改目標代碼中的相對地址或利用硬件寄存器實現重定位。
  • 優點:
    • 靈活性高,適用于多道程序環境。
  • 缺點:
    • 裝載時需要地址計算,開銷較高。

動態運行時裝載

  • 定義:
    程序目標代碼在運行時根據需要動態加載到內存中。這種裝載方式通常用于支持動態鏈接庫或分段式程序。
  • 特點:
    • 程序運行期間按需加載未使用的模塊或數據。
    • 提供更高的內存利用率和運行效率。
  • 優點:
    • 節省內存資源。
    • 支持動態鏈接,便于程序更新與模塊復用。
  • 缺點:
    • 增加運行時的復雜性和開銷。
    • 可能導致額外的運行時延遲。

程序裝載與地址空間

邏輯地址和物理地址

  1. 邏輯地址(Logical Address):
    • 程序編譯或運行時產生的地址,通常以程序的起始位置為基準(相對地址)。
  2. 物理地址(Physical Address):
    • 內存中實際的硬件地址,用于訪問物理存儲單元。
  3. 地址映射:
    • 絕對裝載: 邏輯地址 = 物理地址。
    • 可重定位裝載: 邏輯地址 + 重定位基址 = 物理地址。
    • 動態裝載: 由操作系統或硬件在運行時完成地址映射。

虛擬內存的支持

程序裝載與虛擬內存技術結合后,可以實現:

  • 按需分頁: 僅在程序運行時加載實際用到的內存頁。
  • 地址轉換: 利用頁表或段表將虛擬地址映射到物理地址。
  • 內存保護: 不同程序的虛擬地址空間相互隔離。

程序裝載與鏈接

靜態鏈接

  • 在編譯階段,將所有引用的庫和模塊鏈接到目標代碼中。
  • 裝載時不需要額外鏈接操作,直接運行。
  • 優點:
    • 裝載速度快。
    • 運行時無需依賴外部庫,適合獨立運行的程序。
  • 缺點:
    • 程序體積大,浪費內存。
    • 庫函數版本更新后需重新編譯。

動態鏈接

  • 在程序運行時加載所需的庫和模塊,按需解析外部符號。
  • 常用于操作系統提供的共享庫(如 .so 文件或 .dll 文件)。
  • 優點:
    • 減少程序的體積和內存占用。
    • 方便模塊復用和庫函數的更新。
  • 缺點:
    • 運行時需要額外處理,增加復雜性。
    • 依賴動態鏈接器支持。

程序裝載與操作系統的關系

操作系統在程序裝載過程中起到了關鍵作用:

  1. 內存管理:
    • 提供內存分配與地址重定位機制(分段、分頁、虛擬內存等)。
  2. 裝載器的實現:
    • 引導裝載器(Bootstrap Loader): 負責加載操作系統核心程序。
    • 用戶程序裝載器: 管理用戶程序的加載和初始化。
  3. 資源分配:
    • 分配運行所需的內存、CPU、I/O設備等資源。
  4. 多道程序環境支持:
    • 確保多個程序能同時裝載和運行,防止資源沖突。

程序裝載的優化技術

延遲加載(Lazy Loading)

  • 僅在程序實際使用某模塊時才加載對應代碼或數據。

按需分頁

  • 結合分頁技術,只有當前訪問的頁被加載到內存,未使用部分保持在外存中。

預取與緩存

  • 裝載時預測程序下一步可能訪問的內存區域,提前加載以減少延遲。

內存分段

內存分段(Segmentation)是一種從邏輯結構出發的內存管理技術,將內存劃分為若干大小不等的邏輯段,每個段對應一個完整的邏輯單元(如代碼段、數據段、棧段等)。

概念

段(Segment):

  • 一個段是一個邏輯單元,如一個函數、數組或全局變量。
  • 每個段有自己的長度和起始地址。

邏輯地址(段式地址):

  • 段號段內偏移組成,表示地址在某段中的相對位置。

段表(Segment Table):

  • 保存每個段的基址(Base Address)和段長(Limit)。
  • 系統通過段表將邏輯地址映射為物理地址。

內存分段的地址轉換

地址轉換的步驟如下:

  1. 根據邏輯地址中的段號查段表,找到該段的基址。
  2. 將段內偏移加上基址,得到物理地址。
  3. 如果段內偏移超出段長,產生段越界錯誤。

公式:

物理地址=段基址+段內偏移

特點

優點:

  • 符合程序的邏輯結構,便于模塊化編程和共享。
  • 每個段可以獨立管理和保護,增強安全性。
  • 段可動態增長或縮小(適合堆、棧結構)。

缺點:

  • 容易產生外部碎片,即不同段之間無法充分利用的小塊空閑內存。
  • 硬件實現復雜,需要支持段表和段號管理。

內存分頁

內存分頁(Paging)是一種從物理實現出發的內存管理技術,將內存和程序分為大小固定的塊(頁),以提高內存利用率,解決碎片問題。

概念

頁(Page):

  • 程序的邏輯內存按照固定大小分成若干頁(通常為4KB)。

頁框(Frame):

  • 物理內存被劃分為與頁大小相同的頁框。

頁表(Page Table):

  • 保存頁號到頁框號的映射關系。

邏輯地址(分頁地址):

  • 頁號頁內偏移組成,頁號用于查頁表,頁內偏移用于定位頁內具體地址。

內存分頁的地址轉換

地址轉換的步驟如下:

  1. 根據邏輯地址中的頁號查頁表,找到對應的物理頁框號。
  2. 將頁內偏移加上物理頁框基址,得到物理地址。

公式:

物理地址=頁框基址+頁內偏移

特點

優點:

  • 消除了外部碎片,頁與頁框大小固定,分配更高效。
  • 實現虛擬內存機制,支持按需分頁和內存交換技術。
  • 程序邏輯地址是連續的,物理地址可分散,提高內存利用率。

缺點:

  • 可能產生內部碎片,即頁中未使用的部分浪費內存。
  • 地址轉換需要額外的硬件支持(如頁表和TLB)。
  • 頁表可能占用大量內存,尤其在大地址空間中。

分頁與分段的對比

特性內存分段內存分頁
基本單位段:邏輯單元,大小可變頁:固定大小,通常為4KB或8KB
管理視角從邏輯結構出發(程序員視角)從物理內存出發(操作系統視角)
地址組成段號 + 段內偏移頁號 + 頁內偏移
地址映射段表(基址 + 段內偏移)頁表(頁號 + 頁內偏移)
碎片問題存在外部碎片,無內部碎片無外部碎片,但可能產生內部碎片
優點符合邏輯單元劃分,便于模塊化設計內存利用率高,支持虛擬內存和按需加載
缺點外部碎片問題嚴重,需要硬件段表支持頁表存儲開銷大,需要額外硬件支持
靈活性動態調整較靈活(段可擴展)頁固定大小,不適合動態擴展

參考:

虛擬內存、內存分段和內存分頁: https://blog.csdn.net/www_dong/article/details/115984208

段頁式內存管理和linux內存管理:https://blog.csdn.net/www_dong/article/details/116032029

《程序員的自我修養——鏈接、裝載和庫》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62984.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62984.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62984.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python+OpenCV系列:模版匹配

文章目錄 1. 模板匹配基本原理2. cv2.matchTemplate() 函數函數原型: 3. 模板匹配步驟4. 單目標模板匹配示例5. 多目標模板匹配多目標模板匹配示例代碼解析: 6. 多模板匹配多模板匹配示例代碼解析 7. 總結 模板匹配是一種在圖像中尋找模板的位置的方法。…

基于IEEE 802.1Qci的時間敏感網絡(TSN)主干架構安全分析及異常檢測系統設計

中文標題:基于IEEE 802.1Qci的時間敏感網絡(TSN)主干架構安全分析及異常檢測系統設計 英文標題:Security Analysis of the TSN Backbone Architecture and Anomaly Detection System Design Based on IEEE 802.1Qci 作者信息&…

怎樣提升企業網絡的性能?

企業網絡的穩定性和高效性直接影響員工的工作效率。以下從多維度分析了一些有效策略,幫助公司提升網絡性能,營造更高效的辦公環境。 1. 升級網絡設備 采用性能更高的網絡硬件是優化網絡體驗的重要基礎。選擇支持高吞吐量、低延遲的設備(如企業…

scala基礎_數據類型概覽

Scala 數據類型 下表列出了 Scala 支持的數據類型: 類型類別數據類型描述Scala標準庫中的實際類基本類型Byte8位有符號整數,數值范圍為 -128 到 127scala.Byte基本類型Short16位有符號整數,數值范圍為 -32768 到 32767scala.Short基本類型I…

力扣239.滑動窗口最大值

文章目錄 一、前言二、單調隊列 一、前言 力扣239.滑動窗口最大值 滑動窗口最大值,這道題給定一個數組,以及一個窗口的長度,這個窗口會往后滑動,直到數組最后一個元素。 要求每個滑動窗口的中的最大值。對于這道題,我…

mac 安裝CosyVoice (cpu版本)

CosyVoice 介紹 CosyVoice 是阿里研發的一個tts大模型 官方項目地址:https://github.com/FunAudioLLM/CosyVoice.git 下載項目(非官方) git clone --recursive https://github.com/v3ucn/CosyVoice_for_MacOs.git 進入項目 cd CosyVoic…

電腦插件修復工具

DirectX修復工具 鏈接:夸克網盤分享

Maven 安裝配置(詳細教程)

文章目錄 一、Maven 簡介二、下載 Maven三、配置 Maven3.1 配置環境變量3.2 Maven 配置3.3 IDEA 配置 四、結語 一、Maven 簡介 Maven 是一個基于項目對象模型(POM)的項目管理和自動化構建工具。它主要服務于 Java 平臺,但也支持其他編程語言…

Scala中的泛型特質

代碼如下: package test41 //泛型特質 object test3 { //定義一個日志//泛型特質,X是泛型名稱,可以更改。trait Logger[X] {val content: Xdef show():Unit }class FileLogger extends Logger[String] {override val content: String "…

前端三大框架 Vue、React 和 Angular 的市場占比分析

一、引言 ?? 隨著前端技術的迅速發展,Vue.js、React 和 Angular 已成為全球最受歡迎的三大前端框架。在國內外,不同的框架在市場中的占比和流行程度存在顯著差異。本文將從全球和中國市場的角度,對這三大框架的市場占比進行分析&#xff0…

vue3+echarts+websocket分時圖與K線圖實時推送

一、父組件代碼&#xff1a; <template> <div class"chart-box" v-loading"loading"> <!-- tab導航欄 --> <div class"tab-box"> <div class"tab-list"> <div v-for"(item, index) in tabList…

用python的flask寫的一個MQTT中轉功能,http的方式發送數據和接收數據

需求背景 給一個客戶對接人臉識別的設備&#xff0c;最后需要通知服務端進行一些消息推送。 簡單例子 # 作者 陳老師 # https://v.iiar.cn import json import paho.mqtt.client as mqtt import requests from flask import Flask, requestapp Flask(__name__)# MQTT配置 mq…

ASP.NET |日常開發中讀寫XML詳解

ASP.NET &#xff5c;日常開發中讀寫XML詳解 前言一、XML 概述1.1 定義和結構1.2 應用場景 二、讀取 XML 文件2.1 使用XmlDocument類&#xff08;DOM 方式&#xff09;2.2 使用XmlReader類&#xff08;流方式&#xff09; 三、寫入 XML 文件3.1 使用XmlDocument類3.2 使用XmlWr…

分布式 Paxos算法 總結

前言 相關系列 《分布式 & 目錄》《分布式 & Paxos算法 & 總結》《分布式 & Paxos算法 & 問題》 參考文獻 《圖解超難理解的 Paxos 算法&#xff08;含偽代碼&#xff09;》《【超詳細】分布式一致性協議 - Paxos》 Basic-Paxos 基礎帕克索斯算法…

Git-基礎操作命令

目錄 Git基礎操作命令 case *查看提交日志 log 版本回退 get add . Git基礎操作命令 我們創建并且初始化這個倉庫以后&#xff0c;我們就要在里面進行操作。 Git 對于文件的增刪改查存在幾個狀態&#xff0c;這些修改狀態會隨著我們執行Git的命令而發生變化。 untracked、…

Spring Boot 實戰:構建一個社交平臺 API

在這篇博客中&#xff0c;我們將繼續深入 Spring Boot 的開發實踐&#xff0c;通過構建一個簡單的社交平臺 API&#xff0c;幫助大家理解如何使用 Spring Boot 高效地開發一個具有注冊、登錄、個人資料管理、帖子發布與評論、點贊等功能的社交平臺。在開發過程中&#xff0c;我…

配置mysqld(讀取選項內容,基本配置),數據目錄(配置的必要性,目錄下的內容,具體文件介紹,修改配置)

目錄 配置mysqld 讀取選項內容 介紹 啟動腳本 基本配置 內容 端口號 數據目錄的路徑 配置的必要性 配置路徑 mysql數據目錄 具體文件 修改配置時 權限問題 配置mysqld 讀取選項內容 介紹 會從[mysqld] / [server] 節點中讀取選項內容 優先讀取[server] 雖然服務…

智能家居WTR096-16S錄放音芯片方案,實現語音播報提示及錄音留言功能

前言&#xff1a; 在當今社會的高速運轉之下&#xff0c;夜幕低垂之時&#xff0c;許多辛勤工作的父母尚未歸家。對于肩負家庭責任的他們而言&#xff0c;確保孩童按時用餐與居家安全成為心頭大事。此時&#xff0c;家居留言錄音提示功能應運而生&#xff0c;恰似家中的一位無形…

Java 編程基礎:開啟編程世界的大門

一、Java 環境搭建 在開始編寫 Java 代碼之前&#xff0c;我們需要先搭建 Java 開發環境。 1. 安裝 JDK&#xff08;Java Development Kit&#xff09; JDK 是 Java 開發的核心工具包&#xff0c;它包含了編譯 Java 源文件所需的編譯器&#xff08;javac&#xff09;以及運行…

pytorch bilstm crf的教程,注意 這里不支持批處理,要支持批處理 用torchcrf這個。

### Bi-LSTM Conditional Random Field ### pytorch tutorials https://pytorch.org/tutorials/beginner/nlp/advanced_tutorial.html ### 模型主要結構&#xff1a; ![title](sources/bilstm.png) pytorch bilstm crf的教程&#xff0c;注意 這里不支持批處理 Python version…