适用计算机操作系统(OS)(第四版)
自己的学习笔记,PPT及图片来源网络及自己老师,侵删。
三硬一软一接口——2硬:存储器
第四章存储器管理
4.1 存储器的层次结构
4.1.1 多层结构的存储器系统
高速缓存Cache:
少量的、非常快速、昂贵、易变的
内存RAM:
若干兆字节甚至G为单位、中等速度、中等价格、易变的
磁盘:
G或T为单位、低速、价廉、不易变的
4.1.2 主存储器与寄存器
主存储器 :即内存,也称可执行存储器
寄存器 :寄存器具有与处理机相同的速度,访问速度最快,完全能与CPU协调工作,但是价格昂贵,因此容量不可能做的很大。
4.1.3 高速缓存和磁盘存储
高速缓存 :介于寄存器与存储器之间的存储器,主要用于备份主存中较常用的数据,以减少处理机对主存储器的访问次数,可以大幅度提高程序执行速度。
磁盘缓存 :目前磁盘的I/O速度远低于对主存的访问速度,为了缓和两者之间在速度上的不匹配,而设置了磁盘缓存,主要用于暂时存放频繁使用的一部分磁盘数据和信息,以减少访问磁盘的次数。但磁盘与高速缓存不同,其本省并不是一种实际存在的存储器,而是利用主存中的部分存储空间暂时存放从磁盘中读出(或写入)的信息。
4.2 程序的装入和链接
对用户程序的处理步骤 :
编译 —— 链接 ——装入
4.2.1 程序的装入
1 )绝对装入方式 (已淘汰):
用户程序中所使用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。
但在由程序员直接给出绝对地址时,不仅要求程序员熟悉内存的使用情况,而且一旦程序或数据被修改后,可能要改变程序中的所有地址。
2 )可重定位装入方式 :
根据内存的具体情况将装入模块装入到内存的适当位置。
装入时对目标程序中指令和数据地址的修改过程称为重定位,又因为地址的变换时在进程装入时一次完成的,以后不再改变,故称为静态重定位。
3 )动态运行时的装入方式 :
与静态重定位相似,只是把逻辑地址到物理地址的转换推迟至程序真正要执行时才进行。
4.2.2 程序的链接。
1 )静态链接方式 :
在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的装配模块,以后不再拆开。
2 )装入时动态链接 :
用户源程序编译后得到的一组目标模块 ,在装入内存时,采用边装入边链接的链接方式。及在装入模块时,若发生一个外部模块调用事件,则找出相应的外部模块,并把它装入内存。
优点 :
1 )便于修改和更新
2 )便于实现对目标模块的共享
3 )运行时动态链接 :
对某些模块的链接推迟到程序执行时才进行。
4.3 连续分配存储管理方式
锁片 :无法被利用的空间 。
外碎片 :分区时没有被分区的空间。
内碎片 :进程装入分区时,分区内没有被利用的空间。
4.3.1 单一连续分配
最简单的一种存储管理方式,只能用于单用户、单任务的操作系统中。采用这种存储管理方式时,可把内存分为系统区和用户区两部分,系统区仅提供给OS使用,通常是放在内存的低址部分;用户区是指除系统区以外的全部内存空间, 提供给用户使用。
缺点 :
- 只能有一个作业进入内存,故它不适用于多道程序设计,整个系统的工作效率不高,资源利用率低下。
- 只要作业比用户区小,那么在用户区里就会形成碎片,造成内存储器资源的浪费。如果用户作业很小,那么这种浪费是巨大的。
- 若用户作业的相对地址空间比用户区大,那么该作业就无法运行。即大作业无法在小内存上运行。
4.3.2 固定分区分配
把用户空间划分为若干个区域,每个区域可以装入一项作业。分区一旦划定,分区数就确定。
多道程序的道数受到分区数的限制。
分区的划分方法有:
1)分区大小相等
2)分区大小不等
4.3.3 动态分区分配
根据进程的实际需要,动态地为之分配内存空间。
动态分区分配中的数据结构 :
1 )空闲分区表,记录每个空闲分区的情况。
2 )空闲分区链,实现对空闲分区的分配与链接。
m.size — u.size <= size ?
size是极限值,一旦分割就会成为碎片,不如不分割
回收内存 :
1)回收区与插入点的前一个空闲分区F1相邻接,回收区与插入点的前一分区合并,只修改前一分区F1的大小。
2)回收区与插入点的后一个空闲分区F2相邻接,两分区合并,使用回收区的首地址作为新空闲区的首址,大小为两者之和。
3)回收区同时与与插入点的前、后空闲分区相邻接,此时三个分区合并,使用F1的表项和F1的首址,取消F2的表项,大小为三者之和。
4 )回收区独立,为回收区单独建立一个新表项,填写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置。
当进程运行完毕释放内存,系统回收内存,
4.3.4 基于顺序搜索的动态分区匹配算法
1 )首次适应算法FF
-
空闲分区链按地址递增的次序链接;
-
进行内存分配时,从链首开始顺序查找,直至找到一个满足大小要求的空闲分区为止。
-
将此空白分区分成两部分,一部分与作业请求空间大小相等,分配给作业,余下的空闲分区仍留在空闲链表中。
特点 :
-
低址部分不断划分,造成一批较小的空闲区。
-
查找总从低址部分开始,增大了开销。
-
较大的分区集中在高址部分。
-
2 )循环首次适应算法NF
-
进程分配内存空间时,查找不再是每次从链首开始,而是从上次找到的空闲块的下一个空闲区开始,直至找到满足的空闲分区。
-
实现本算法,需要设置一起始查寻指针,以指示下一次起始查寻的空闲分区,并采用循环查找方式。
特点 :
-
内存中空闲分区分布得更均匀。
-
减少查找空闲分区的开销。
-
缺乏大的空闲分区。
-
3 )最佳适应算法BF
-
内存分配时,总选择满足请求的最小空闲分区分配给作业。
-
为加速寻找,将空闲区按由小递增的顺序形成空闲区链。
特点 :
- 存储器中会留下许多难以利用的小空闲区。
4.3.6 动态可重定位分区分配
动态分区分配 + 紧凑技术
紧凑 :通过移动内存中作业的位置,把原来多个分散的小分区拼接成一个大分区的方法
动态重定位 :为使地址的转换不会影响到指令的执行速度,必须有硬件地址变换机构的支持,即在系统中增设一个重定位寄存器,用它来存放内存中的起始地址,程序在执行时,真正访问的内存地址是相对地址与重定位寄存器中的地址相加而形成的。
动态重定位分区分配算法
4.4 对换
4.4.1 多道程序环境下的对换技术
对换 :把内存中暂时不能运行的进程或者暂时不用的程序和数据换出到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程所需的程序和数据换入内存。
对换的类型 :
1 )整体对换
2)页面(分段)对换
4.4.3 进程的换出与换入
1、进程的换出
首先选择处于阻塞状态或睡眠状态的进程,当这种进程有多个时,应当选择优先级最低的进程,如果系统中已无阻塞进程,而现在的内存空间还不足以满足需要,便选择优先级最低的就绪进程换出。
2、进程的换入
查看PCB,找出“就绪”状态但以换出的进程,当存在许多这样的进程时,选择其中已换出到磁盘上时间最久的进程作为换入进程,为它申请内存。
4.5 分页存储管理方式
离散的分配方式 :
1 )分页 :将用户程序的地址空间分为若干个固定大小的区域,称为“页”或“页面”。相应的,也将内存空间分为若干个物理块或页框,页和块的大小相同。这样可将用户程序的任一页放入任一物理块中,实现了离散分配。
2 )分段 :为了满足用户的要求,它把用户程序的地址空间分为若干个大小不同的段,每段可定义一组相对完整的信息,在存储器分配时,以段为单位,这些段在内存中可以不相邻接。
3 )段页混合存储 :分页与分段两种方式相结合的产物,具有两者的优点,目前应用较为广泛的一种存储管理方式。
4.5.1 分页存储管理的基本办法
1、页面和物理块
1)页面 :
-
分页存储管理进程的逻辑空间分成若干大小相等的片,称为页面或页。
-
内存空间分成与页相同大小的若干个存储块,称为物理块或页框。
-
为进程分配内存时,以块为单位将进程中的若干页分别装入多个可不相邻接的物理块中。
2)页面大小 :
过小 :减少内存碎片,有利于内存利用率的提高,但每个进程占用较多的页面,进程页表过长,占用大量内存,同时降低页面换进换出的效率。
过大 :减少页表的长度,提高页面换进换出的效率,但页内碎片增大。
2、地址结构
地址长度32位 = 0 ~ 11位页内地址 + 12 ~ 31位页号
页面大小为 :212 = 4 KB 页号最多允许 : 220 = 1M 页
计算公式 :
(页号 )P = INT [ A / L ]
A 为逻辑地址 ;L为页面大小
(页内地址)d = [ A ] MOD L
INT [ ] 为整除函数 ;MOD [ ] 为取余函数
3 、页表
为了能在内存中找到每页所对应的物理块,系统为每个进程建立一张页面映射表即页表。(大多驻留内存)
页表项结构 :(实际在内存存储中,只放块号不放页号)
4.5.2 地址变换机构
1、基本的地址变换机构
存取一次数据访问内存两次:
1)第一次访问内存查找页表
2)第二次访问物理内存对应的内存单元
页表功能是由一组专门的寄存器来实现的,,一个页表项使用一个寄存器,但由于寄存器成本原因,页表项不可能全部使用寄存器实现,页表大多驻存在内存中,系统只设置一个页表寄存器PTR,存放页表在内存中的首址与页表长度。
进程未执行时,页表的始址与页表长度存放在本进程的PCB中,调用进程时,才将这两个数据装入页表寄存器中。
基本的地址变换机构访问过程 :(页面大小是2的整数幂)
(1)地址变换机构自动将逻辑地址分为页号和页内地址(页内位移量);
(2)检查页号是否越界,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间,并同时发出一个地址越界中断;
(3)如果未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,得到该表项在页表中的位置;
(4)从页表中检索到该页的物埋块号并装入物埋地址寄存器中,同时将逻辑地址中的页内地址直接送入物理地址寄存器的块内地址部分;
(5)物理块号和块内地址组合就产生了要访问的物理地址。
注意 :
1、页表长度 :页表中总共有几个页表项 。
2、页面大小 :一个页面占多大的存储空间。
3、页表项长度 :每个页表项占多大存储空间。
4、物理地址 = 物理块号 * 页面大小 + 页内偏移量
5、页表项的位数 :页表项实际只存储了物理块号,即实际的存储空间依据页面大小可以分成多少个物理块(每个物理块的大小等于页面大小)
位数 = log2 (存储空间大小 / 页面大小)
6、逻辑地址转换为物理地址需要进行越界判定,必须页号<页表长度,不满足则认为出现越界错误。
2、 具有快表的地址变换机构
快表(TLB)又称为联想存储器,用于存放当前被频繁访问的页表项,从而提高地址变换速度。
具有快表的地址变换机构访问过程 :
1、CPU给出逻辑地址,由某个硬件算得页号、页内偏移量,将页号与快表中的所有页号进行比较。
2、如果找到匹配的页号,说明要访问的页表在快表中有副本,则直接从中取出该页对应的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后,访问该物理地址对应的内存单元。因此,若快表命中,则访问某个逻辑地址仅需一次访问即可。
3、如果没有找到匹配的页号,则需要访问内存中的页表,找到对应页表项,得到页面存放的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后,访问该物理地址对应的内存单元。因此,若快表未命中,则访问某个逻辑地址需要访问两次(在找到页表后,应同时将其存入快表,以后便后面可能的再次访问。但若快表已满,则必须按照一定的算法对旧的页表项进行替换)。
4、由于查询快表的速度比查询页表的速度快的多,因此只要快表命中,就可以节省很多时间。因为局部性原理,一般来说快表的命中率可以达到90%以上。
即在寄存器中放置一个经常被访问的页面的页表(快表的页号也被存储),在基本的地址变换机构访问过程之前,加入对快表的访问。
4.5.3 访问内存的有效时间
命中 :快表 + 1次内存
未命中 :快表 + 2次内存
访问快表需a,访问内存需b,则检索快表时命中为a+b,否则为 a+2b,命中率为80%时有效访问时间:
(a + b) * 80% + ( 1 - 80% ) * ( a + 2b )
4.5.4 两级和多级页表
页表的页表,解决了大页表无需大片连续存储空间的问题。
逻辑地址结构 :
1 )按照地址结构将逻辑地址拆分成三部分
2 )从PCB中读出页目录表始址,根据一级页号查页目录表,找到下一级表在内存中的存放位置
3 )根据二级页表号查表,找到最终想访问的内存块号
4 )结合页内偏移量得到物理地址
注意 :
- 多级页表中,各级页表的大小不能超过一个页面,若两级页表不够,可以分更多级
- 多级页表的访问次数(没有快表),N级页表访问一个逻辑地址需要N+1次访问内存。
4.6 分段存储管理方式
为了满足用户的要求,引入分段模式。
4.6.1 分段存储管理方式的引入
为了满足以下需要 :
1 )方便编程 :对作业以逻辑关系划分。
2 )分段共享 :可以分享作业的一部分完整信息。
3 )分段保护 :对作业的一部分赋予不同的权限用来保护信息。
4 )动态链接 :动态链接要求以段作为链接的基本单位。
5 )动态增长 :现实中一些数据段会随着运行的过程不断增加,很难采用预先多分配的方式。
4.6.2 分段系统的基本原理
1、 分段地址结构 :
- 作业按逻辑关系划分成若干段,每个段都有自己的段名和长度
- 逻辑地址是二维的,由段号(名)和段内偏移量决定
- 段长不固定
2 、段表
段表实现逻辑段到物理内存区的映射
3、 地址变换机构
过程 :
1 )首先用段号与段表长度对比查看是否越界(段号>=段表长度),越界产生中断信号。
2 )未越界则计算出段表中对应的段表项。
3 )然后段内地址与段长对比,判断是否越界,越界产生中断信号。
4 )未越界则计算物理地址。
4、 分段的优缺点 :
优点:
- 便于程序模块化处理和处理变化的数据结构。
- 便于共享分段。
- 便于动态链接。
缺点:
- 地址变换费时,需硬件支持,并且管理表格要提供附加的存储空间。
- 为满足段的动态增长和减少碎片,要用拼接技术。
- 段长不定,管理困难。
- 段长受内存可用区的限制
5、分页与分段的区别
- 页是信息的物理单位,分页削减了内存的外零头,
提高了内存的利用率。段是信息的逻辑单位,分段
的目的是满足用户的需要。 - 页的大小固定且由系统确定。段的长度不固定,决
定于用户程序,由编译程序根据信息的性质来划
分。 - 分页的作业地址空间是一维的。分段的作业地址空
间是二维的(段名和段内地址)。
4.6.3 信息共享
-
分段易于实现段的共享,即允许若干个进程共享一个或多个分段。
-
段的共享,是通过不同作业段表中的项指向同一个段基址来实现。
-
几道作业共享的例行程序就可放在一个段中,只要让各道作业的共享部分有相同的基址/限长值。
-
对共享段的信息必须进行保护。
4.6.2 段页式存储管理方式
用户程序分成若干个段,每个段分成若干个页。结合分页和分段的优点,用分段方法来分配和管理虚存,
用分页方法来分配和管理实存。
1、 地址结构 :
2 、段表&页表
段表:记录每一段的页表始址和页表长度。
页表:记录了逻辑页号与内存块号的对应关系。(每一个段对应一个页表)
3 、地址变换过程
在段页式管理系统中,要对内存中指令或数据进行一次存取的话,至少需要访问三次以上的内存(没有快表):
1 )第一次是由段表地址寄存器得段表始址后访问段表,由此取出对应段的页表在内存中的地址。
2 )第二次则是访问页表得到所要访问的物理地址。
3 )第三次才能访问真正需要访问的物理单元。