第三章 内存管理
3.1 内存管理概念
3.1.1 内存的基础知识
什么是内存?有何作用?
程序执行前需要先放到内存中才能被CPU处理——缓和CPU与硬盘之间的速度矛盾
功能:
- 内存空间的分配与回收
- 地址转换
- 内存空间的扩充
- 存储保护
进程运行的基本原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4TANPMwA-1641173361227)(E:/txy/大三上/操作系统/img/image-20210812090013283.png)]
创建步骤(创建进程首先要将程序和数据装入内存)
编译:编译程序将用户源代码编译成若干目标模块
链接:由链接程序将编译后的形成的一组目标模块及所需要的库函数链接在一起,形成一个完整的装入模块
装入:由装入程序将装入模块装入内存运行
链接类型
静态链接:程序运行之前,将库函数连接成一个完整的可执行程序
装入时动态链接:将用户源程序编译后得到目标模块,装入内存时,采用边装入边链接的方式
运行时动态链接:对于某些目标模块的链接,程序需要时才会对其链接,便于修改和更新,便于实现对目标模块的共享
装入方式
绝对装入:在编译时,编译程序产生绝对地址的目标代码。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。
可重定位装入:程序中的其他地址是相对于始址的,根据内存当前情况,将装入模块装入适当位置。装入时对目标程序中指令和数据的修改过程称为重定位,也称静态重定位。 特点:一个作业装入内存的时候,必须给他分配要求的全部空间
动态运行时装入:动态重定位。程序真正执行的时候把相对地址转化为绝对地址。装入内存的地址都是相对地址,需要一个重定位寄存器的支持。特点:将程序分配到不连续的存储区中,在程序运行期间,动态申请分配内存。
逻辑地址空间与物理地址空间
-
逻辑地址空间:即相对地址,链接程序依次按照各个模块的相对地址构成统一的从0号单元开始编址的逻辑地址空间
-
物理地址空间:内存中物理单元的集合,是地址转换的最终地址,进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取。
-
地址重定位:逻辑地址转换成物理地址的过程
3.1.2 内存管理的概念
内存空间的分配与回收
操作系统负责内存空间的分配与回收
内存空间的扩展
操作系统需要提供某种技术从逻辑上对内存空间进行扩充
地址转换
操作系统需要提供地址转换功能,负责程序的逻辑地址与物理地址的转换
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yxrx7KWF-1641173361230)(E:/txy/大三上/操作系统/img/image-20210812090640684.png)]
绝对装入(单道程序阶段,无操作系统)
装入时按照实际的内存地址,将程序和数据装入内存
优点:不需要对程序和数据的地址进行修改
缺点:只适用于单道程序环境
可重定位装入(静态重定位)(早期多道批处理阶段)
此时采用的是模块与模块的相对地址,然后将程序和数据装入内存
装入时对目标程序中指令和数据的修改过程称为重定位,地址变换通常是在装入时一次完成的,又被称为静态重定位
特点:作业装入必须要一次性全部装入,并且运行中作业不能在内存中移动,也不能申请内存空间
动态运行时装入(动态重定位)(现代操作系统)
装入程序把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,当程序真正执行时才进行转换
特点:需要重定位寄存器可以将程序分配到不连续的存储区中便于程序段的共享可以向用户提供更大的地址空间(地址空间大于存储空间)
内存保护
操作系统需要提供内存保护功能。保证各进程在各自存储空间内运行,互不干扰
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eSduUwRq-1641173361231)(E:/txy/大三上/操作系统/img/image-20210812090631848.png)]
-
CPU中设置上、下限寄存器,存放用户作业在主存中的下限和上限地址,每当CPU要访问一个地址时,分别和两个寄存器的数据比较,判断是否越界
-
重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器):重定位寄存器中包含最小物理地址值,界地址寄存器包含逻辑地址的最大值
内存管理机构动态将逻辑地址与界地址寄存器进行比较,若未发生越界,则加上重定位寄存器的值形成物理地址,再送入内存单元
地址转换过程:逻辑地址->界地址寄存器->重定位寄存器->物理地址
3.1.3 覆盖与交换
覆盖技术
思想:将程序分为多个段(多个模块)。常用的段常驻内存,不常用的段在需要时调入内存
将用户空间分为一个固定区和若干覆盖区,活跃部分放在固定区,即将访问的段放在覆盖区
特点:打破了必须将一个进程的全部信息装入主存后才能运行的限制,内存中能够更新的地方只有覆盖区的段,不在覆盖区的段会常驻内存
缺点:操作系统自动覆盖,对用户不透明,增加用户编程负担
交换技术
思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)
换出:将处于等待状态的程序从内存中转移到辅存
换入:把准备好竞争CPU运行的程序从辅存转移到内存
结构:把磁盘空间分为文件区和对换区两部分
文件区主要用于存放文件,主要追求存储空间的利用率,因此对文件区空间的管理采用离散分配方式
对换区空间只占磁盘空间的小部分,被换出的进程数据就存放在对换区,主要追求换入换出速度,因此通常对换区采用连续分配方式
交换存在的问题
备份存储,使用快速硬盘,要求存储空间足够大,并且能够对内存映像进行直接访问
转移时间和所交换的内存空间成正比
只有进程空闲状态才能将进程换出
交换空间通常作为磁盘的一整块,且独立于文件系统,因此使用起来会很快
交换通常在有许多进程运行且内存吃紧时开始启动,系统负荷降低就暂停
普通的交换使用不多,但交换策略的某些变体在许多系统中仍发挥作用
覆盖与交换区别
覆盖是在同一个程序或进程中的
交换是在==不同进程(或作业)==之间的
3.1.4 连续分配管理方式
单一连续分配
内存分为系统区和用户区,系统区仅供操作系统使用,通常在低地址部分,用户区为用户提供
优点
无须进行内存保护,不会出现越界异常
实现简单,无外部碎片,采用覆盖技术,不需要额外技术支持
缺点
只适用于单用户,单任务的操作系统
存在内部碎片,存储器利用率低
固定分区分配
种类
分区大小相等:用一台计算机去控制多个相同对象的场合,缺乏灵活性
分区大小不等:划分为多个较小的分区,适量的中等分区和少量大分区
优点
适用于多道程序的存储,无外部碎片
缺点
程序太大,无法放入任何一个分区
主存利用率低,存在内部碎片
不能实现多进程共享一个主存区
动态分区分配
在进程装入内存的时候,根据内存的大小动态的建立分区
优点:分区大小可以根据进程的实际情况进行分配
缺点:存在外部碎片,最后导致主存利用率下降――采用紧凑技术可以缓解这种缺陷
3.1.5 动态分区分配算法
首次适应算法
空闲分区按照地址递增的顺序进行查找,找到第一个满足要求的分区进行分配
优点:综合看性能最好。算法开销小,回收分区后一般不需要对空闲分区队列重新排序
最佳适应算法
按照容量递增的顺序进行查找分区,将第一个满足条件的进行分配
优点:可以尽可能多地留下大片的空闲区
缺点:性能较差,产生最多的外部碎片,回收分区后可能需要对空闲分区队列重新排序
每次都选最小的分区进行分配,会留下越来越多的、很小的、难以利用的内存块。因此这种方法会产生很多的外部碎片。
最坏适应算法(最大适应算法)
空闲分区按照容量递减的次序进行查找,第一个满足条件的进行分配
优点:可以减少难以利用的小碎片
缺点:导致很快没有较大的内存块,性能很差―不利于大进程,算法开销大
邻近适应算法(首次适应算法)
分配内存时从上次查找结束的位置开始继续查找
优点:算法开销小
缺点:会使高地址的大分区也被用完
导致无论低地址、高地址部分的空闲分区都有相同的概率被使用,也就导致了高地址部分的大分区更可能被使用,划分为小分区,最后导致无大分区可用
3.1.6 基本分页存储管理的基本概念
允许一个程序分散的装入不相邻的内存分区
设计思想
将主存空间划分为大小相等且固定的块,块相对较小,作为主存的基本单位,进程以块为单位进行空间申请
分页存储与固定分区技术很像,但是其分页相对于分区又很小,分页管理不会产生外部碎片,产生的内部碎片也非常的小
基本概念
页面和页面大小
进程中的块=页
内存中的块=页框(页帧)
进程申请主存空间,为每个页面分配主存中可用页框,即页与页框一一对应
地址结构
页号(有多少页的编号)+页内偏移(页内存了多少东西)
页号= 逻辑地址/ 页面长度(取除法的整数部分)
页内偏移量= 逻辑地址% 页面长度(取除法的余数部分)
页号= 110 / 50 = 2
页内偏移量= 110 % 50 = 10
逻辑地址可以拆分为(页号,页内偏移量)
通过页号查询页表,可知页面在内存中的起始地址
页面在内存中的起始地址+页内偏移量= 实际的物理地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IVpDkaHd-1641173361232)(E:/txy/大三上/操作系统/img/image-20210813090321357.png)]
页表
记录了页面和实际存放的内存块之间的映射关系
为了便于在内存中找到进程的每个页面对应的物理块,系统为每个进程建立一张页表,记录页面在内存中对应的物理块号,页表一般放在内存中
页表项:页号+物理内存中的块号(不要与地址结构搞混)页表项的物理内存块号+地址结构中的页内偏移=物理地址
页面大小要适中
页面太小:进程页面数过多,页表过程,增加内存占用,降低硬件地址转换效率
页面太大:页内碎片过多,降低内存利用率
3.1.7 基本地址变换机构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-feRMM3js-1641173361232)(E:/txy/大三上/操作系统/img/image-20210813090736007.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oiEhJtOZ-1641173361233)(E:/txy/大三上/操作系统/img/image-20210813090837154.png)]
页表项大小的设计应当尽量一页正好能装下所有的页表项
第一步:分好块,在第几块第几个(页号P和页内偏移量W)
第二部:去问一下我的新家在哪,获得新家块(去页表寄存器看页表起始地址和判断,查页表找到内存块号)
第三步:新家号,在加上偏移量,就算出物理地址(内存块号加页内偏移W得到物理地址)
分页管理存在的问题
地址变换过程必须足够快,否则访存速率会降低
页表不能太大,否则会降低内存利用率
组成
设置一个页表寄存器(PTR),存放页表在内存中的起始地址F和页表长度M
页表的始址和页表长度放在进程控制块(PCB)中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xyBmO3Ld-1641173361234)(E:/txy/大三上/操作系统/img/image-20210813091416469.png)]
3.1.8 具有快表的地址变换机构
快表,又称联想寄存器(TLB, translation lookaside buffer ),是一种访问速度比内存快很多的高速缓存(TLB不是内存!),用来存放最近访问的页表项的副本,可以加速地址变换的速度。与此对应,内存中的页表常称为慢表。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W56gH2GP-1641173361235)(E:/txy/大三上/操作系统/img/image-20210813091600804.png)]
可优化方向:如果页表放在内存中,取地址访问一次内存,按照地址取出数据访问一次内存,共需要两次访问内存
访问一个逻辑地址的访存次数
基本地址变换机构(两次访存)
具有快表的地址变换机构
快表命中,只需一次访存
快表未命中,需要两次访存
3.1.9 两级页表
单级页表存在的问题
要在所有的页表项都连续存放的基础上才能用这种方法找到页表项
根据局部性原理可知,很多时候,进程在一段时间内只需要访问某几个页面就可以正常运行了。因此没有必要让整个页表都常驻内存。
如何解决单级页表的问题?
如果页数过多,就会导致页表也过多,那么我们可以考虑设置一个用来储存页表的页表(套娃)
逻辑地址空间格式=一级页号+二级页号+页内偏移
设计多级页表的时候,最后一定要保证顶级页表一定只有一个
建立多级页表的目的在于建立索引,不必浪费主存空间去储存无用的页表项,也不用盲目式的查询页表项
3.1.10 基本分段存储管理方式
出发点
分页是从计算机角度考虑设计的,目的是为了内存的利用率,提高计算机性能,分页通过硬件机制实现,对用户完全透明
分段是从用户和程序员的角度提出,满足方便编程,信息保护和共享,动态增长及动态链接等多方面的需要
分段
按照用户进程中的自然段划分逻辑空间
地址结构=段号S+段内偏移量w
页式系统中,页号和页内偏移对用户透明
段式系统中段号和段内偏移量必须由用户显示的提供
段表
每个进程都有一张逻辑空间与内存空间映射的段白,这个段表项对应进程的一段,段表项记录该段在内存中的始址和长度
段表内容=段号+段长+本段在主存中的地址
地址变换机构
逻辑地址A中取出段号S和段内偏移量w
比较段号S和段表长度M,若S>=M,则产生越界中断,否则继续执行
段号S对应的段表项地址=段表始址F+段号S*段表项长度,从该段表项中取出段长C,比较段内偏移量与C的大小判断是否出现越界取出段表项中该段的始址b,计算E=b+W,用得到的物理地址E去访问内存
段的共享与保护
共享:两个作业的段表中响应表项指向被共享段的同一个物理副本来实现的纯代码或者可重入代码以及不可修改的数据可以被共享
保护机制:
存取控制保护
地址越界保护
3.1.11 段页式管理方式
页式存储有效的提高内存利用率,分段存储能反映程序的逻辑结构并有利于段的分享,将这两种方式结合一下
这种二者结合的方法经常在计算机理论中遇到
思想
作业的地址空间首先被分成若干逻辑段,每段有自己的段号
每个段分成若千大小固定的页
对内存空间的管理仍然和分页存储管理一样
地址结构
段号S+页号P+页内偏移量w
为了实现地址变换,系统为每个进程建立了一张段表,每个分段有一个页表
一个进程中,段表只能有一个,页表可以有多个
补充
不能被修改的代码称为纯代码或可重入代码(不属于临界资源)
分段与分页的区别
分页对用户不可见,分段对用户可见
分页的地址空间是一维的,分段的地址空间是二维的
分页(单级页表)、分段访问一个逻辑地址都需要两次访存,分段存储中也可以引入快表机构
分段更容易实现信息的共享和保护(纯代码问重入代码可以共享)
分页管理
优点:内存空间利用率高,不会产生外部碎片,只会有少量的页内碎片
缺点:不方便按照逻辑模块实现信息的共享和保护
分段管理
优点:很方便按照逻辑模块实现信息的共享和保护
缺点:如果段长过大,为其分配很大的连续空间会很不方便
段式管理会产生外部碎片
3.2 虚拟内存管理
3.2.1 虚拟内存的基本概念
传统存储管理方式的特征、缺点
一次性:
作业必须一次性全部装入内存后,才能开始运行
作业很大无法装入则无法运行
大量作业要求运行时,由于内存不足,只能一部分作业先运行,导致多道程序度下降
驻留性:
作业装入内存后,一直驻留在内存中,任何部分不会被换出。
局部性原理
时间局部性
一条指令执行后,这之后指令可能被再次执行,数据被访问后,不久后数据可能再次被访问
原因:程序中存在着大量的循环操作
时间局部性通过将最近使用的指令和数据存储在高速缓冲存储器中
空间局部性
一旦程序访问了某个存储单元,不久之后附近的存储单元也将被访问
原因:指令通常是顺序存放,顺序执行的,数据一般也是以向量、数组、表等形式簇聚存储的
空间局部性使用较大的高速缓存,将预取机制继承到高速缓存控制逻辑中实现
虚拟存储器的定义和特征
基于局部性原理,程序的一部分装入内存,一部分留在外存,需要的时候将外存内容调入内存,就好像产生了一个巨大的内存空间
特征
多次性:作业在运行时,分多次调入内存运行
对换性:作业不必一直驻留内存,允许作业在运行过程中进行换进换出
虚拟性:从逻辑上扩充内存容量,使用户看到的内存容量远大于实际的内存容量
虚拟内存技术的实现
建立在离散分配的内存管理方式上
实现方式
请求分页存储管理
请求分段存储管理
请求段页式存储管理
硬件支持
一定容量的内存和外存
页表机制(或者段表机制)
中断机制
地址变换机制
3.2.2 请求分页管理方式
系统建立在基本分页系统基础之上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能
区别
请求分页存储管理与基本分页存储管理的主要区别
在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。
若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。
与基本分页管理相比,请求分页管理中,为了实现“4请求调页”,操作系统需要知道每个页面是否已经调入内存;如果还没调入,那么也需要知道该页面在外存中存放的位置。
当内存空间不够时,要实现“页面置换”,操作系统需要通过某些指标来决定到底换出哪个页面;有的页面没有被修改过,就不用再浪费时间写回外存。有的页面修改过,就需要将外存中的旧数据覆盖,因此,操作系统也需要记录各个页面是否被修改的信息。
请求页表项增加了四个字段:是否已调;可记录最近被访问过几次,或记录上次访问的时间,供置换算法选择换出页面时参考入内存;页面调入内存后是否被修改过;页面在外存中的存放位置。
页表机制
组成:页号、物理块号、状态位P、访问字段A、修改位M、外存地址
状态位:当前页是否已经调入内存
访问字段A:记录本页在一段时间内被访问的次数
修改位M:记录本页是否被修改过
外存地址:指出该页在外存上的位置(通常是物理块号)
缺页中断
当访问页面不在内存时就会产生缺页中断
特点
指令执行期间产生中断,而不是指令执行之后产生中断和处理中断
—条指令在执行期间,可能产生多次缺页中断
地址变换机构
检索快表,找到访问页,修改页表项中的访问位,利用页表项中给出的物理块号和页内地址形成物理地址
没有找到改页的页表项,去内存中寻找页表,看该页是否已经调入内存,没有调入则产生缺页中断,请求从外存把该页调入内存
3.2.3 页面置换算法
最佳置换算法(OPT)
选择永不使用或者最长时间内不再访问的页面进行淘汰,但是现实中是无法预知的
优点:缺页率最小,性能最好
先进先出页面置换算法(FIFO )
优先淘汰最早进入的页面
优点:实现简单
缺点:与进程的实际运行规律不匹配
Belady异常:增大分配的物理块数但是故障数不减反增―只有先进先出算法会出现
最近最久未使用(LRU )置换算法
选择最近最长时间没有被访问的页面进行淘汰,每个页面设置一个访问字段,用来标识上次被访问到现在经历的时间
优点:性能好
缺点:实现复杂需要寄存器和栈的硬件支持LRU是堆栈类算法
时钟(CLOCK)置换算法
简单的CLOCK 算法实现方法:为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位置为1。当需要淘汰一个页面时,只需检查页的访问位。如果是0,就选择该页换出;如果是1,则将它置为0,暂不换出,继续检查下一个页面,若第一轮扫 描中所有页面都是1,则将这些页面的访问位依次置为0后,再进行第二轮扫描(第二轮扫描中一定会 有访问位为0的页面,因此简单的CLOCK 算法选择一个淘汰页面最多会经过两轮扫描)
优点:性能接近于最佳置换算法
缺点:实现复杂开销大
改进型CLOCK算法
使用位(访问位)的基础上增加修改位
扫描过程
扫描缓冲区,选择第一个使用位和修改位都为0的页面换出
第一步失败后,查找使用位为0,修改位为1的进行替换,对于每个跳过的帧,将使用位置为0
第二步失败后,指针回到初始地点且使用位(访问位)均为0,重复第一步
优点:相对于未改进型,节省了时间
3.2.4 页面分配策略
驻留集
给一个进程的分配的物理页框的集合就是这个进程的驻留集
分配给一个进程的的存储量越小,任何时候驻留在主存中的进程数就越多,可以提高处理机的时间利用率
一个进程在主存中的页数过少,页错误率就会相对较高
页数过多,对进程的错误率也不会产生过多的影响
页面分配、置换策略
固定分配局部置换
每个进程分配固定物理块数,缺页的时候就进行换页
难以确定每个进程应该分配的物理块数
太多导致资源利用率下降太少导致频繁缺页中断
可变分配全局置换
进程分配一定物理块,系统自身保留一定空闲物理块,如果进程缺页,就对该进程分配新的物理块
优点:最容易实现,动态调整物理块分配
缺点:如果盲目分配物理块,就会导致多道程序并发能力下降
可变分配局部置换
根据进程的缺页情况,对物理块进行动态分配,如果频繁缺页,就对其多分配物理块,如果缺页率特别低,就减少其物理块
优点:保持了系统的多道程序并发能力
缺点:增大了开销,实现复杂
调入页面的时机
预调页策略
将预计不久被访问的页面调入,成功率约为50%
当进程提出缺页的时候,再按照一定策略进行调页
请求调页策略
特点:一次调入—页,调入/调出页面数多时会花费过多的I/O开销
从何处调页
拥有足够的对换空间
可以全部从对换区调入所需页面,提高调页速度
缺少足够的对换区空间
不会被修改的文件从文件区调入,可能被修改的部分换入对换区,以后再从对换区调入
原理:读速度比写速度块
UNIX方式
进程相关文件访问文件区,没有运行的页面从文件区调入,曾经运行过但又被换出的页面放在对换区
抖动(颠簸)现象
刚换出的页面又要换入内存
分配的物理页帧数不足(主要原因)
原因
置换算法不当
配给其他进程
工作集
某段时间内,进程要访问的页面集合。
原理
操作系统跟走每个进程的工作集,并为进程分配大于其工作集的物理块
落入工作集的页面需要调入驻留集中,落在工作集外面的页面可以从驻留集中换出
若还有空闲物理块,可以再调入一个进程到内存以增加多道程序数。
若所有进程的工作集之和超过了可用物理块的总数,操作系统就会暂停一个进程,并将其页面调出并将其物理块分配给其他进程
PPT小题整理
存储器管理目标
方便用户使用、提高内存的利用率以及从逻辑上扩充存储空间
内存分配:为每道程序分配内存空间,分配时尽量提高内存的利用率
内存保护:保证进程间互不干扰、相互保密
地址映射(变换):进程逻辑地址到内存物理地址的映射
内存扩充(对换和虚拟存储):提高内存利用率、扩大进程的内存空间
内存管理的技术:
分区式管理:固定式、可变式分区
页式管理
段式管理
段页式管理
存储器的层次结构
CPU寄存器:寄存器
主存:高速缓存、主存、磁盘缓存
辅存:磁盘、可移动存储介质
程序的装入和链接
编译程序产生的目标模块,通过链接程序进行链接,最后装入程序装入内存。
逻辑地址(相对地址、虚地址)
用户的程序经过汇编或编译后形成目标代码,采用相对地址
- 首地址为0,其余指令地址根据首地址来编址
- 不能用逻辑地址在内存中读取信息
物理地址(绝对地址、实地址)
内存中存储单元的地址
物理地址可以直接寻址
地址映射(重定位)
将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址
程序的装入
绝对装入方式
如果在编译时,事先能够知道程序将驻留在内存的什么位置,则编译程序可直接将程序的符号地址转换成绝对地址,产生使用绝对地址的目标模块,进而链接成使用绝对地址的装入模块。这样,装入程序便可按装入模块中的地址将程序和数据装入内存,而不需对模块中的地址部分进行修改
优点:装入过程简单
缺点:不适于多道程序系统
可重定位装入方式
静态重定位:当用户程序装入内存时,由装入程序一次性地完成逻辑地址到物理地址的转换,以后不再转换。而相应的装入方式则称作可重定位装入方式
优点:不需要硬件支持,可以装入有限多道程序
缺点:一个程序通常需要占用连续的内存空间,程序装入内存后不能移动
动态运行时装入方式
动态重定位:重定位不是在装入时进行,而是将它推迟到程序真正执行时进行。为了不影响指令的执行速度,在系统中增设一个重定位寄存器,用它来存放程序(数据)在内存中的起始地址。
优点:允许运行中的进程在内存中移动,比如进行对换或紧凑后
缺点:需要硬件支持
程序的链接
链接是将编译后得到的各个目标模块以及所需的库函数连接在一起,形成一个完整的装入模块。
静态链接
在程序运行之前,将各目标模块及它们所需的库函数,连接成一个完整的装入模块
装入时动态链接
装入时动态链接是指链接在装入时进行,即在装入一个目标时,若发生一个外部模块的调用事件,则由装入程序去找出相应的外部模块,将它装入内存,并把它链接到调用者模块上
运行时动态链接
运行时动态链接是指链接在运行时进行,即在执行过程中,当发现一个被调用模块还没装入内存时,立即由os找出该模块,将它装入内存,并把它链接到调用者模块上。
连续分配方式
单一连续分配方式
这是最简单的一种存储管理方式,但只能用于单用户、单任务的操作系统中。
采用这种存储管理方式时,可把内存分为系统区和用户区两部分,系统区仅提供给OS使用,通常是放在内存的低址部分;用户区是指除系统区以外的全部内存空间, 提供给用户使用
固定分区分配方式
-
分区大小相等
-
分区大小不等
动态分区分配方式
再装入程序时按其初始要求分配,或在其执行过程中通过系统调用进行分配或改变分区大小
分配算法(基于顺序搜索)
-
首次适应算法(FIrst Fit)它要求空闲分区链以地址递增的次序链接,每次从链首开始顺序查找,把最先找到的满足需求的空闲区分配之,此法的目的在于尽量减少查找时间
-
循环首次适应算法(Next Fit)为了避免低址部分留下很多很小的空闲分区,循环首次适应算法将空闲区链成环形链,每次分配从上次找到的空闲分区的下一个空闲分区开始查找能满足需求的空闲区
-
最佳适应(Best Fit)算法:它从全部空闲区中找出能满足作业需求的容量最小的空闲区分配之,此法的着眼点是使碎片尽量小。为了加速寻找,该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链
-
最坏适应(Worst Fit)算法:该算法在扫描整个空闲分区链时,总是挑选一个最大的空闲区,从中分割一部分存储空间给作业使用。此法的目的在于使剩下的空区最大,减少空区碎片机会。该算法要求将所有的空闲分区按其容量以从大到小的顺序形成一空闲分区链
优点:没有内碎片
缺点:有外碎片;如果大小不是任意的,也可能出现内碎片
分配算法(基于索引搜索)
- 快速适应算法
- 伙伴系统
- 哈希算法
可重定位分区分配方式
可重定位分区分配方式就是在动态分区分配方式的基础上增加了紧凑功能。由于紧凑时,作业需要在内存中移动位置,需要动态重定位技术的支持,因此该方式又被称为动态重定位分区分配
分区的保护
界限寄存器:它可以是一对上、下限寄存器,也可以是一对基址、限长寄存器。每当进行内存访问时,硬件自动将所访问的内存地址与界限寄存器的值进行比较,若发生地址越界,则产生越界中断
保护键:它为每个分区分配一个独立的保护键,相当于一个锁;同时为每个进程分配一个相应的钥匙。保护键可设置成对读写同时保护的或只对读、写进行单项保护的。
对换
多个程序并发执行,可以将暂时不能执行的程序送到外存中,从而获得空闲内存空间来装入新程序,或读入保存在外存中而目前到达就绪状态的进程。
优点:增加并发运行的程序数目,并且给用户提供适当的响应时间;编写程序时不影响程序结构
缺点:对换入和换出的控制增加处理机开销;程序整个地址空间都进行传送,没有考虑执行过程中地址访问的统计特性
分页式存储管理
将程序的逻辑地址空间和物理内存划分为固定大小的页或页面(page or page frame),程序加载时,分配其所需的所有页,这些页不必连续。需要CPU的硬件支持
优点
-
没有外碎片,每个内碎片不超过页大小
-
一个程序不必连续存放
缺点:程序全部装入内存
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-smtNO2S4-1641173361237)(…/img/03.png)]
页表:描述进程中每个页面所对应的物理块,每个进程有一个页表
物理页面表:整个系统有一个物理页面表,描述物理内存空间的分配使用状况
数据结构:位示图,空闲页面链表
请求表:整个系统有一个请求表,描述系统内各个页表的位置和大小,用于地址转换;也可以结合到各进程的PCB里
PDF4 页表寄存器 P59
内存的有效访问时间(Effective Access Time,EAT):从进程发出指定逻辑地址的访问请求,经过地址变换,到在内存中找到对应的实际物理地址单元并取出数据,所需要花费的总时间
命中率:是指使用快表并在其中成功查找到所需页面的表项的比率
λ为访问快表的时间/更新快表的时间,t为访问内存的时间,a是快表命中率
分页存储管理方式下,存在2种方式的内存访问:
- 没有引入快表的分页存储管理方式
EAT= t + t = 2 t
- 引入快表的分页存储管理方式
EAT=a* λ +(1- a) (λ+ t +λ)+t
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ozPO90qs-1641173361238)(…/img/04.png)]
反置页表
因此就有很多页表项,从而占用很多的内存空间。为了减少页表占用的内存空间而引入了反置页表
一般页表的表项是按页号进行排序,页表项中的内容是物理块号。而反置页表是为每一个物理块设置一个页表项并将按物理块号排序,其中的内容则是页号及其隶属进程的标志符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KEw1Mhq4-1641173361239)(…/img/05.png)]
分段式存储管理
引入分段存储管理方式, 主要是为了满足用户和程序员的下述一系列需要:
**方便编程:**例如:LOAD 1,[A]|
**信息共享:**可以按段为单位来进行共享
**信息保护:**可以针对不同类型的段采取不同的保护
**动态增长:**特别是数据段的不断增长
**动态链接:**当运行过程中又需要调用某段时,才将该段(目标程序)调入内存并进行链接。动态链接要求以段作为管理的单位
分页式和分段式对比
-
页是信息的物理单位,分页是出于系统管理的需要;段则是信息的逻辑单位,它含有一组其意义相对完整的信息,分段是出于用户应用的需要。一条指令或一个操作数可能会跨越两个页的分界处,而不会跨越两个段的分界处
-
页大小是系统固定的;而段大小则通常不固定,由编译程序在对源程序进行编译时,根据信息的性质来划分
-
通常段比页大,因而段表比页表短,可以缩短查找时间,提高访问速度
-
逻辑地址表示:
-
- 分页是一维的,各个模块在链接时必须组织成同一个地址空间
-
- 分段是二维的,各个模块在链接时可以每个段组织成一个地址
空间
-
分段系统:易于实现段的共享
-
分页系统:可以实现程序和数据的共享,但不是很方便
段页式存储管理
段页式系统的基本原理是分段和分页原理的结合,先将用户程序分成若干个段,再把每个段分成若干个页
虚拟存储器
常规存储器管理方式的特征
一次性。作业在运行前必须一次性地全部装入内存后才能运行
驻留性。作业装入内存后,便一直驻留在内存中,直至作业运行结束
虚拟存储器:时间局部性、空间局部性
所谓虚拟存储器,是指具有请求调入功能和置换功能, 能从逻辑上对内存容量加以扩充的一种存储器系统。
虚拟存储技术的特征
多次性:虚拟存储器将一个作业分成多次调入内存
对换性:虚拟存储器允许将那些暂不使用的程序或数据从内存调至对换区,待以后需要时再调入内存,从而能有效地提高内存利用率。( 与交换技术相比较,虚拟存储的调入和调出是对部分虚拟地址空间进行的)
虚拟性:虚拟存储器对内存的扩充是逻辑上的,用户所看到的大容量只是一种感觉,并不是实际存在,因此是虚的(总容量不超过物理内存和外存交换区容量之和)
请求分页存储管理
页表的扩充
缺页中断机构
PDF5 P10
调页策略
预调页策略
请求调页策略
何处调页
系统拥有足够的对换区空间,这时可以全部从对换区调入所需页面,以提高调页速度。
系统缺少足够的对换区空间,这时凡是不会被修改的文件,都直接从文件区调入;当换出这些页面时,由于它们未被修改而不必再将它们换出,以后再调入时,仍从文件区直接调入。但对于那些被修改的部分,在将它们换出时,便须调到对换区,以后需要时,再从对换区调入
UNIX方式。由于与进程有关的文件都放在文件区,故凡是未运行过的页面,都应从文件区调入。而对于曾经运行过但又被换出的页面,由于是被放在对换区,因此在下次调入时,应从对换区调入。由于UNIX系统允许页面共享,因此,某进程所请求的页面有可能已被其它进程调入内存,此时也就无须再从对换区调入
缺页率=缺页次数 / 总的页面访问次数
最佳置换算法(Opt)
其所选择的被淘汰页面,将是以后永不使用的, 或许是在最长(未来)时间内不再被访问的页面
先进先出(FIFO)页面置换算法
最近最久未使用(LRU)置换算法
最少使用(LFU: Least Frequently Used)置换算法
该算法要求为每个页面配置一个计数器,一旦某页被访问,则将其计数器的值加1,在需要选择一页置换时,则将选择其计数器值最小的页面,即内存中访问次数最少的页面进行淘汰
Clock置换算法(最近未使用算法)
改进型Clock置换算法
访问位A和修改位M可以组合成下面四种类型的页面,如右图所示:(淘汰的优先级从下至上递增)
A M
0 0
0 1
1 0
1 1
影响页面换进换出效率的若干因素
① 页面置换算法
② 写回磁盘的频率
③ 读入内存的频率
换出
如果页面未被修改,就将其归入空闲页面链表的末尾;否则将其归入到已修改页面链表
调入
当需要调入新的物理页面时,将新页面内容读入到空闲页面链表的第一个页面
访问内存的有效时间
与基本分页存储管理方式不同,在请求分页管理方式中,内存有效访问时间不仅要考虑访问页表和访问实际物理地址数据的时间,还必须要考虑到缺页中断的处理时间
抖动
发生“抖动”的根本原因是,同时在系统中运行的进程太多,由此分配给每一个进程的物理块太少,不能满足进程正常运行的基本要求,致使每个进程在运行时,频繁地出现缺页,必须请求系统将所缺之页调入内存。
请求分段存储管理
段表机制
分段的保护
-
越界检查
-
存取控制检查
-
环保护机构
何处调页
系统拥有足够的对换区空间,这时可以全部从对换区调入所需页面,以提高调页速度。
系统缺少足够的对换区空间,这时凡是不会被修改的文件,都直接从文件区调入;当换出这些页面时,由于它们未被修改而不必再将它们换出,以后再调入时,仍从文件区直接调入。但对于那些被修改的部分,在将它们换出时,便须调到对换区,以后需要时,再从对换区调入
UNIX方式。由于与进程有关的文件都放在文件区,故凡是未运行过的页面,都应从文件区调入。而对于曾经运行过但又被换出的页面,由于是被放在对换区,因此在下次调入时,应从对换区调入。由于UNIX系统允许页面共享,因此,某进程所请求的页面有可能已被其它进程调入内存,此时也就无须再从对换区调入
缺页率=缺页次数 / 总的页面访问次数
最佳置换算法(Opt)
其所选择的被淘汰页面,将是以后永不使用的, 或许是在最长(未来)时间内不再被访问的页面
先进先出(FIFO)页面置换算法
最近最久未使用(LRU)置换算法
最少使用(LFU: Least Frequently Used)置换算法
该算法要求为每个页面配置一个计数器,一旦某页被访问,则将其计数器的值加1,在需要选择一页置换时,则将选择其计数器值最小的页面,即内存中访问次数最少的页面进行淘汰
Clock置换算法(最近未使用算法)
改进型Clock置换算法
访问位A和修改位M可以组合成下面四种类型的页面,如右图所示:(淘汰的优先级从下至上递增)
A M
0 0
0 1
1 0
1 1
影响页面换进换出效率的若干因素
① 页面置换算法
② 写回磁盘的频率
③ 读入内存的频率
换出
如果页面未被修改,就将其归入空闲页面链表的末尾;否则将其归入到已修改页面链表
调入
当需要调入新的物理页面时,将新页面内容读入到空闲页面链表的第一个页面
访问内存的有效时间
与基本分页存储管理方式不同,在请求分页管理方式中,内存有效访问时间不仅要考虑访问页表和访问实际物理地址数据的时间,还必须要考虑到缺页中断的处理时间
抖动
发生“抖动”的根本原因是,同时在系统中运行的进程太多,由此分配给每一个进程的物理块太少,不能满足进程正常运行的基本要求,致使每个进程在运行时,频繁地出现缺页,必须请求系统将所缺之页调入内存。
请求分段存储管理
段表机制
分段的保护
-
越界检查
-
存取控制检查
-
环保护机构