Appearance
408
操作系统
程序的链接与装入
一、定位信息
- 所属圈层:核心层
- 前置知识:了解程序编译的基本过程(预处理→编译→汇编→链接),了解内存地址空间的基本概念
- 知识网络位置:本单元是理解内存管理(地址映射、重定位)的前置基础,与OS-02章进程管理中进程的创建过程也有直接关联
- 考点热度等级:M级(中频常考)——近5年真题中出现约2–3次,以选择题考查链接方式和装入方式的区别
二、知识点讲解
2.1 程序从编写到运行的过程
源代码→编译→目标模块(.obj)→链接→装入模块(.exe)→装入→内存中运行
2.2 程序的链接
链接是将多个目标模块和所需的库函数合并为一个装入模块的过程。
| 链接方式 | 时机 | 优点 | 缺点 |
|---|---|---|---|
| 静态链接 | 程序运行前(装入前) | 运行时速度快,无额外链接开销 | 不能共享库函数,修改需重新链接 |
| 装入时动态链接 | 程序装入内存时 | 便于共享目标模块,修改方便 | 装入时间较长 |
| 运行时动态链接 | 程序执行到需要该模块时 | 节省内存(未用到的模块不装入),支持运行时加载 | 运行时有链接开销 |
关键区别:静态链接是"一次性全部链接好";装入时动态链接是"装入时才链接";运行时动态链接是"用到时才链接"。
2.3 程序的装入
装入是将装入模块放入内存并使其可执行的过程。三种装入方式的核心区别在于地址转换(重定位)的时机。
| 装入方式 | 地址绑定时机 | 是否可移动 | 特点 |
|---|---|---|---|
| 绝对装入 | 编译时确定 | 不可移动 | 程序必须装入指定物理地址,灵活性差 |
| 可重定位装入(静态重定位) | 装入时一次性转换 | 装入后不可移动 | 由装入程序完成逻辑地址→物理地址的转换 |
| 动态运行时装入(动态重定位) | 执行时每次访存转换 | 可移动 | 通过基址寄存器实现,支持程序在内存中移动 |
2.4 逻辑地址与物理地址
- 逻辑地址(相对地址/虚拟地址):程序中使用的地址,从0开始编址
- 物理地址(绝对地址):内存中实际的地址
- 地址重定位:将逻辑地址转换为物理地址的过程
重定位寄存器(基址寄存器):存放程序在内存中的起始地址,动态重定位时每次访存都要加上该值完成地址转换。
2.5 三种装入方式对比表
| 维度 | 绝对装入 | 静态重定位 | 动态重定位 |
|---|---|---|---|
| 地址转换时机 | 编译/汇编时 | 装入时 | 执行时 |
| 逻辑→物理 | 由编译器完成 | 由装入程序完成 | 由硬件(基址寄存器)完成 |
| 程序是否可移动 | 否 | 装入后否 | 是 |
| 硬件支持 | 不需要 | 不需要 | 基址寄存器 |
| 灵活性 | 最差 | 中等 | 最好 |
| 现代OS采用 | 否 | 少用 | 是(主流) |
三、记忆与理解辅助
- 口诀记忆三种链接:"静装运"——静态链接(装入前)、装入时动态链接、运行时动态链接
- 口诀记忆三种装入:"绝静动"——绝对装入(编译时定死)、静态重定位(装入时转换)、动态重定位(执行时转换)
- 一句话区分:链接解决"模块怎么合并",装入解决"程序怎么放内存"
- 对比记忆:静态链接+绝对装入是最古老的方式;运行时动态链接+动态重定位是最灵活的现代方式
四、例题与精解
例题1(基础巩固)
题目:采用动态运行时装入方式时,程序中指令的地址是( )
A. 物理地址 B. 逻辑地址 C. 内存绝对地址 D. 外存地址
命题意图:考查动态重定位中地址的性质。
精解:
- 审题分析:动态运行时装入意味着地址转换在执行时进行
- 解题思路:如果转换在执行时才做,那程序中的地址必须是未转换的逻辑地址
- 完整步骤:
- 动态运行时装入的程序在装入内存时不做地址转换
- 程序中的地址是从0开始的逻辑地址(相对地址)
- 每次执行访存指令时,由硬件(基址寄存器)将逻辑地址转换为物理地址
- 因此程序中的指令地址是逻辑地址
- 方法反思:三种装入方式的核心区别就是地址转换时机——越早转换,程序中的地址越接近物理地址;越晚转换,越接近逻辑地址
答案:B
例题2(中等提升)
题目:以下关于程序链接方式的叙述,错误的是( )
A. 静态链接在程序运行前完成所有链接 B. 装入时动态链接便于多个程序共享同一目标模块 C. 运行时动态链接可以节省内存空间 D. 静态链接的程序运行速度最慢
命题意图:考查三种链接方式的特征和优缺点。
精解:
- 审题分析:题目要求选出"错误"的叙述
- 解题思路:逐项分析三种链接方式的特点
- 完整步骤:
- A选项:正确。静态链接在装入内存前就完成了所有模块的链接和重定位
- B选项:正确。装入时动态链接的各模块独立存放,多个程序可以共享同一目标模块
- C选项:正确。运行时动态链接只在需要时才加载模块,未使用的模块不占用内存
- D选项:错误。静态链接在运行前已完成所有链接工作,运行时不需要额外的链接开销,速度反而最快
- 方法反思:静态链接以空间(不能共享)换时间(运行最快),动态链接以时间(链接开销)换空间(按需加载)
答案:D
五、考情分析
- 考查频次:近5年约2–3次
- 常见题型:选择题
- 分值占比:2分/题
- 命题趋势:倾向于考查三种链接/装入方式的对比,特别是动态重定位与静态重定位的区别。可能与内存管理中的地址映射结合出题
六、易错点提醒
错误表现:混淆"链接"和"装入"两个阶段 错误原因:两者都涉及地址处理,容易混淆 正确理解:链接是合并模块生成装入模块,装入是将装入模块放入内存。链接解决"模块合并",装入解决"内存放置"
错误表现:认为动态重定位需要每次修改程序中的地址 错误原因:将硬件地址转换误解为软件修改 正确理解:动态重定位由硬件(基址寄存器+加法器)自动完成,程序中的逻辑地址保持不变
错误表现:认为静态链接的程序不能使用库函数 错误原因:误解了"不能共享"的含义 正确理解:静态链接是将库函数的代码复制到装入模块中,可以使用但不能多个程序共享同一份库函数副本
错误表现:将逻辑地址等同于物理地址 错误原因:在绝对装入方式下二者确实相同,但这是特例 正确理解:一般情况下逻辑地址≠物理地址,需要通过地址重定位进行转换
七、来源标注
- 依据2026考研统考408大纲
- 依据《计算机操作系统》(汤小丹/汤子瀛版)第2章
- 依据《操作系统概念》(Silberschatz版)第8章