程序的装入
- 绝对装入
在程序中把地址写死(以前的单道程序系统) - 可重定位装入
装入程序根据内存的空闲情况将程序放入某个空闲位置 - 动态运行时装入
先装入程序的部分模块,随着程序的运行,动态地申请分配内存空间装入其他的代码和数据,程序的内存地址可能是不连续的
注意:前面两种都是一次性装入整个程序,一次性分配整个需要的内存空间
程序->进程
- 编译 代码->二进制指令
- 链接 库和代码模块整合->可装入模块
- 静态链接:在程序运行之前链接完成,适合小程序
- 装入时动态链接:装入过程中还在连接
- 运行时动态连接:在程序运行时发生缺页中断,再去链接加载
- 装入
内存扩充
如果当前程序有2个g,而内存只有一个g,一开始只加载了1G的程序到内存空间,如果运行中还需要加载其他部分,就需要进行内存扩充。
内存扩充的两种方式:
- 覆盖
把内存划分为固定区和覆盖区,程序运行过程中如果固定区已经被占满,如果要加载新的内容可放入覆盖区。 - 交换
在磁盘上开辟一块区域作为硬盘缓存,对于不是使用很频繁的页面可以换出到硬盘缓存上。
内存管理方式
连续分配
进程在内存中的地址空间是连续的
- 单一连续分配
- 固定分区分配
- 动态分区分配
- 空闲分区表/链
非连续分配
- 分页 页表:记录进程的页号到块号的转换,页表位于pcb中
- 分段 段表寄存器:存储当前进程的段表
- 段页式
将程序分为几个段(如代码段、堆、栈...),每个段内再分页,即一个进程有一个段表,每个段又有一个页表