4.1 存储器的层次结构
4.1.1 多层结构的存储器系统
1.存储器的多层结构
2.可执行存储器
4.1.2 主存储器与寄存器
1.主存储器
内存/主存/可执行存储器
用于保存进程运行时的程序和数据。处理机都是从主存储器中取得指令和数据的,并将其所取得的指令放入指令寄存器中,将其所读取的数据装到数据寄存器中;或者反之将寄存器中的数据存入到主存储器中。
主存储器的访问速度远低于CPU执行指令的速度,所以引进了寄存器和高速缓存。
2.寄存器
寄存器具有与处理机相同的速度,故对寄存器的访问最快,完全能与CPU协调工作。
4.1.3 高速缓存与磁盘缓存
1.高速缓存
高速缓存是介于寄存器和存储器之间的存储器,用以备份主存中较常用的数据,以减少处理机对主存储器的访问次数,大幅度地提高程序执行速度。
2.磁盘缓存
磁盘的I/O速度远低于对主存的访问速度,为了缓和两者之间速度上的不匹配设置了磁盘缓存
磁盘缓存用于暂时存放频繁使用的一部分磁盘数据和信息,以减少访问磁盘的次数。
本身并不是实际存在的存储器,而是利用了主存中的部分存储空间暂时存放从磁盘中读出或写入的信息。
4.2 程序的装入和链接
逻辑地址(相对地址)和物理地址(绝对地址)
程序先装入内存,再转变为一个可执行的程序。
(1)编译 由编译程序(Compiler)对用户源程序进行编译,形成若干个目标模块(Object Module)
(2)链接 由链接程序(Linker)将编译后形成的一组目标模块以及他们所需要的库函数链接在一起,形成一个完整的装入模块(Load Module) 形成完整的逻辑地址
(3)装入 由装入程序(Loader)将装入模块装入内存 形成物理地址
4.2.1 程序的装入
1.绝对装入方式
单道程序环境 通常情况下是编译或汇编时转为绝对地址 (装入模块中的指令使用绝对地址)
2.可重定位装入方式
早期的多道批处理操作系统 通在装入时对目标程序中指令和数据地址进行修改,地址变换在装入时一次完成,以后不再改变(装入模块中为逻辑地址)
3.动态运行时的装入方式
多道程序环境 将地址转换推迟到程序真正执行时,需要一个重定位寄存器(装入模块、装入内存中都是逻辑地址)
允许程序在内存中发生移动
4.2.2 程序的链接
1.静态链接方式
装入前,先将目标模块及他们所需的库函数链接成一个完整的装配模块,以后不再拆开。
2.装入时动态链接
在装入内存时,边装入边链接
3.运行时动态链接
在程序执行中需要该模块时,才对它进行链接
不仅能加快程序的装入过程,而且可节省大量的内存空间
4.3 连续分配存储管理方式
4.3.1 单一连续分配
把内存分为系统区和用户区两部分。用户区内存中仅装有一道用户程序,即整个内存的用户空间由该程序独占。
不一定需要采取存储器保护措施
单一连续分配没有外部碎片,但有内部碎片。
4.3.2 固定分区分配
1.分区大小相等 缺乏灵活性 方便实用
2.分区大小不等 增加了存储器分配的灵活性
固定分区分配没有外部碎片,但有内部碎片。
4.3.3 动态分区分配
在进程装入内存时,根据进程的实际需要动态地为之分配内存空间。
1.数据结构
2.动态分区分配算法
分区表表项不一定按地址递增顺序排列,具体排列方式依据动态分区分配算法确定
3.分区分配操作
分配——修改表项
回收——合并/增加
动态分区分配没有内部碎片,但有外部碎片。
内部碎片:分配给某进程的内存区域中,有些部分没有用上
外部碎片:内存中某些空闲分区由于太小而难以利用
4.3.4 基于顺序搜索的动态分区分配算法
1.首次适应算法 First Fit
算法思想:每次都从低地址开始查找,找到第一个能满足大小的空闲分区
如何实现:空闲分区以地址递增的次序排列。
保留了高址部分的大空闲区
优点:综合看性能最好。算法开销小,回收分区后一般不需要对空闲分区队列重新排列
2.循环首次适应算法 Next Fit
算法思想:从上次找到空闲分区的下一个空闲分区开始查找
如何实现:空闲分区以地址递增的次序排列
优点:使内存中的空闲分区分布地更均匀,从而减少了查找空闲分区时的开销;算法开销小, 不需要对整个链表进行重新排序
缺点:缺乏大的空闲分区
3.最佳适应算法 Best Fit
算法思想:尽可能多地留下大片的空闲区,优先使用更小的空闲区
如何实现:空闲分区按容量递增次序链接
优点:更多大分区被保留下来,更能满足大进程需求
缺点:存储器中会留下许多难以利用的碎片;算法开销大,回收分区后可能需要对空闲分区队列重新排列
4.最坏适应算法 Worst Fit
算法思想:分配时优先使用最大的连续空闲区
如何实现:空闲分区按容量递减次序链接
优点:减少难以利用的小碎片
缺点:存储器中缺乏大的空闲分区;算法开销大,回收分区后可能需要对空闲分区队列重新排列
4.5 分页存储管理方式
4.5.1 分页存储管理的基本方法
为了能知道进程的每个页面在内存中存放的位置,操作系统为每个进程建立一张页表。
页号=逻辑地址/页面大小;页内偏移量=逻辑地址%页面大小
或根据逻辑地址结构计算 逻辑地址=【页号P,页内偏移量W】
4.5.2 地址变换机构
实现逻辑地址到物理地址转换的一组硬件机构
1.基本的地址变换机构
页表寄存器PTR:存放页表在内存中的起始地址F和页表长度M
进程未执行时,页表的始址和页表长度放在进程控制块PCB中,当进程被调度时,操作系统内核才把他们放到页表寄存器中
页号是从0开始的,页表长度至少是1,因此 P=M也会越界
页表项地址=页表起始地址F+页号P*页表项长度
页表长度:页表中总共有几个页表项
页表项长度:每个页表项占多大的存储空间
物理地址E=内存块号b*页面大小L+页内偏移量W
页式管理中地址是一维的(只需告诉CPU逻辑地址的值)
两次访问内存:1.查页表 2.访问目标内存单元
2.具有块表的地址变换机构
快表:又称联想寄存器,是一种访问速度比内存快很多的高速缓冲存储器,用来存放当前访问的若干页表项
4.5.4 两级和多级页表
页目录表/外层页表/顶级页表
1.各级页表的大小不能超过一个页面
2.两级页表的访存次数分析
访问内存中的页目录表 访问内存中的二级页表 访问目标内存单元
4.6 分段存储管理方式
按照程序自身的逻辑关系划分为若干个段,每个段都从0开始编址,并有自己的名字和长度。
内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻。
分段、分页管理的对比
访存:1.查内存中的段表 2.访问内存单元
4.6.3 信息共享
分段系统易实现段的共享,即允许若干个进程共享一个或多个分段,对段的保护也简单易行
4.6.4 段页式存储管理方式
三次访存:1.访问内存中的段表,获取页表始址
2.访问内存中的页表,取出该页所在的物理块号
3.访问目标内存单元