内存
程序是由内存放到CPU才可处理,前面一直有提到外存、内存,外存I/O速度十分慢,而内存I/O速度快,CPU I/O速度也快。
因此内存是缓和外存和CPU间I/O速率差异问题
为区分并发环境下程序数据存放地方,就给内存的存储单元编址,单位为存储单元
按字节编址,每个存储单元为1字节,1B,8bit
按字编址,每个存储单元为1字,16bit
2^10 = 1 k
2^20 = 1 M
2^30 = 1 G
进程运行基本原理
指令结构
操作码+取数据地址+存数据地址,这里给出了实际物理地址,实际上应为逻辑地址
逻辑地址和物理地址
绝对地址就是物理地址,相对地址就是逻辑地址,如起点为101110,101111则为下一个单元的物理地址,相对地址写为N+1
写程序到程序运行
编译–>链接–>装入
编译
编译程序将用户源代码编译成若干个目标模块 (高级语言–>机器语言)
链接
链接程序将目标模块与所需库函数链接在一起,形成完整的装入模块
装入/装载
装入程序 将装入模块装入内存运行
程序装入内存
装入模块中的指令地址变成相对地址,有三种装入方式:绝对装入、静态重定位、动态重定位
绝对装入
得知程序放入内存位置,编辑程序产生绝对地址的目标代码,但实际上不可能,因为这只适用于单道程序环境
静态重定位
编译、链接后的装入模块的地址都从0开始,地址都为逻辑地址,装入时对地址进行重定位,将逻辑地址转换为物理地址
但缺点在必须要内存有能够完整装入作业的空间,运行期间也不能再移动和申请内存空间
动态重定位
动态运行时装入,编译、链接后的装入模块的地址都是从0开始的,当程序要真正执行时才进行地址转换,由于装入内存时的地址为逻辑地址,这是需要个重定位寄存器,用于记录模块存放的起始地址
程序运行前只需装入部分代码,并可将程序分配到不连续的存储区中,运行时动态申请分配内存,允许程序在内存中移动
链接的三种方式
静态链接:装入前将所有模块和对应的库函数连接成一个完整的可执行模块
装入时动态链接:将各目标模块装入内存时,边装入边链接
运行时动态链接:执行时需要目标模块时才进行链接
内存管理
内存空间分配和回收
操作系统负责内存空间分配和回收,记录哪些内存区域分配出去了,判断哪些内存可被回收和如何回收
单一连续分配
在此方式下,内存分为系统区和用户区
系统区位于内存的低地址部分,用于存放操作系统相关数据
用户区位于内存的高地址部分,用户程序独占整个用户区空间
内存中只能有一道用户程序
优点:实现简单,不存在外存碎片,可采用覆盖技术扩存,不一定需要内存保护
缺点:只能用于单用户、单任务的操作系统中,会有内存碎片,内存利用率不高
固定分配
按比例分区,若干个固定大小的分区,每个分区只装入一道作业,但内存利用率依旧不高
系统利用分区说明表,记录分区的分配状态来管理
优点:实现简单,无外部碎片
缺点:大小已经被定好,只能使用覆盖解决,但牺牲性能
产生内部碎片
动态分区分配
不预先分配,根据进程大小动态建立分区,产生外部碎片,产生某些空闲分区过小而难以利用,需要通过拼凑解决外部碎片
系统通过空闲分区表/空闲分区链
空闲分区表:记录分区大小,起始地址,状态
空闲分区链:每个分区起始部分和末尾部分分别设置前后指针,并记录分区大小
这里就涉及了如何选择空闲分区和回收分区的方法了
内存分配
连续分配和非连续分配
空闲内存的管理
空闲分区表:从被选择的空闲分区首地址起分配,若仍有空闲则更新表项起始地址和大小,否则就直接删除表项
空闲分区链则雷同
首次适应 First Fit
每次从低地址开始查找,使用第一个符合的空闲分区
低地址部分会产生很多空闲分区
最佳适应 Best Fit
优先使用更小的,符合的空闲分区
但这造成了产生外部碎片,且是十分难利用的碎片
最坏适应 Worst Fit
优先使用更大的,符合的空闲分区
解决了内存碎片问题,但大进程进入时,无法被放入
邻里适应 Next Fit
每次开始查找适合的空闲分区时,从上一次查询结束处开始,形成循环
解决首次适应造成的低地址部分产生难以利用的内存碎片,且减少了每次都需要从头开始的查找开销
内存回收
空闲分区表:合并到邻接的空闲区,并更新对应分区的大小,若没有邻接的则增加表项,记录对应数据
空闲分区链则雷同
内存空间拓展
通过虚拟技术,在逻辑上拓展内存空间
覆盖技术
程序大小超过物理内存总和时需要使用覆盖技术
将程序分段,常用的段常驻内存,不常用的段在需要时调入内存
内存中分为一个固定区和若干个覆盖区
常驻内存的段放在固定区,调入后不再调出
不常用的段放在覆盖区,需要时调入,不需要时调出
由程序员声明覆盖结构,操作系统自动完成覆盖,增加编程负担,已被废弃
交换技术
内存空间紧张时,系统将内存中某些进程暂时换出外存,外存中某些已具备运行条件的进程换入内存,前面提及的中级调度就是,将内存中的进程放入外存,处于挂起态
磁盘空间分区为文件去和对换区
文件区主要用于存放文件,追求存储空间的利用率,对文件区空间的管理采用离散分配方式
对换区只占磁盘空间小部分,被换出的进程数据就存放在对换区。
对换区的速度影响系统整体速度,因此为了追求换入换出速度,采用连续分配方式,对换区的I/O比文件去的更快
交换通常发生在内存紧张时,不紧张时则停止
优先换出阻塞、优先级低的进程,考虑驻留时间等…
如前面提到的,PCB一直在内存中
虚拟存储技术
地址转换
逻辑地址和物理地址转换
内存保护
保证进程在各自存储空间内运行,互不干扰
- cpu中设置一对上下限寄存器,记录进程的上下限地址,当进程访问地址时,进行越界检查
- 重定位寄存器和界地址寄存器,前者存放进程的起始物理地址,后者存放最大逻辑地址