408 考研《操作系统》第三章第一节:内存
文章目录
- 教程
- 1. 内存的基础知识
- 1.1什么是内存?有何作用?
- 补充知识:几个常用的数量单位
- 2. 进程的运行原理
- 2.1 指令的工作原理
- 2.2 逻辑地址vs物理地址
- 2.3 从写程序到程序运行
- 2.4 装入模块装入内存
- 2.5 装入的三种方式
- 2.5.1 ——绝对装入
- 2.5.2 ——可重定位装入
- 2.5.3 ——动态重定位
- 2.6 链接的三种方式
- 2.7 总结
教程
1.内存的基础知识 https://www.bilibili.com/video/BV1YE411D7nH/?p=33&share_source=copy_web&vd_source=d228985826b563972268952905224139
1. 内存的基础知识
1.1什么是内存?有何作用?
内存可存放数据。程序执行前需要先放到内存中才能被CPU处理
——缓和CPU与硬盘之间的速度矛盾。
补充知识:几个常用的数量单位
补充知识:
注:有的题目会告诉我们内存的大小,让我们确定地址长度应该是多少(即要多少个二进制位才能表示相应数目的存储单元)
2. 进程的运行原理
2.1 指令的工作原理
指令的工作基于“地址”。每个地址对应一个数据的存储单元。
Tips:想深入了解可以学习汇编原理、计算机组成原理
可见,我们写的代码要翻译成CPU能识别的指令。这些指令会告诉CPU应该去内存的哪个地址读/写数据,这个数据应该做什么样的处理。在这个例子中,我们默认让这个进程的相关内容从地址#0开始连续存放,指令中的地址参数直接给出了变量 x 的实际存放地址(物理地址)。(在这个例子中,指令中直接给出了变量x的实际存放地址(物理地址)。但实际在生成机器指令的时候并不知道该进程的数据会被放到什么位置。所以编译生成的指令中一般是使用逻辑地址(相对地址))
思考:如果这个进程不是从地址#0 开始存放的,会影响指令的正常执行吗?
2.2 逻辑地址vs物理地址
宿舍四个人一起出去旅行,四个人的学号尾号分别是0、1、2、3。
住酒店时酒店给你们安排了4个房号相连的房间。四个人按学号递增次序入住房间。比如0、1、2、3号同学分别入住了5、6、7、8号房间。
四个人的编号0、1、2、3其实是一个“相对位置”,而各自入住的房间号是一个“绝对位置”。只要知道О号同学住的是房号为N的房间,那么M号同学的房号一定是N+M。
也就是说,只要知道各个同学的“相对位置”和“起始房号”,就一定可以算出所有同学的“绝对位置”。
2.3 从写程序到程序运行
编译:由编译程序将用户源代码编译成若干个目标模块(编译就是把高级语言翻译为机器语言
)
链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块
装入(装载):由装入程序将装入模块装入内存运行
2.4 装入模块装入内存
装入模块中的指令地址指的是“相对地址”,即:相对于开始地址而言的地址。相对地址又称逻辑地址。
2.5 装入的三种方式
2.5.1 ——绝对装入
绝对装入:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。
装入程序按照装入模块中的地址,将程序和数据装入内存。
Eg:如果知道装入模块要从地址为 100 的地方开始存放…
2.5.2 ——可重定位装入
静态重定位
:又称可重定位装入
。编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对地址进行“重定位
”,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)。
2.5.3 ——动态重定位
动态重定位
:又称动态运行时装入
。编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行
。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器
的支持。
2.6 链接的三种方式
链接的三种方式:
- 静态链接:在程序运行之前,先将各目标模块及它们所需
的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。
- 装入时动态链接:将各目标模块装入内存时,边装入边链接的链接方式。
3. 运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。