程序的装入

  • 绝对装入
    在程序中把地址写死(以前的单道程序系统)
  • 可重定位装入
    装入程序根据内存的空闲情况将程序放入某个空闲位置
  • 动态运行时装入
    先装入程序的部分模块,随着程序的运行,动态地申请分配内存空间装入其他的代码和数据,程序的内存地址可能是不连续的
    注意:前面两种都是一次性装入整个程序,一次性分配整个需要的内存空间

程序->进程

  1. 编译 代码->二进制指令
  2. 链接 库和代码模块整合->可装入模块
  • 静态链接:在程序运行之前链接完成,适合小程序
  • 装入时动态链接:装入过程中还在连接
  • 运行时动态连接:在程序运行时发生缺页中断,再去链接加载
  1. 装入

内存扩充

如果当前程序有2个g,而内存只有一个g,一开始只加载了1G的程序到内存空间,如果运行中还需要加载其他部分,就需要进行内存扩充。
内存扩充的两种方式:

  • 覆盖
    把内存划分为固定区和覆盖区,程序运行过程中如果固定区已经被占满,如果要加载新的内容可放入覆盖区。
  • 交换
    在磁盘上开辟一块区域作为硬盘缓存,对于不是使用很频繁的页面可以换出到硬盘缓存上。

内存管理方式

连续分配

进程在内存中的地址空间是连续的

  1. 单一连续分配
  2. 固定分区分配
  3. 动态分区分配
  • 空闲分区表/链

非连续分配

  • 分页 页表:记录进程的页号到块号的转换,页表位于pcb中
  • 分段 段表寄存器:存储当前进程的段表
  • 段页式
    将程序分为几个段(如代码段、堆、栈...),每个段内再分页,即一个进程有一个段表,每个段又有一个页表