存储部件
主存:保存进程运行时的程序及数据
寄存器:速度最快,价格昂贵且容量不大,一般以字为单位
高速缓存:
(1)速度比内存快,集成在CPU
(2)存放内存的部份拷贝,放置常用数据以提高速度
(3)不能被程序直接更改,由硬件自己处理对内存数据的拷贝
磁盘缓存:内存的一部分,将频繁使用的磁盘数据预读在磁盘缓存,减少磁盘读写时间
存储器管理
重点是内存管理,可直接影响存储器的利用率和系统性能
(1)存储器资源的分配与回收
(2)地址变换(逻辑与物理地址的对应关系维护)
(3)存储共享和保护
(4)虚拟存储的调度算法
程序的装入和链接
多道环境下,程序的运行须先创进程,闯进丞则须先将程序和数据装入内存
编译->链接->装入
- 地址的概念
☞逻辑地址(相对地址,虚地址):程序经过编译形成的目标代码,不能在内存中读取信息
☞物理地址(绝对地址,实地址):内存中存储单元的地址,可被直接寻址 - 装入中的地址处理
(1)绝对装入方式:逻辑地址==物理地址
(2)静态可重定位装入方式:执行前映射,重定位后物理地址不改变
优点:不需硬件支持,可装入有限的多道程序
缺点:一个程序需占用连续的内存空间且装入后无法移动,不易实现共享
(3)动态运行时(重定位)装入方式:依靠重定位寄存器(硬件),地址转换在程序真正要执行时进行
被记录的基地址不一定固定,可能根据内存使用情况变化更新
重定位:把目标程序中的指令和数据的逻辑地址变为内存中物理地址的过程
- 进程在内存中的位置记录
(1)整体连续在内存中的:记录基地址
(2)离散装入不同内存位置的:记录多个偏移用的基地址
不同程序的连接装入方式(内存使用时机)
- 静态链接:装入运行前将目标模块及所需库函数链接成整体且不在拆分
- 装入时动态链接:装入内存时边装入边链接
- 执行时动态链接:在需要某些目标块时才进行的链接
连续分配存储管理方式
单一连续分配(最简单,用于单用户单任务):将内存分为系统区与用户区
利:易于管理;弊:易浪费内存空间
固定分区分配(多道程序系统和分时系统):将内存分为多个区域,操作系统占一个,每个应用进程各占一个。几个分区便只允许几个程序多道并发
-
分区大小划分
(1)大小相同:使用多个相同程序并发,缺乏灵活性
(2)大小不等:多个小,适量中,少量大,根据程序大小分配 -
所需数据结构
(1)建立记录相关信息的分区表,表项为|起始位置|大小|状态|
(2)分区表中表项值随内存的分配与释放而动态改变 -
内存分配过程
(1)分区表被分为空闲分区表和占用分区表
(2)空闲分区表根据算法将表项进行排序
(3)检索空闲分区表,将满足要求且尚未分配的分区派给程序;若未找到合适分区则拒绝程序请求 -
固定分配不足的原因
(1)内碎片(一个分区内的剩余空间)造成浪费
(2)分区总数固定,限制了并发程序执行的程序数目
动态分区分配:装入程序是根据程序需要动态分配内存空间
☞优点:并发进程数无固定限制,不产生内碎片
☞缺点:有外碎片
-
所需数据结构
(1)空闲分区表 (2)空闲分区链(有前后向指针) -
分区分配算法
【首次适应算法FF】
(1)以地址递增的方式为空闲分区排序
(2)分配时从链首检索满足要求的空闲分区
(3)从分区中分出作业所需大小,余下空间仍留在空闲链表中
☞优点:优先利用内存低址部分,保留了大部分高址空闲区
☞缺点:随着低址部分的不断划分会产生较多小碎片;每次查找都从低址开始会逐渐增加查找开销
【循环首次适应算法】
(1)按地址将空闲分区排序
(2)从上次找到的空闲分区的下一分区开始查找,直到找到满足要求的分区(需设置起始查询指针并采用循环查找方式)
(3)分出所需大小
☞优点:分区分布均匀,减少查找开销
☞缺点:缺少大的空闲分区
【最佳适应算法】
(1)将空闲分区按容量从小到大排序
(2)从链首开始检索,找到第一个满足的就分配
(3)分出所需大小
☞缺点:会产生较多难以利用的外碎片
【最差适应算法】
☞基本不留小空闲分区,但可能缺乏较大空闲分区
【快速适应算法】
(1)根据进程常用空间进行大小划分,相同大小的串成链
(2)进程需要时从最接近需求的链中摘取一个分区进行分配
☞能快速找到合适分区,但须管理较多链表信息(空间换时间)
分页存储管理方式
更细粒度的处理空间,就按少粗放管理或开销问题。内利使用率高,浪费少(不是绝对没有碎片)
页面
内存划分为大小为单元k的物理块,作业按大小为k划分为页面
☞物理划分块的大小=逻辑划分页的大小
-
太大:最后一页的内碎片增大
-
太小:提高了利用率(页面碎片总空间减小),但进程的页面数量过多,页表过长,增加了空间使用
页表:页号到物理块号的地址映射
地址处理
- 逻辑地址组成:页号+页内地址(偏移量)
- 偏移量=log2(页面大小)
- 页号位数=log2(页数)
- 业内地址位数=log2(页面大小)
=页号位数*页面大小 - 块内偏移=页内偏移
地址变换机构
设置一个页表寄存器PTR,记录页表首地址和页表长度,便于快速定位
- 进程A的地址变换
(1)运行时,将PCB中页表信息写入PTR
(2)根据分页原理,在执行指令时得到页号和内部偏移量
(3)CPU访问PTR找出页表
(4)查找页表数据找出对应物理块,完成地址映射,在内存中找到该指令
检索前会判断是否发生越界错误
访问内存的有效时间EAT
☞ 进程发出访问请求后,经过地址变换找到对应的物理地址单元并取出数据所花费的总时间
设访问一次内存的时间为t,则EAT=2t
(1)访问内存中页表
(2)访问物理块
- 高速缓冲寄存器(快表)
为减少第一步访问内存时间,具有“并行查询能力”,存放正在执行进程的页表数据项
设a为查询命中率,t’为查询一次快表所需时间:EAT=at’+(1-a)(t+t’)+t=2t+t’-at - 不足
容易造成共享和非共享数据共处一页,不方便设置权限
分段存储管理方式
将作业分成若干段,各段可离散放入内存,段内仍连续存放。方便用户和使用上的要求
-
基本特点
(1)每段有自己的名字,都从0编址,可分别编写和编译。装入内存时,每段赋予一个段号
(2)每段占据一块连续内存
(3)各段大小不等,由编译程序决定 -
段表与地址变换机构
☞段表记录每段实际存放的物理地址(内存首地址和段长)
相对地址:段号+段内地址
分段与分页的主要区别