王道操作系统系统第三章

1.1内存的基本知识

内存是用于存放数据的硬件,程序执行之前需要放在内存中才能被CPU处理
如果直接读取外存里的数据,因为外存是一种慢设备,存取的效率都很慢,这就导致了CPU工作的时候。很可能需要花大量的时间来等待外存的存取过程

内存分为内存单元和内存地址

内存单元:

1)就类似于酒店里带有房间号的小房间。内存单元就是内存中带有地址的存储单元

2)如果计算机是“按字节编址”则每个存储的单元的大小为1字节,即1B,即8个二进制。如果字长为16位的计算机“按字编址”,则每个存储单元大小为一个字;每个字的大小为16个二进制位

ps:
按字节编址,是指存储空间的最小编址单位为字节。按字编制,是指存储空间最小编制单位为字。1字节=1B=8bit(位)。1字=n位(现在一字的字长普遍是16,32,64位(bit))

内存地址
内存地址用四位16进制或者8位16进制来表示区别。内存地址只是一个编号,代表的是以一个内存空间。而这个内存空间是整个储存空间储存的最小单位。

进程运行的基本原理

1)指令的工作原理

在这里插入图片描述
指令分为三个部分,第一个部分为指令的类型,第二,三个部分为指令的参数
比如第一个指令的第一部分是告诉CPU将数据传送到某个地址,而后面的参数就是将01001111的地址放在00000011这个内存地址里。第二个指令是加法指令,进行加一的操作,第三个指令是将处理好的数据放回到原来的地址

我们写的代码要翻译成CPU能识别的指令,这些指令会告诉CPU去内存里哪个地址存/取数据,这个数据需要进行什么样的操作。在这个例子中,指令中直接给出了变量的x的实际存放地址(物理地址)。但实际在生成机器指令的时候并不知道该进程的数据放在什么位置,所以编译生成的指令中一般是使用逻辑地址(相对地址)

2)逻辑地址vs物理地址:

逻辑地址:
①:就是在得到起始位置的情况下,在这个起始位置上,向前/向后推算若个地址(相对位置),得到的一个相对的地址
②:编译的时候只需要确定变量x存放的相对地址是100(也就是相对于进程在内存中的起始地址而言的地址)。CPU想要找到变量x在内存中的实际存放位置,只需要用进程内存起始地址+100即可
③:是CPU在运行时生成的,逻辑地址是相对于当前的进程的程序段而言的,是内部或编程使用的,并不唯一。

物理地址:
储存在内存中的绝对地址

3)从写程序到程序运行:编辑-编译-链接-装入

在这里插入图片描述
①编译:由编译程序将用户源代码编译成若干个目标模块–程序段,形成目标代码(编译就是将高级语言翻译成机器语言)。目标模块就是由高级语言翻译而成机器语言集合。这些目标模块在地址中是存放在逻辑地址中。然后通过链接,将若干个目标模块转入模块从而拥有完整的逻辑地址。然后由装入模块装入到内存中,最后CPU就可以开始运行该程序

②链接:由连接程序将多个目标模块,以及它们所需要的库函数链接在一起,放入到装入模块中。形成一个完整的逻辑地址

链接的三种方式:

第一种方式–静态链接
在程序运行之前,先将他们的目标模块及他们所需要的库函数连接成一个完整的执行文件(装入模块)

第二种方式–装入时动态链接
在装入的时候,一边装入再一边动态的进行链接

第三种方式–运行时动态链接·
在程序运行时需要该目标模块的时候,才对它进行链接。其优点在于便于修改和更新,便于实现目标模块的共享

③装入
装入程序将装入模块装入到物理内存中。装入模块的地址同样是根据逻辑地址进行定位的。要将它装入到内存中进行运行,就需要知道装入到内存中的哪个物理地址,并修改程序中地址相关的代码,让其逻辑地址转换为物理地址的过程,就称之为地址重定位,又称为地址映射。

装入的三种方式:绝对装入,静态重装入,动态重装入

绝对装入
在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码,装入程序按照装入模块中的地址,将程序和数据装入内存(当预先知道放入到哪个物理地址中的时候,编译程序生成该装入模块中的地址就是该物理地址,在装入程序进行装入的是就直接在对应的物理地址中装入程序和数据)
在这里插入图片描述
绝对地址只适用于单道程序环境

程序中使用的绝对地址,可在编译或汇编时给出,也可由程序直接给出。通常情况下都是在编译或汇编时再转换成绝对地址

静态重装入
又称可重定位装入。编译,链接后的装入模块的地址都是从0开始的(相对于当前程序段的0),指令中使用的地址,数据存放的地址都是相对于起始地址而言的逻辑地址。根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对地址进行“重定位”,将逻辑地址改为物理地址(地址变换是在装入的时候一次性完成的)。

在这里插入图片描述

在一个作业装入内存的时候,必须分配其要求的全部内存空间,如果没有足够的空间,就不能装入该作业。作业一旦装入到内存中的时候,程序在运行期就不能在移动,也不能在申请内存空间

动态重装入
又称动态运行时装入,编译,链接后的装入模块地址都是从0开始的,装入程序把装入模块装入内存中后,并不会立即把逻辑地址转换成物理地址,而是把地址转换推迟到程序真正运行的时候才进行。因此装入到内存后的地址依然是逻辑地址,这种方式需要一个重定位寄存器来支持

在这里插入图片描述
CPU从内存中拿取数据的时候,是拿到相对的地址与重定位寄存器中存放的地址相加,从而得出实际数据存放的位置
采用动态重定位时允许程序在内存中发生移动

小结:

在这里插入图片描述

1.2内存管理的概念

内存管理的内容:

①内存空间的扩充:
一款软件大小为60G,在程序运行时,需要将程序全部放入到内存中进行加载,而内存只有4G。此时操作系统就采用了虚拟技术进行扩充

②地址转换:
为了使编程方便,程序员写程序时只需要关注指令,数据的逻辑地址, 而逻辑地址到物理地址的转换(这个过程称为地址重定位)应该由操作系统来负责,这样成需要在写程序的时候就不需要再关注物理内存的实际情况

③存储保护
保护各个进程在内存中运行互不干扰

内存保护的两种方式:
方式一
在这里插入图片描述

方式二:

在这里插入图片描述

小结:
在这里插入图片描述

1.3覆盖与交换

问题产生于程序总大小超过物理内存大小。于是人们引入了覆盖技术进行解决

覆盖:

覆盖技术得思想:
将程序分为多个段(多个模块),常用的段常驻内存,不常用的段在需要时再调入内存

内存中分为一个“常驻区”和若干“覆盖区”
①需要常驻内存的段放在“固定区”中,调入后除非运行结束外不再调出

②不常用的段放在“覆盖区”,需要用到时调入内存,用不到时调出内存

在这里插入图片描述
注:这种覆盖技术,需要程序员声明某种覆盖结构,保证单个覆盖区满足想要驻与内存中段的最大大小。

交换技术:

设计思想:
内存空间紧张时,系统将内存中某些进程暂时调出到外存,把外存中某个具备某些运行条件得进程换入内存(进程在内存与磁盘动态调度)
在这里插入图片描述
在程序调出内存到磁盘的时候,PCB会留在内存中,用于记录状态,方便后面
根据PCB储存得进程信息再调回来

此时被引出三个问题
①应该在外存得什么位置保存被换出得进程
具有对换功能得操作系统中,通常把磁盘空间分为文件区以及对换区里两部分。文件区主要存放文件,主要追求储存空间得利用率,因此对文件区得管理采用离散分配方式。对换区空间只占磁盘空间得小部分,被换出得进程数据就被放在对换区。对于对换得速度直接影响系统的整体速度,因此对换区空间的管理主要追求换出换入速度,因此通常采用连续分配方式。总之,对对换区进行I/O操作比文件区要快

②什么时候应该交换
交换通常是进程很多而内存吃紧得时进行,而系统负荷降低就暂停。比如在许多进程运行时发现经常缺页,就说明内存紧张,此时就可以换出一部分内存。如果缺页率明显下降,就可以暂停换出

③应该换出哪些进程
可优先换出阻塞进程,可换出优先级低得进程,为了防止优先级低得进程在被调入内存后很快又被换出,有的系统还会考虑进程在内存中得驻留时间

小结:
在这里插入图片描述

1.4连续分配管理方式

连续分配:指为用户进程分配的必须是一个连续的内存空间

1)单一分配方式:
在单一连续配方式中,内存被分为系统区和用户区。系统区通常位于内存的低地址得部分,用于存放操作系统相关数据,用户区用于存放用户进程相关得数据。内存中只能有一道用户程序,用户程序独占整个用户区空间

优点
实现简单,无外部碎片,可以采用覆盖技术扩充内存。不一定需要内存保护

缺点:
只能用于单用户,单任务得操作系统中,有内部碎片,存储器利用率低

ps:内部碎片与外部碎片小知识
内部碎片
如果分配给某进程得内存区域中,有些部分没有用上,就是“内部碎片”

外部碎片
整块内存区域中,大部分内存都可以用上,但是剩下的很小部分,无法满足任意一个进程对于内存的需求。这部分因为过于细碎而无法利用的内存,就称为外部碎片。

2)固定分区分配
为了能在内存中装入多道程序,且这些程序之间不会相互干扰,于是将用户区空间划分为若干个固定大小的分区,每个分区只能放入一道作业,这样就形成了最早的,最简单的一种可运行多道程序得内存管理方式

有两种分配方式

①分区大小相等

特点

a:缺乏灵活性,但是很适合用于一台计算机控制多个相同的对象得场合

b:用户区空间划分为若干个相同大小的分区

②分区大小不等

特点
a:用户区空间划分为若干个不同大小的分区

b:增加了灵活性,可以满足不同大小得进程需求

缺点
当用户程序大到所有的分区都无法满足需求得时候,这就不得不采用覆盖技术来解决。但这就会降低系统的性能。另外这也会产生外部碎片,内存利用率降低

3)动态分区分配
动态分区分配又称可变分区分配。这种分配方式不会预先划分内存分区,而是进程被装入到内存的时候,根据进程的实际大小来划分分区,并使分区大小刚好适合进程得需要,因此分区的大小和数量是可以变化得

此时有三个问题:

①系统要用什么样得数据结构记录内存的使用情况

操作系统使用两种数据结构进行记录内存的使用情况

a:空闲分区表—每一个空闲分区对应一个表项,表项包括分区号,分区大小,分区起始地址,分区分配情况等

b:空闲分区链—每一个空闲分区得起始位置和末尾位置都分别设置了前向指针和后向指针。起始部分还可以设置分区的大小信息

②当很多分区都能满足需求的时候,该选择哪一个分区进行分配

把一个新作业装入内存时,须按照一定的动态分配分配算法,从空闲分区表(或空闲分区链)中选出一个分区分配给该作业。

③如何进行分区的分配和回收

在这里插入图片描述
a将一个大的分区分配给一个进程过后,将该分区得总大小减去进程所需要的内存大小,剩下得分区大小依然处于空闲状态

b多个相邻得空间释放后可以进行合并

c若回收区前后没有相邻得空闲分区,就会在空闲分区表中新增一个对应的表项

小结:

在这里插入图片描述

1.5动态分区分配方法

动态分区分配方法有四种算法方法可以实现:

①:首次适应算法
算法思想:每次都从低地址开始查找,找到第一个能满足需求得空闲分区

实现方式
空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区连(或空闲分区表),知道找到一个能满足大小需要得空闲分区

②:最佳适应算法:

算法思想:
由于动态分区分配是一种连续分配的方式,为各进程分配的空间是一片连续的区域。因为为了保证“大进程”到来的时候能有连续的大片空间,所以尽可能地留下大片的空闲区域,即,优先选择更小地空闲区

实现方式
空闲分区以容量递增的次序排列。每次分配内存时顺序查找空闲分区连(或空闲分区表),知道找到一个能满足大小需要得空闲分区

与首次适应算法不同的是,首次适应算法空闲的分区是按照地址递增的方式进行排序,而最佳适应算法是按照容量递增的顺序进行排序的。

③最坏适应算法:

算法思想:
为了解决最佳适应算法的问题–留下太多难以利用的小外部碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小

实现方式
空闲分区以容量递减的次序排列。每次分配内存时顺序查找空闲分区连(或空闲分区表),知道找到一个能满足大小需要得空闲分区

④临近适应算法

算法思想
首次适应算法每次都要从链头开始查找,这可能会导致低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。如果每次都从上次查找结束的位置开始检索,就能解决上述问题。

实现方法
空闲分区以地址递增的次序排列(可排成一个循环链表)。每次分配内存时从上次查找结束的位置开始找空闲分区连(或空闲分区表),知道找到一个能满足大小需要得空闲分区

小结:
在这里插入图片描述

1.6基本分页存储管理的基本概念

非连续分配:为用户进程分配的可以是一些分散的内存空间

分页存储的实现:
①把内存分为一个个大小相等的小分区,再按照分区大小把进程拆分成一个个小部分。
②将内存空间分为一个个大小相等的分区(比如:每个分区4kb),每个分区就是一个页框”,或称“页帧”,“内存块”,“物理块”。每个页框都有一个编号,即“页框号”,页框号从0开始
在这里插入图片描述

③将用户进程的地址空间也分为与页框大小相等的一个个区域,称为“页”或“页面”。每个页面也有一个编号。即“页号”,页号也是从0开始的
在这里插入图片描述

如何计算离散分配的物理地址

首先需要算出逻辑地址对应页号和偏移量

1)页号:逻辑地址/页面长度(取除法的整数部分

也要知道该页号对应页面在内存中的起始地址:

为了能知道进程的每一个页面在内存中存放的位置,操作系统要为每一个进程建立一张页表

在这里插入图片描述
a:页表项中块号对应的就是内存页框号
b:第M号内存块的起始地址就是M*内存块大小

在这里插入图片描述
这里的页号说是隐含的,是指代表页号所用的字节是隐含的(不用字节来表示,通过页号数与页面大小就可以计算出代表页号的字节地址),因为页表中的各页表项是从页表在内存中起始地址X开始依此存放的。知道该页号数和页面大小,就可以计算出页号的相对于页表存放的地址。

2)偏移量=逻辑地址%页面长度(取除法的余数部分

3)物理地址=页面地址+页内偏移量

小结
在这里插入图片描述

1.7基本地址变换机构

基本地址变换机构(是一组硬件机构)可以借助进程的页表将逻辑地址转换为物理地址
通常会在系统中设置一个页表寄存器,存放页表在内存中的起始地址F和页表长度M。程序未执行的时候,页表的起始地址和页表长度放在进程控制块(PCB)中,当进程被调度,操作系统内核会把它们放到页表寄存器中

在这里插入图片描述
设页面大小为L,逻辑地址A到物理地址E的变换过程如下

①计算页号P和页内偏移量W(如果用十进制数手算,则P=A/L,W=A%L;但是在计算机实际运行时,逻辑地址是固定不变的,因此计算机硬件可以更快的得到二进制表示的页号,页内偏移量)

②比较页号P和页表长度M,若P>=M,则产生越界中断,否则继续放行(注意:页号是从0开始得,而页表长度至少是1,因此P=W也会发生越界)

③页表中页号P对应的页表项地址=页表起始地址F+页号P*页表项长度,取出该页表项内容B。即为内存块号(注意区分页表项长度,页表长度,页面大小得区别。页面长度指的是这个页表中总共有几个页表项,即总共有几个页;页表项长度指的是页表项占多大的存储空间,页面大小指的是一个页面占多大的存储空间)

④计算E=b*L+W,用得到的物理地址去访问(如果内存块号,页面偏移量使用二进制表示得,那么把二者拼接起来就是最终的物理地址了)

在这里插入图片描述

小结:
在这里插入图片描述

1.8具有快表的地址变换机构

小知识补充

局部性原理
局部性原理分为时间局部性和空间局部性

1)时间局部性
如果执行了程序中某条指令,那么不久后这条指令很可能再次运行,如果某个数据被访问过,不久后这条数据很可能再次被访问(因为程序内存在大量的循环)

2)空间局部性
一旦程序访问了某个单元没在不久之后,其附近得存储单元也很可能被访问(因为很多数据在内存中都是连续存放的)

什么是快表(TLB)
快表又称联想寄存器(TLB),是一种访问速度比内存快很多的高速缓冲存储器。用来存放当前访问的若干页表项,以加速地址变换的过程。依此对应,内存中的页表称为慢表。

在这里插入图片描述
引入快表后,地址得变换过程
①:CPU给出逻辑地址,由某个硬件算得页号,页内偏移量。将页号与快表中的所有页号进行比较

②:如果找到匹配得页号,说明要访问的页表项在快表中存在副本,则直接从中取出该页得内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后,访问该物理地址所对应的内存单元,因此,若快表命中,则访问某个逻辑地址进需要一个访存就好了

③:若没有找到匹配的页号,则需要访问内存中得页表,找到对应的页表项,得到页面存放的内存块号,再将内存块号与页内偏移量拼接形成物理地址。最后,访问该物理地址所对应得内存单元。因此若快表没有命中,则访问某个逻辑地址需要两次访存(注意:在找到页表项后,应同时将其存入到快表之中,以便后面进行访问。但若快表已满,则必须按照一定得算法对旧的页表项进行更换)

④:由于查询快表得速度比查询页表的速度快很多,因此只要快表命中,就可以节省很多时间

在这里插入图片描述
小结:
在这里插入图片描述

1.9两级页表

单级页表存在什么问题,如何解决

1)页表必须连续存放,因此当页表很大的时候,需要占用很多个连续的页框
可以将长长的页表项分组,使每个内存块刚好可以放入一个分组

2)没必要让整个页表存放在内存中,因为进程在一段时间内可能只需要访问某几个特定的页面

在这里插入图片描述

两级页表的原理,逻辑地址结构:
在这里插入图片描述
如何实现地址变换
1)按照地址结构将逻辑地址拆分为三部分

2)从PCB读出页目录表始址,再根据一级页号查询页目录表,找到下一级页表在内存中存放的位置

3)根据二级页目录号查表,找到最终想访问的内存块号

4)结合页内偏移量得到物理地址

两级页表问题需要注意几个细节
在这里插入图片描述
小结:
在这里插入图片描述

1.10基本分段存储管理

什么是分段(类似于分页管理中的“分页”)
进程的地址空间:按照程序自身的逻辑卦划分为若干个段。每一个段都有一个段名(在低级语言中,程序员使用段名来编程),每段从0开始编址

内存分配规则:以段为单位进行分配,每个段在内存中占据连续的空间,但各段之间可以不相邻

在这里插入图片描述
分段系统的逻辑的地址是由段号(段名)和段内地址(段内偏移量)所组成

在这里插入图片描述

  • 段号的位数可以决定进程最后可以有多少个段
  • 段内地址位数决定了每个段的最大长度是多少
  • 段名(函数名)会被编译程序翻译为对应的段号,段号会被编译程序翻译成对应的段内地址(段内偏移量)

什么是段表(类似于分页管理中的“页表”)

  • 程序分为多个段,各段离散的装入内存,为了保证程序的正常的运行,就必须在物理地址找到各个逻辑地址的存放位置。为此,为此,需要为每个进程建立一个段映射表,简称“段表”

  • 每一个段对应一个段表项,其中记录该段在内存中的起始位置(又称“基址”)和段的长度

  • 各个段表项的长度相同:
    例如,某系统按字节寻址,采用分段存储管理,逻辑地址为(段号16位,段内地址16位),因此用16位可以表示最长的段长。物理内存大小为4GB(可用32位表示整个物理内存地址空间)。因此可以让每个段表项占16+32=48位,即6B,由于段表项长度相同,因此段号可以是隐含的,不占存储空间。若段表存放的起始地址为M,则K号对应的段表项存放的地址为M+K*6

如何实现地址变换:
LOAD 1,[D]|< A > ; ( 将分段D中A单元的值读入寄存器1)这条指令经过编译程序编译后,形成等价的指令:取出段号为“2”,段内地址为1024的内存单元z中的内容。放到寄存器1中。CPU执行指令的时候需要将逻辑地址转换成物理地址,机器指令中的逻辑地址使用二进制表示:0000000000000010 0000000100000000

进程切换的时候,相关的内核程序负责恢复该进程的运行环境

此时会恢复段表寄存器,段表寄存器中存放着进程段表起始地址F,以及段表长度M。段表起始地址与段表长度在进程没有上CPU运行的时候,是存储在PCB中。当进程开始运行上处理机运行的时候,是被放在段表寄存器当中。

在这里插入图片描述
分段,分页管理对比
一.分页的目的
1.页是信息的物理单位,分页的主要目的是为了实现离散分配,提高系统利用率。分页仅仅是系统管理上的需要。完全是系统行为,对用户不可见。

2.段是信息的逻辑单元,分段的主要目的是更好的满足用户需求。一个段通常包含着一个组属于一个逻辑模块的信息。分段对用户式可见的,用户编程时需要显示的给出各个函数名(段名)

二.地址空间的维度
1.分页的用户进程地址空间是一维的,程序员只需给出一个记忆符号即可表示一个地址。

2.分段的用户进程地址空间是二维的。程序员在标识一个地址时,既要给出段名,也要给出段内地址

三.页的大小是否固定
1.页的大小是由系统决定的,是固定的。

2.段的长度却不固定,取决用户编写的程序

分段比分页更实现信息的共享和保护:

在这里插入图片描述

不能被修改的代码称为纯代码或可重入代码(不属于临界资源),这样的代码是可以共享的,可修改的代码是不可以被共享的(比如,有一个代码中有很多的变量,各进程并发的访问可能造成数据的不一致)

在这里插入图片描述

ps:与分页系统类似,分段系统中也可以引入快表机构,将近期访问过的段表项放到快表中,这样就可以少一次访问,加快地址变换的速度

分段管理与分页管理的区别
在这里插入图片描述

小结:

在这里插入图片描述

1.11段页式管理方式

分页,分段管理中的最大的缺点
在这里插入图片描述

分段+分页的组合(段页式管理方式)
在这里插入图片描述

段表,页表

段页式管理的逻辑地址结构

在这里插入图片描述

  • 段号的位数决定了每个进程最多可以分为几个段
  • 页号位数决定了每个段最大有多少页
  • 页内偏移量决定了页面大小,内存块大小多少

“分段”是对用户是可见的,程序员需要在编程的时候显示给出段号,段内地址。而将各段“分页”对用户是不可见的。系统会根据段内地址自动的划分页号页页内偏移量。因此,段页式管理的地址结构是二维的。

在这里插入图片描述
如何实现地址变换
在这里插入图片描述
小结:
在这里插入图片描述

2.1虚拟内存的基本概念

传统存储管理方式得特征,缺点
一次性:作业必须一次性全部装入内存后才能开始运行,这会造成两个问题:

  • ①作业很大的时候,不能全部装入内存,导致大作业无法运行
  • ②当大作业要求的时候,由于内存无法容纳所有作业,因此只有少量作业能运行,导致多道程序并发程度下降

驻留性:一旦作业被装入到内存中,就会一直驻留在内存中。知道作业运行结束。事实上在一个时间段内,只需要访问作业得一小部分数据即可正常运行。这就导致了内存中会驻留大量得,暂时用不到得数据,从而浪费大量的数据

局部性原理:

  • 时间局部性:如果执行了某条程序中得某条指令,那么不久后这条指令很可能再次执行;如果某条数据被访问过,不久之后该数据很可能再次被访问(因为程序中存在大量得循环)
  • 空间局部性:一旦程序访问了某条存储单元,在不久之后,其附近的存储单元也很可能被访问

高速缓存技术:
将近期会频繁访问到的数据放到更高速得存储器中,暂时用不到的数据,放到更低速得存储器中

在这里插入图片描述
虚拟内存的定义和特征:
定义
操作系统的虚拟性:实际的物理内存没有变化,只是进行了逻辑上的扩充

  • 基于局部性的原理,在程序装入的时候,可以将程序很快就是使用到的部分装入到内存中,暂时用不到的部分留在外存中,就可以让程序并发的执行。

  • 在程序执行得过程中,当所访问得信息不在内存时,由操作系统负责将所需信息从外存调到内存之中,然后继续执行

  • 若内存空间不够,由操作系统将暂时用不到得信息调出到外存中

在这里插入图片描述

虚拟内存的三个特征

  • 多次性:无需在作业运行时一次性全部装入内存,而是允许多次调入内存
  • 对换性:在作业运行时无需一直常驻内存,而是允许作业在运行的过程中,将作业换出,换入
  • 虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量

如何实现虚拟内存技术:
虚拟内存技术,允许程序分多次调入内存,如果采用连续分配方式,会不方便实现,因此,虚拟内存的实现需要建立在离散分配的内存管理方式基础上

实现方式:
在这里插入图片描述
小结:
在这里插入图片描述

2.2请求分页管理方式

请求分页管理与基本分页管理的区别:

  • 当程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入到内存,然后程序继续执行(操作系统要提供调页功能,将缺失页面从外存调入到内存)
  • 若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出外存中(操作系统要提供页面置换的功能,将暂时用不到的页面换出外存)

请求分页的管理方式:
1.页表机制:

  • 与基本分页管理相比,请求分页管理中,为了实现“请求调页”,操作系统需要知道每个页面是否已经调入到内存;如果还没有调入,那么也需要知道该页面在外存中存放的位置

  • 当内存空间不够的时候,要实现“置换功能”操作系统需要通过某些指标来决定到底换出哪些页面。有的页面没有修改过,就可以将它写回外存。有的页面修改过,就需要将外存中的旧数据覆盖,因此,操作系统也需要记录各个页面是否被修改的信息

在这里插入图片描述

2.缺页中断机构:
作用以及特点

  • 在请求分页系统中,每当要访问的页面不在内存的时候,便产生一个缺页中断,然后由操作系统的缺页中断处理程序处理中断
  • 此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,返回就绪队列
  • 如果此时内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表中相应的页表项
  • 如果内存中没有空闲块,则由页面置换算法选择一个页面进行淘汰,若该页面在内存期间修改过,则要将其写回外存,未修改过的页面不用写回外存
  • 缺页中断属于内中断中的故障类型的中断

3.地址变换机构:
步骤

补充细节

  • 只有“写指令”才需要修改“修改位”,并且一般只需要修改修改快表中的数据,只有要将快表项删除时才需要写回内存中的慢表。这样可以减少访存内存
  • 和普通的中断处理一样缺页中断处理依然需要保留CPU的现场
  • 需要用某种“页面置换算法”来决定一个页面的换出
  • 换入/换出页面都需要启动慢速的I/O操作,如果换入/换出太频繁,系统会有很大的开销
  • 页面调入到内存后,需要修改慢表,同时也需要将页表项复制到快表中

小结:
在这里插入图片描述

2.3页面置换算法

1)最佳置换算法(OPT)
每次选择淘汰的页面将是以后永不使用,或者在最长时间内不在被访问的页面,这样可以保证最低的缺页率

在这里插入图片描述
最佳值换算法可以保证最低的缺页率,但实际上,只有在进程执行的过程中才能知道接下来会访问到的是那个页面,操作系统无法预先预判页面的访问的序列,因此,最佳置换算法是是无法实现的

  • 缺页率的计算:缺页的次数,除以总访问的次数

2)先进先出置换算法(FIFO):
每次选择淘汰的页面都是最早进入内存的页面

实现方法:把调入内存的页面根据先后顺序排成一个队列,需要换出页面的时候选择队头页面就好了。

在这里插入图片描述
当系统为进程分配的内存块从3块变成4块的时候,却缺页次数却从9次变为了10次,这种现象就叫做Belady异常–当为进程分配的物理块数增大时,缺页次数却出现了不减反增的现象

只有FIFO算法会产生Belady异常,另外,FIFO的算法实现简单,但是与进程实际运行的规律不符,最先调入的页面也有可能是经常访问到的页面

3)最近最久未使用置换算法(LRU)
每次淘汰的页面都是最近最久未使用的页面
在这里插入图片描述

4)时钟置换算法(CLOCK)

是一种性能和开销较均衡的算法,又称CLOCK算法,或最近未用算法(NRU)

简单的CLOCK算法实现方法

为每一个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个队列,当某页被访问的时候,其访问位置为1,当需要淘汰一个页面的时候,只需检查页面的访问位,如果是0,就选择该页换出。如果为1,则将它置为0,暂不换出,继续检查下一个页面。若第一轮扫描后的页面都是1,则将这些页面的访问位一次置为0后,再进行第二次扫描(第二轮扫描中一定会由访问位为0的页面,因此简单的Clock算法选择淘汰一个页面最多会经过两轮扫描)

5)改进型的时钟置换算法
简单的时钟置换算法仅考虑到一个页面最近是否被访问过,事实上,如果被淘汰的页面没有被修改过,就不需要通过I/O操作写回到外存,只有被访问的页面修改过的时候,才需要写回外存

因此除了慨率一个页面最近有没有被访问的情况,也需要考虑该页面最近有没有被修改过,再其他条件相同的时候,应该先淘汰没有修改过的页面,避免I/O操作(修改位为1,表示页面修改过。修改位为0表示页面没有修改过。)

在这里插入图片描述

小结:
在这里插入图片描述

2.4页面分配策略

1.驻留集
特点

  • 指请求分页存储管理中给进程分配的物理块的集合
  • 在采用了虚拟存储技术的系统中,驻留集的大小一般都小于进程的总大小的
  • 若驻留集太小,会导致频繁的缺页,系统要花大量的时间来处理缺页,实际用于进程推进的时间就变少了,驻留集太大,又会导致多道程序并发度下降。资源利用率低.

固定分配:操作系统为每一个进程分配一组固定数目的物理块,再进程运行期间不在改变,即,驻留集大小不变。

可变分配:先为每一个进程分配一定数目的物理块,再进程运行期间,可根据情况做适当的增加和减少。即,驻留集大小可变

局部置换:发生缺页的时候只能选择进程自己的物理块进行置换

全局置换:可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配给缺页的进程

2.页面分配,置换策略

1)固定分配局部置换

系统为每个进程分配一定数量的物理块,在整个运行期间不表,若进程在运行中发生缺页,则只能在该进程的内存中得页面中选出一页换出,然后再调入需要的页面。

缺点:很难在刚开始就确定应为每个进程分配多少物理块才合理

2)可变分配全局替换:
刚开始会为每一个进程分配一定数量得物理块,操作系统会保持一个空闲物理块队列。当某一个进程发生缺页的时候,从空闲物理块中取出一块分配给该进程。若没有空闲物理块,则可选择一个未锁定的页面换出外存,再将物理块分配给缺页的进程。采用这种策略时,只要某进程发生缺页的时候,都将获得新的物理块。仅当空闲物理块用完时,系统才选择一个未锁定的页面调出。被选择调出的页可能是系统中任何一个进程中的页,因此这个被选中的进程拥有的物理块都会减少,缺页率会增加

系统会锁定一些页面,这些页面不能置换到外存(如程序的内核数据可以被设定为”锁定“)

特点:只要进程缺页就会获得新的内存物理块

3)可变分配局部替换:
刚开始会为每一个进程分配一定数量的物理块,当某进程发生缺页的时候,只允许从该进程自己的物理块中选出一个进行换出外存。如果该进程在运行中频繁的缺页,系统就会为该进程多分配几个物理块。直至该进程缺页率趋于适当程度。反之,若该进程在运行的过程中缺页率特别低,则可适当减少分配给该进程的物理块

特点:根据进程的缺页率来决定增加或减少内存物理块

3.调入页面的时机:

1)预调页策略:
根据局部性的原理,一次调入若干个相邻的页面可能比一次调入一个页面更高效,但如果提高调入的页面中大多数都没有被访问过,则又是低效的。因此可以预测不久后可能访问的页面,将他们预先调入内存。但目前的成功率只有50%。故这种策略只能适用于进程初次调用的时候,由程序员指出应该先调入哪些部分

2)请求调页策略:
进程在运行的过程中发现缺页才将所缺页面调入内存,由这种策略调入的页面一定会被访问到,但由于每次只能调入一页,而每次调页都要磁盘I/O操作,因此I/O开销较大

4.从何处调页:
第一种方式
系统拥有足够的对换区空间:页面的调入,调出都是在内存与对换区之间进行,这样可以保证页面的调入,调出速度很快。在进程运行前,需要将进程相关的数据从文件区复制到对换区

在这里插入图片描述

第二种方式
系统缺少足够的对换区空间:凡是不会被修改的数据都直接从文件区调入,由于这些页面不会被修改,因此换出时不必写回磁盘,下次需要的时候再从文件区调入即可。对于可能被修改的部分,换出时需写回磁盘对换区,下次需要的时候再从对换区调入

在这里插入图片描述

第三种方式
UNIX方式:运行之前进程有关的数据全部放在文件区,故未使用的页面,都可从文件去调入。若被使用过的页面需要换出,则写回对换区,下次需要时从对换区调入

在这里插入图片描述

5.抖动(颠簸)现象
刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,。这种频繁的页面调度行为就被称为抖动或颠簸。产生抖动的主要原因是因为进程频繁访问的页面高于可用的物理块数(分配给进程的物理块数不够)

为进程分配的物理块太少,会使进程发生抖动的现象,为进程分配的物理块太多,又会降低系统整体的并发度,降低某些资源的利用率

6.工作集
工作集就是为了解决抖动这个问题而产生的

工作集:指在某段时间间隔内,进程实际访问页面的集合。

在这里插入图片描述

一般来说,驻留集的大小不能小于工作集大小。否则进程在运行的过程中会频繁的缺页

小结
在这里插入图片描述

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值