计算机组成原理(五):程序装载

在计算机组成原理中,程序装载(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.mzph.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…