程序编译连接
知识回顾:
主存: 保存进程运行时的程序和数据
寄存器: 速度最快,价格昂贵容量不大,一般以字为单位,只要存放指令一次操作的数据就够了 。
高速缓存: 一种速度比内存快的存储设备,一般同寄存器一样集成在CPU中。存放内存的部分拷贝,把常用的数据放这里可以提高速度。将短时间内经常访问的部分数据从内存放到高速缓存中,减少CPU访问内存的时间,是基于程序局部性。高速缓存一般不能被程序直接更改,而由硬件自己处理对内存数据的拷贝。• 总之:速度快、存放部分内存数据、硬件自动处理。
磁盘缓存: 内存的一部分,将频繁使用的一部分磁盘数据信息预读入在磁盘缓存,减少磁盘读写时间。
1. 程序的装入和链接
多道程序环境下,程序运行必须为之先建立进程。
创建进程的第一件事:将程序和数据装入内存。
2. 程序进内存的一般过程:
- 编译compiler:编译程序:将用户源代码编译成若干个目标模块。
- 链接link:链接程序:将形成的一组目标模块,及它们需要的库函数链接在一起,形成一个完整的装入模块。
- 装入load:由装入程序将装入模块装入内存,构造PCB,形成进程,开始运行(使用物理地址)。
3. 地址的概念
- 逻辑地址(相对地址,虚地址)
- 物理地址(绝对地址,实地址)内存中存储单元的地址。物理地址可直接寻址被执行。
- 地址映射:将用户程序中的逻辑地址转换为运行时由机器直接寻址的内存物理地址的过程。
4. 重定位:把目标程序中的指令和数据的逻辑地址变成内存中的物理地址的地址变换过程。逻辑地址 不等于物理地址
5. 程序装入中的地址处理
- 绝对装入(逻辑地址=物理地址) 逻辑地址 > 重定位 > 物理地址
- 静态重定位装入:地址映射在程序执行之前进行,重定位后物理地址不再改变。
- 动态运行时重定位装入
装入完了如何记录下进程在内存哪里?
- 程序作为整体连续装在一块内存的,记录下基地址即可。
- 程序离散装入在不同内存位置的,需记录下多个偏移用的基地址(后面内存分配里详细讨论);
- 动态重定位的,这些被记录的基地址不一定固定不变,可能会根据内存使用情况变化更新。
6. 不同的程序链接装入方式(使用内存的时机)
- 静态链接:装入运行前将多个目标模块及所需库函数链接成一个整体,以后不再拆开。
- 装入时链接:装入内存时,边装入边链接的链接方式。
- 运行时链接:对某些目标模块的链接,在执行中需要该目标模块时,才对它进行链接。