操作系统(三)存储器管理

3.1 存储器管理概述

一、存储器管理

  1. 内存描述
    • 内存也称主存,是指CPU能直接存取指令和数据的存储器。
    • 内存在计算机系统中的地位

  1. 存储器管理的主要功能

    • 主存空间的分配与回收
    • 地址变换
    • 主存空间的共享
    • 主存空间的保护
    • 主存空间的扩充
  2. 存储器的层次

二、地址转换

  1. 用户程序的主要处理阶段
    • 编辑
    • 编译
    • 连接
    • 装入
    • 运行

  1. 有关概念
    • 逻辑地址:也叫相对地址、用户地址。逻辑地址是程序中编程使用的。实际中C语言的指针,读取指针变量的值,实际上这个值是逻辑地址,是相对于当前进程数据段的地址。
    • 物理地址:也叫绝对地址、内存地址。是最终加载到内存地址寄存器中的地址,内存单元的真正地址。编号从0开始一直到物理内存的最大值,映射到实际的内存条上。
    • 逻辑地址空间:也称用户地址空间或相对地址空间,是由程序中逻辑地址组成的地址范围,逻辑地址空间大小(即最大可寻址空间)由系统总线中地址总线的宽度决定。
    • 物理地址空间:也称内存地址空间或绝对地址空间,是由内存中一系列存储单元限定的地址范围,由实际的物理内存大小决定。
    • 重定位:程序和数据装入内存时,需对目标程序中的逻辑地址进行修改,把程序数据中的逻辑地址转变为实际内存存放的物理地址的过程称作重定位。
    • 重定位方式:分为静态重定位和动态重定位
    • 系统总线:又称内总线或板级总线,是用来连接微机各功能部件从而构成一个完整系统的。常说的微机总线就是指系统总线,如ISA总线、EISA总线、PCI总线等。
    • 系统总线上传送的信息包括数据信息、地址信息、控制信息,所以包含有三种不同功能的总线,即数据总线DB、地址总线AB和控制总线CB。
    • 数据总线DB用于传送数据信息。实现CPU和存储器或I/O接口等其它部件间的数据通信。数据总线的位数也代表微型计算机的处理性能,称为字长。
    • 地址总线AB是用来传送地址的,地址只能从CPU传向存储器或I/O端口。地址总线的位数决定了CPU可直接寻址的内存空间大小,比如32位地址总线可寻址空间为4GB的位址。
    • 控制总线CB用来传送控制信号和时序信号。如读写信号、中断响应信号、中断申请信号、复位信号等。
  2. 程序连接的方式
    • 1)静态链接:在程序装入内存之前,先将各目标模块及所需的库函数链接成一个完整的可执行程序(外存上会形成可执行文件),以后不再拆开。
    • 2)装入时动态链接:将用户源程序编译后得到一组目标模块,在装入内存时,釆用边装入边链接的链接方式(在外存上不会形成可执行文件)。
    • 3)运行时动态链接:对某些目标模块的链接,是在执行中需要该目标模块时,才对它进行的链接。其优点是便于修改和更新,便于实现对目标模块的共享。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UaJaraWS-1609837286080)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20201217155332279.png)]

  1. 程序装入内存

    扫描二维码关注公众号,回复: 12397347 查看本文章
    • 绝对装入:在编译时,如果知道程序将驻留在内存的某个位置,编译程序将产生基于绝对地址的目标代码。绝对装入程序按照装入模块中的设定地址,直接将程序和数据装入指定内存。由于程序中的逻辑地址与实际内存地址完全相同,故不需对程序和数据的地址进行修改。

      绝对装入方式只适用于单道程序环境。程序中所使用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。而通常情况下在程序中釆用的是符号地址,编译或汇编时再转换为绝对地址。

    • 可重定位装入方式:在多道程序环境下,多个目标模块的起始地址通常都是从0开始,程序中的其它地址都是相对于起始地址的,此时应釆用可重定位装入方式。根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对目标程序中指令和数据的逻辑地址一次性变为物理地址的修改过程称为重定位,地址变换通常是在装入时一次完成的,所以又称为静态重定位。

      静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。此外,作业一旦进入内存后,在整个运行期间不能在内存中移动,也不能再申请内存空间。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udaY87i1-1609837286082)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20201217155517914.png)]

    • 动态运行时装入方式:动态运行时装入,也称为动态重定位,程序在内存中如果发生移动,就需要釆用动态的装入方式。装入程序在把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到进程执行时才进行。因此,装入内存后的所有地址均为相对地址。这种方式需要重定位寄存器的支持。

      动态重定位的特点是可以将作业分配到不连续的存储区中,在进程运行之前可以只装入它的部分代码即可投入运行,然后在进程运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-87PZz8LM-1609837286084)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20201217155822877.png)]

三、地址保护

​ 系统内多道并发,内存属于共享状态,为实现存储保护,需要进程执行时所访问的内存属于自己的合理空间,这就要实现内存地址保护,也就是进行地址越界检查。主要有两种方式:

  1. 对于静态重定位方式:
    在处理器中设置“下界寄存器”和“上界寄存器”。当一个已经装入主存储器的进程得到处理器运行时,进程调度计算得到该进程的上界地址(起始地址)和下界地址(最大地址),分别送入上界寄存器和下界寄存器中。处理器执行该进程的指令时,将处理器的物理地址分别与上界寄存器和下界寄存器进行比较,确定是否越界,越界则为地址越界,出错。如果不越界,则访问相应内存单元。

  2. 对于动态重定位方式:
    在处理器设置设置“基址寄存器”和“限长寄存器”。当一个已经装入主存储器的进程得到处理器运行时,进程调度计算得到该进程的长度和起始地址,分别送入限长寄存器(也叫界限寄存器)和基址寄存器(也叫重定位寄存器)中。处理器执行该进程的指令时,首先将逻辑地址与限长寄存器的值作比较,确定是否越界,越界则为地址越界,出错。如果不越界,再将逻辑地址与基址寄存器运算得到实际的物理地址,然后通过地址总线找到对应的内存单元读取指令或数据。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OM4RggqI-1609837286086)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20201217160012869.png)]

四、覆盖与对换

  1. 覆盖技术:主要用在早期操作系统中(内存 <64KB),可用存储空间受限,某些大作业不能一次全部装入内存,产生了大作业与小内存的矛盾。这时把一个程序划分为一系列功能相对独立的程序段,让执行时不要求同时装入内存的程序段组成一组(称为覆盖段),共享主存的同一个区域,这种内存扩充技术就是覆盖

    • 程序段先保存在磁盘上,当有关程序段的前一部分执行结束,把后续程序段调入内存,覆盖前面的程序段(内存“扩大”了)。
    • 一般要求作业各模块之间有明确的调用结构,程序员要向系统指明覆盖结构,然后由操作系统完成自动覆盖。
    • 缺点:对用户不透明,增加了用户负担。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vMi2k1oI-1609837286088)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20201217160252176.png)]

  1. 对换技术:是指将暂时不用的某个进程及数据(首先是处于阻塞状态优先级最低的)部分(或全部)从内存移到到外存(备份区或对换区)中去,让出内存空间,同时将某个需要的进程调入到内存中,让其运行。交换到外存的进程需要时可以被再次交换回(选择换出时间最久的)内存中继续执行。

    • 对换的类型:1)整体对换:进程对换,使用中级调度。

      ​ 2)部分对换:页面对换/分段对换,使用虚存存储。

    • 对换空间的管理:具有对换功能的OS中,通常把外存分为文件区和对换区。前者用于存放文件,后者存放从内存换出的进程。对换区比文件区侧重于对换速度。因此对换区一般采用连续分配。

    • 进程的换出换入:

      1)选择换出进程:优先级,进程状态

      2)选择换入进程:优先级,进程状态,换出时间等[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D6HafRjc-1609837286090)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20201217160412205.png)]

  2. 覆盖与对换技术的区别:覆盖与对换技术是在多道环境下扩充内存的两种方法。覆盖与对换可以解决在小的内存空间运行大作业的问题,是“扩充”内存容量和提高内存利用率的有效措施。覆盖技术主要用在早期的OS中,对换技术则用在现代OS中。主要区别为:

    1)覆盖可减少一个进程运行所需的空间。对换可让整个进程暂存于外存中,让出内存空间。

    2)覆盖是由程序员实现的,操作系统根据程序员提供的覆盖结构来完成程序段之间的覆盖。对换技术不要求程序员给出程序段之间的覆盖结构。

    3)覆盖技术主要在同一个作业或进程中进行。对换主要在作业或进程之间进行。

3.2 分区存储管理

在存储管理中涉及到两个问题:

  • 1、是否要把作业全部(一次性)装入内存,分为两种:

    • 1)全部(一次性)装入:非虚拟存储
    • 2)部分(多次性)装入:虚拟存储
  • 2、装入内存时是否要放在内存连续地址空间,分为两种:

    • 1)连续分配:必须放在内存连续的地址空间
    • 2)不连续分配:可以放在内存不连续的地址空间

    采用全部装入和连续分配,进程执行时速度快、效率高,采用部分装入和非连续分配都是为了进一步提高内存的利用率,使有限的内存装入更多更大的作业。

3.2.1 单一连续分区存储管理

一、单一连续分区存储管理的基本原理

  • 是一种最简单的存储管理方式,在早期的单道批处理系统中使用这种管理方案。

  • 采用这种管理方案时,内存被分成两个区域,一个是系统区域,仅供操作系统使用,可以驻留在内存的低地址部分,也可以驻留在高地址部分(通常设置在内存的低端);另一个是用户区,它是除系统区以外的全部内存区域,这部分区域是提供给用户使用的区域,任何时刻主存储器中最多只有一个作业,作业放在从用户区起始地址开始的连续地址区域。所以,单用户连续存储管理只适用于单用户的情况。

二、单一连续分区存储管理的地址变换与地址保护

单一连续分区使用静态重定位,不需要专门硬件进行地址变换,但是会有硬件保护机构,以确保不干扰系统区中的信息,方法有:

  • 1)上界寄存器和下界寄存器:上界寄存器和下界寄存器中存放用户区的起始地址和终止地址,运行时检查指令或数据的地址,若不在上界寄存器和下界寄存器的范围内,则发生越界中断。

  • 2)内核态(系统态/管态)与用户态(目态)工作:如果当前在用户态下工作,内存访问时对硬件进行校验,以保证系统区不被访问,如果系统区被访问则产生中断,控制权交给操作系统。在内核态下工作,能访问整个存储空间。用户态是用户进程的工作方式,而系统态是系统进程的工作方式。

  • 3)不做特别管理:如MS-DOS等单用户单任务微机操作系统。

三、单一连续分区存储管理的管理特点

  • 管理简单。容易记住存储器的状态,不是全部空闲就是全部已分配;当作业被调度时就获得全部用户空间;全部主存空间都分配给一个作业使用;作业运行完后,全部主存空间又恢复成空闲(以上所指的全部主存空间是用户区空间)。

  • 资源利用率低。存储器没有得到充分利用,作业的大小与存储器的可用空间的大小不一定一致,作业的全部信息都装入主存,占用主存空间。处理机的利用率较低,因为是单道处理,一旦一个作业提出I/O请求,则CPU空闲。

  • 不支持覆盖技术、对换技术、虚拟存储等技术,作业地址空间大于内存可用空间就无法运行。

3.2.2 固定分区存储管理

一、固定分区存储管理的基本原理

  • 固定分区分配是是将内存用户空间划分为若干个固定大小(不是相等大小)的区域,在每个分区中只装入一道作业,放在该分区起始地址开始的连续地址区间内。

  • 用户空间划分为几个分区,便允许有几道作业并发运行。当有一空闲分区时,便可以从外存的后备作业队列中选择一个适当大小的作业装入该分区,当该作业结束时,又可再从后备作业队列中找出另一作业调入该分区。

  • 实际上每一个分区就相当于一个单用户连续分配区间。

  • 固定分区分配很少用于现在的操作系统中,但在某些用于控制多个相同对象的控制系统中仍发挥着一定的作用。

二、固定分区的分区划分

  1. 分区大小相等,即所有的内存分区大小相等。
  • 这种方式的缺点是缺乏灵活性,当作业太小时,会造成内存空间的浪费;当作业太大时,一个分区又不足以装入,致使作业无法运行。这种划分方式常被用于利用一台计算机控制多个相同对象的场合,因为这些对象所需的内存空间是大小相等的。例如,炉温群控系统,就是利用一台计算机去控制多台相同的冶炼炉。
  1. 分区大小不等。
  • 为了克服分区大小相等而缺乏灵活性的这个缺点,可把内存区划分成含有多个较小的分区、适量的中等分区及少量的大分区。这样,便可根据作业的大小为之分配适当的分区。

三、固定分区中主存空间的分配与回收

  1. 分区分配表:为便于内存分配,通常将分区按大小排队,并为之建立一张分区分配表,其中包括每个分区的起始地址、大小及状态(是否已分配)。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gcgJo1dz-1609837286091)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20201217161224987.png)]

  2. 主存空间分配:当有用户作业要装入内存时,便检索该表,以找到合适的分区给予分配,并将其状态置为“已分配”;未找到合适分区则拒绝为该用户作业分配内存。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JcHDmigk-1609837286092)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20201217161238256.png)]

四、固定分区中的地址转换与存储保护

  • 固定分区存储管理实际中可采用可重定位装入(静态重定位)方式,也可采用运行时动态装入(动态重定位)方式

  • 1、静态重定位方式:装入内存后所有地址转换为物理地址,通过上界寄存器和下界寄存器进行地址保护。

  • 2、动态重定位方式:装入内存后地址仍然是逻辑地址,通过限长寄存器和基址寄存器进行地址转换和地址保护。在执行的时候,首先将逻辑地址与限长寄存器的值作比较,确定是否越界,越界则出错。不越界时再与基址寄存器的值运算转换为物理地址,然后通过地址总线找到对应的内存单元读取指令或数据。
    在这里插入图片描述

五、固定分区中的管理特点

  • 作业长度不能大于分区的大小,一个分区只能装入一个作业,一个作业只能装入一个分区。

  • 无外部碎片,有内部碎片(一个分区会有剩余空间),作业大小比分区大小越小时,内部碎片越大,空间比较浪费。

  • 分区的数量限制了作业的个数。

3.2.3 可变分区存储管理

一、可变分区存储管理的基本原理

  • 可变分区分配是一种动态划分内存的方法。这种方法不预先将内存划分分区,而是在作业装入内存时,根据作业大小动态进行内存分配,并使分配的内存空间大小正好适合进程的需要。在不断的分配回收过程中,系统中分区的大小和数目是不断变化的。

  • 动态分区在开始分配时是比较好的,但随着时间的推移,内存中可能会产生越来越多的小的空闲内存块,内存利用率下降。这些小的空闲内存块称为外部碎片,与固定分区中的内部碎片正好相对。

  • 克服外部碎片可以通过紧凑技术来解决,就是系统对进程进行移动和整理。这需要动态重定位的支持,比较费时。紧凑的过程实际上类似于Windows系统中的磁盘整理,只不过后者是对外存空间的紧凑。
    在这里插入图片描述

二、可变分区存储管理的主存空间分配与回收

  1. 数据结构
  • 1)已分分区表:登记系统中的已分配分区(分区号、分区起始地址、分区大小及状态)(不是必须的,内存占用情况可以记录在进程的PCB中,如起始地址和空间大小)
    在这里插入图片描述

  • 2)空闲分区表:用来登记系统中的空闲分区(分区号、分区起始地址、分区大小及状态),必须的数据结构。
    在这里插入图片描述

  • 3)空闲分区链:空闲分区也可以组织成链表形式。

    head:存放第一个空闲分区的起始地址;

    每个节点:1)该分区的大小 2)指向下一个分区的起始地址[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UC5CIQdu-1609837286097)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20201217161525263.png)]

  1. 内存分配
  • 系统利用某种分配算法,从空闲分区表/链中找到所需大小的分区。
  • 1)事先规定size是不再切割的剩余分区的大小。
  • 2)设请求的分区大小为u.size,空闲分区的大小为m.size。
  • 3)若 m.size - u.size ≤ size,将整个分区分配给请求者。否则,从该分区中按请求的大小划分出一块内存空间分配出去,余下的部分仍留在空闲分区表/链中。
    在这里插入图片描述
  1. 分配算法(查找合适的空闲分区)
  • 在作业进程装入或换入主存时,如果有多个足够大的空闲分区,系统要确定分配哪个内存块,这就是动态分区的分配算法:
  • 1)首次适应(First Fit)算法:空闲分区以地址递增排序。分配内存时每次都从空闲分区表的第一项开始顺序查找,找到大小能满足要求的第一个空闲分区。
  • 2)邻近适应(Next Fit)算法:又称循环首次适应算法,由首次适应算法演变而成。不同的是分配内存时从上次查找空闲分区表结束的位置开始继续查找。
  • 3)最佳适应(Best Fit)算法:空闲分区按分区大小递增排序,从第一项开始找到第一个能满足要求的空闲分区。
  • 4)最坏适应(Worst Fit)算法:又称最大适应(Largest Fit)算法,空闲分区以分区大小递减排序。从第一项开始找到第一个能满足要求的空闲分区,也就是挑选出最大的分区。

l首次适应算法不仅最简单的,而且通常也是最好和最快的。在UNIX系统的最初版本中,就是使用首次适应算法为进程分配内存空间,其中使用数组来实现。首次适应算法会使得内存的低地址部分出现很多小的空闲分区,每次分配查找都要经过这些分区,因此也增加了查找的开销。

邻近适应算法试图解决这个问题,但它常常会导致在内存的末尾分配空间(因为在一遍扫描中,内存前面部分使用后再释放时,不会参与分配)分裂成小碎片。它通常比首次适应算法的结果要差。

最佳适应算法虽然称为“最佳”,但是性能通常很差,因为每次最佳的分配会留下很小的难以利用的内存块,它会产生最多的外部碎片。

最坏适应算法与最佳适应算法相反,选择最大可用块,看起来不容易产生碎片,但选择最大的连续内存使用,会很快导致没有可用的大内存块,性能也非常差。

  1. 内存回收
  • 作业结束,找到作业所占内存的起始地址和大小,回收其占用的内存,也就是修改空闲分区表。
  • 1)回收分区上邻接一个空闲分区,合并后首地址为空闲分区的首地址,大小为二者之和。
  • 2)回收分区下邻接一个空闲分区,合并后首地址为回收分区的首地址,大小为二者之和。
  • 3)回收分区上下都邻接空闲分区,合并后首地址为上空闲分区的首地址,大小为三者之和。
  • 4)回收分区不邻接任何空闲分区,这时在空闲分区表中新建一表项,并填写分区大小等信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zmvalrpP-1609837286099)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20201217165319198.png)]

  1. 就几种分配算法对内存空间的利用情况模拟实验表明:
  • 首次适应算法可能比最佳适应法效果好,而它们两者一定比最大适应法效果好。另外注意,在算法实现时,分配操作中最佳适应法和最大适应法需要对可用块进行排序或遍历查找,而首次适应法和邻近适应法只需要简单查找;回收操作中,当回收的块与原来的空闲块相邻时(有三种相邻的情况,比较复杂),需要将这些块合并。在算法实现时,使用数组或链表进行管理。除了内存的利用率,这里的算法开销也是操作系统设计需要考虑的一个因素。
  1. 其它算法
  • 首次适应算法、循环首次适应算法、最佳适应算法、最坏适应算法属于基于顺序搜索的动态分区分配算法。

  • 还有一类基于索引搜索的动态分区分配算法,包括快速适应算法(Quick Fit)、伙伴系统(Buddy system)和哈希算法。

  • 基于顺序搜索的动态分区分配算法一般只适合较小的系统,如果系统的分区很多,空闲分区表(链)可能很大(很长),检索速度会比较慢。为了提高搜索空闲分区的速度,大中型系统采用了基于索引搜索的动态分区分配算法。

  • 快速适应算法,又称为分类搜索法,把空闲分区按容量大小进行分类,经常用到长度的空闲区设立单独的空闲区链表。系统为多个空闲链表设立一张管理索引表。

    • 优点是查找效率高,仅需要根据进程的长度,寻找到能容纳它的最小空闲区链表,取下第一块进行分配即可。该算法在分配时,不会对任何分区产生分割,所以能保留大的分区,也不会产生内存碎片。是用空间换时间的方法。
    • 缺点是在分区回收时算法复杂,系统开销较大。在分配空闲分区时是以进程为单位,一个分区只属于一个进程,存在一定浪费。
  • 伙伴系统:是介于固定分区与可变分区之间的动态分区技术。

    • 伙伴:在分配存储块时将一个大的存储块分裂成两个大小相等的小块,这两个小块就称为“伙伴”。
    • 1)可供分配的空间是大小为2ª的块,如果作业进程请求的空间S满足2ª-¹<S≤2ª,则将整个空间分配给他,否则将该块分为大小相同的两个伙伴,每个为2ª-¹。
    • 2)如果2ª-²<S≤2ª-¹,则将其中任意一个伙伴分给该请求,否则,继续将其中一个伙伴为大小相同的两个伙伴。
    • 3)这个过程一直到产生大于或等于S的最小块,完成分配。
  • 哈希算法:哈希函数(Hash),也叫散列函数,是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值。哈希既是一种查找技术,也是一种存储技术。可以用哈希函数建立从关键字空间到存储地址空间的映射。若关键字为k,计算出Hash函数值Hash(k),把这个值(Hash地址)存储为一个线性表,称为散列表或哈希表。查找时,对于给定关键字求哈希值,然后直接在哈希表中取得所查记录。(不必顺序查表,查找速度比较快)

三、可变分区存储管理的地址转换与存储保护

  • 使用动态重定位;硬件支持:基址寄存器和限长(界限)寄存器

四、可变分区存储管理的管理特点

  • 分区长度不预先固定,而按作业的实际需求划分的;分区的个数也不预先设定,而是由装入内存的作业数量决定,提高了内存的利用率。

  • 主存经过多次的分配与回收后,会产生许多小的分区无法分配,这种内存碎片叫做外零头(也叫外碎片,对应于固定分区),会造成内存空间的浪费。

  • “碎片”或“零头”:是指内存中容量太小、无法利用的小分区。可分为两种:

    • 1)内部碎片:在一个分区内部出现的碎片(即被浪费的空间),如固定分区法会产生内部碎片。
    • 2)外部碎片:在所有分区之外的碎片,是一些无法使用小分区。

五、可变分区存储管理的进一步处理

  • 移动技术(紧凑技术):通过移动作业从把多个分散的小分区拼接成一个大分区的方法称为紧凑(拼接、紧缩、移动)。

    • 目标:消除外部碎片,使本来分散的多个小空闲分区连成一个大的空闲区。
    • 紧凑时机:找不到足够大的空闲分区且总空闲分区容量可以满足作业要求时。
    • 动态重定位:作业在内存中的位置发生了变化,这就必须对其地址加以修改或变换。
      在这里插入图片描述
  • 动态可重定位分区分配:相当于引入了动态重定位和内存紧凑技术的动态分区分配。
    在这里插入图片描述

  • 例:系统中的空闲分区表如下表示,现有三个作业分配申请内存空间 100K、30K 及 7K,给出按首次适应等四种算法的内存分配情况及分配后空闲分区表。
    在这里插入图片描述

  • 1、首次适应算法,申请作业100k,分配3号分区,剩下分区为20k,起始地址160K ;申请作业30k,分配1号分区,剩下分区为2k,起始地址50K ;申请作业7k,分配2号分区,剩下分区为1k,起始地址59K。
    在这里插入图片描述

  • 2、循环首次适应算法:按循环首次适应算法,申请作业100k,分配3号分区,剩下分区为20k,起始地址160K;申请作业30k,分配4号分区,剩下分区为301k,起始地址210K ;申请作业7k,分配1号分区。
    在这里插入图片描述

  • 3、最佳适应算法:按分区大小递增排序。
    在这里插入图片描述
    在这里插入图片描述

  • 4、最坏适应算法:按分区大小递减排序。

在这里插入图片描述

  • 三种内存分区管理方式的比较
    在这里插入图片描述

3.3 分页存储管理

  • 连续分配存储管理方式产生的问题:

    • 要求连续的存储区
    • 碎片问题
  • 离散分配,允许将作业离散放到多个不相邻接的分区中。

    • 分页式存储管理:离散分配的基本单位是页
    • 分段式存储管理:离散分配的基本单位是段
    • 段页式存储管理:离散分配的基本单位是段、页

3.3.1 分页存储管理

一、分页存储基本原理

  1. 空间划分:将一个用户作业的地址空间(逻辑空间)划分成若干个大小相等的区域,称为页或页面,各页从0开始编号。内存空间也分成若干个与页大小相等的区域,称为块(物理块)或页框(frame),同样从0开始编号。

  2. 内存分配:在为作业分配内存时是以块为单位,将作业中的一个页装到内存中的一个块内,每个页在内存中占用连续的地址空间(一个内存块),而不同的若干页则可以装入到内存中不相邻的内存块中,但最后一页可能会装不满一块,从而出现页内碎片。
    在这里插入图片描述

3、已知逻辑地址求页号和页内地址

  • 给定一个逻辑地址空间中的地址为A,页面的大小为L,则页号P和页内地址d(从0开始编号)可按下式求得:在这里插入图片描述
  • 其中,INT是整除函数,mod是取余函数。
  • 例:系统的页面大小为1KB,设A=2170B,则由上式可以求得P=2,d=122。
  1. 内存分配原则:
  • 1)以块为单位
  • 2)每个页装入 一个内存块
  • 3)内存块可以不连续(也可以连续)
    在这里插入图片描述

二、空间分配与回收

  1. 数据结构
  • 1)页表:为了便于在内存找到进程的每个页面所对应的内存块,分页系统中为每个进程配置一张页表,进程逻辑地址空间中的每一页,在页表中都对应有一个页表项。

    • 页表存放在内存中,属于进程的现场信息。
    • 用途:记录进程的内存分配情况;实现进程运行时的动态重定位。
    • 访问指令或数据需访问内存2次(第一次访问内存中的页表,第二次访问内存中的指令或数据)。
    • 系统同时增加页表寄存器,记录当前执行进程对应的页表的起始地址及长度。
      在这里插入图片描述
  • 2)内存块表:整个系统有一个内存块表。每个内存块在内存块表中占一项,表明该块当前空闲还是已分出去了。

    ① 空闲表法:系统为内存所有空闲区建立一张空闲表,每个表项对应一个空闲区,空闲表中包含序号、空闲区的第一块号、空闲块的块数等信息。空闲表法是基于连续分配的。

序号 起始块号 块数
1 25 8
2 106 39
3

② 空闲链法:将所有空闲区拉成一条空闲链,根据空闲链所有的基本元素不同,可以分成空闲块链和空闲区链。

• 空闲块链是将所有空闲分区,以块为单位拉成一条链,当为作业分配存储空间时,系统从链首开始,依次摘下适当数目的空闲块进行分配;当回收空间时,系统将回收的块依次加入到空闲块链的末尾。

• 空闲区链是将所有空闲区拉成一条链。每个空闲区除含有用于指示下一个空闲区的指针外,还有本区大小(块数)的信息。

③ 位示图法:利用二进制的一位来表示内存中一个块的使用情况,所有的块都有与之对应的一个二进制位。当其值为0时,表示对应的块空闲,当其值为1时,表示对应的块已经分配。

在这里插入图片描述

  • 3)请求表:整个系统有一个请求表,描述系统内各个进程页表的位置和大小,用于地址转换,也可以结合到各进程的PCB里。
    在这里插入图片描述

2、主存空间的分配

  • 1)初始化位示图,空闲的位为0,记录剩余空闲块数。
  • 2)计算作业所需页数,如果小于等于剩余空闲块数,可以继续分配,创建页表等结构,否则无法装入。
  • 3)找到标志为0的位,将其改为1,表示已经分配,并计算对应的物理块号。假定找到的值为0的二进制位,位于位示图的第i行、第j列,则其相应的块号计算:b=n*i+j;其中,n代表每行位数,i、j都从0开始编号。
  • 4)将该页作业装入内存,修改页表,将页号与装入的块号对应,重复3)、4)直到所有的页都装入内存。
  • 5)装入完成,修改位示图中剩余空闲块个数,并填写其他相关数据。

3、主存空间的回收

  • 1)进程结束,查找进程控制块或其他相关数据,找到进程对应的页表。

  • 2)根据页表中页号对应的块号回收内存。

    将回收内存的块号转换成位示图中的行号和列号:

    位示图行号:i=int(b/n) int(向下取整)

    位示图列号:j=b mod n mod(取余)

  • 3)修改对应的位标记为0,重复2)、3)直到所有的内存块都回收。

  • 4)修改位示图中剩余空闲块个数,删除页表,修改其他相关数据。

三、地址转换与内存保护

​ 1、地址转换与地址保护

  • 地址变换与地址保护借助页表和页表寄存器来完成,页表驻留内存。为了完成地址变换和保护,系统中设置一个页表寄存器PTR。每个进程对应一页表,其信息(如页表长度、页表起始地址)放在PCB中,执行时将其装入页表寄存器。在单处理机下,虽然系统中可以运行多个进程,但只有一个页表寄存器。
  • 当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将相对地址分为页号和页内地址两部分。将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间,产生地址越界中断。否则将页表始址与页号和页表项长度的乘积相加,得到该页表项在页表中的位置,从中得到该页的物理块号,将之装入物理地址寄存器中。将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。
    在这里插入图片描述

逻辑地址:把相对地址分为页号和页内地址两部分。

越界中断:页号与页表长度做比较。

页表定位:页表始址 + 页号 × 页表项长度。 然后查询页表,读出块号。

物理地址:块号 + 块内地址。 (块内地址 = 页内地址)

每个进程平均有半个页面的内部碎片

例1:若在一分页存储管理系统中,某作业的页表如下表所示,已知页面大小为1024B,试将十进制逻辑地址1011,2148,5012转化为相应的物理地址。
在这里插入图片描述

解析:

设页号为P,页内位移为W,逻辑地址为A,

内存地址为M,页面大小为L,则

P = int(A/L) W = A mod L

  • 对于逻辑地址1011:

P = int(1011/1024)= 0

W = 1011 mod 1024 = 1011 A = 1011 =(0,1011)

查页表第0页在第2块,所以物理地址为 M = 1024*2+1011 = 3059

  • 对于逻辑地址为2148:

P = int(2148/1024)= 2 W = 2148 mod 1024 = 100

A = 2148 =(2,100) 查页表第2页在第1块

所以物理地址为:M = 1024*1+100 = 1124

  • 对于逻辑地址 5012:

P = int(5012/1024)= 4 W = 5012 mod 1024 = 916

页号超过页表长度,该逻辑地址非法

在这里插入图片描述

例2:设一分页存储管理系统,向用户提供的逻辑地址空间最大为16页,每页2048B,主存有8个存储块,试求逻辑地址应为多少位?主存空间有多大?

  • 逻辑地址结构:页号+页内地址。

    16个页,页号为4位;每页2048B,页内地址为11位

    所以逻辑地址:4 + 11 = 15 位

  • 主存有8块,每块大小与页的大小相同也是2048B

    所以主存空间:8 * 2048B = 16 KB

2、页的共享与保护

  • 1)页的共享:在不同进程的页表中,各自的页表项如果指向同一内存块,就可以实现页的共享。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pc6kSXvg-1609837286123)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105115916639.png)]

  • 2)页的保护:除了内存管理中的保护(0/1表示块的使用状态)、地址转换中的保护(越界保护),还可以在页表的表项中设置存取控制字段,进行存取控制保护。当存取控制字段是1位时,可规定块中的内容是允许读/写,还是只读。当为2位时,则可规定为读/写、只读和只执行等存取方式。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SOR131ZH-1609837286124)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105115936390.png)]

四、页面大小问题

  • 若页面较小:

    • 减少页内碎片和总的内存碎片,有利于提高内存利用率。
    • 每个进程页面数增多,使页表长度增加,占用内存较大。
    • 页面换进换出速度将降低。
  • 若页面较大:

    • 每个进程页面数减少,页表长度减少,占用内存较小。
    • 页面换进换出速度将提高。
    • 增加页内碎片,不利于提高内存利用率。
  • 因此,页面的大小应选择适中,应是2的幂,通常为512B — 8KB。

3.3.2 分页存储管理的改进

一、快表结构

1、分页地址变换机构存在的问题:地址变换速度低(需要两次访问内存),第一次访问内存中的页表,从中找到指定页的物理块号,再将块号与页内地址(等于块内地址)计算,形成物理地址。第二次访问内存,是从第一次所得物理地址中获得所需数据(或向此地址中写入数据)。采用这种方式将使计算机的处理速度降低近1/2。

2、快表概念:为了提高地址变换速度,增设一个具有并行查询能力的特殊高速缓冲寄存器(高速缓冲存储器(Cache)其原始意义是指存取速度比一般随机存取记忆体(RAM)来得快的一种RAM,一般而言它不像系统主记忆体那样使用DRAM技术,而使用昂贵但较快速的SRAM技术高速缓存),又称为“联想寄存器(存储器)”或称为“快表”。通常在快表中存放正在运行作业当前访问的那些页表项,以加速地址变换过程,主存中的页表有时也称为慢表。

3、引入快表以后的地址变换过程是:

  • 1)在CPU给出有效地址(逻辑地址/相对地址)后,由地址变换机构自动分为页号P和页内地址W两部分。

  • 2)将页号送入高速缓冲寄存器,并将此页号与快表中的所有页号进行比较,若其中有与此相匹配的页号,便直接从快表中读出该页号所对应的物理块号,与页内地址计算形成物理地址,并送到地址寄存器中。如果在快表中未找到对应的页表项,则再访问内存中的页表,把从页表项中读出的物理块号,与页内地址计算形成物理地址,并送往地址寄存器;同时修改快表,将此页表项存入快表中。但如果联想存储器已满,则OS必须找到一个老的且已被认为不再需要的页表项,将它换出。

  • 3)用物理地址访问内存。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aztJI6mW-1609837286126)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105120203325.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gOWMss3L-1609837286127)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105120209455.png)]

4、快表的性能

  • 由于成本的关系,快表不可能很大,通常只存放16–512个页表项,对中小型作业已有可能把全部页表项存放在快表中,但对于大型作业,则只能将其一部分页表项放入其中。由于对程序和数据的访问往往带有局限性,因此,据统计,从快表中能找到所需页表项的机率可达90%以上。这样,由于增加了地址变换机构而造成的速度损失,可减少到10%以下,达到了可接受的程度。

  • — 在分页系统中增加了快表后,在快表中找出所需页表项的概率称为平均命中率。

  • — 有效访问时间(EAT,Effective Access Time),是指给定逻辑地址找到内存中对应物理地址单元中的数据所花的总时间。

  • 基本地址变换机构:在这里插入图片描述

  • 具有快表的地址变换机构:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KhbtB2hT-1609837286129)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105120249366.png)]

  • 例:有一页式系统,其页表存放在内存中。

    • 1)如果对内存的一次存取需要100ns,试问实现一次页面访问的存取时间是多少?

    • 2)如果有快表,对快表的一次存取需要20ns, 平均命中率为90%,试问此时的存取时间为多少?

    • 1)页表放内存中,则实现一次页面访问需2次访问内存。

      所以实现一次页面访问的存取时间为:100ns*2=200ns

      2)系统有快表,则实现一次页面访问的存取时间为:

      0.9*(20ns+100ns)+(1-0.9)(20ns+2100ns)=130ns

二、两级页表结构

1、基本概念

  • 大多数现代计算机系统都支持非常大的逻辑地址空间,如232 ~264。在这种情况下,划分的页比较多,页表会很大,要占用的存储空间也大,页表要放在内存块内,这时页表无法放在一个内存块里。

  • 例如,对于32位逻辑地址空间的分页系统,如果页面大小为4KB,即212B,则每个进程页表最高由220页组成。设每个页表项占一个字节,页表最高要占1MB的内存空间,页表无法在一个内存块内存放,解决问题的方法:

    • 1)动态调入页表:只将部分页表项调入内存,其余以后再调入。
    • 2)两级或多级页表

2、两级页表结构

  • 两级页表:将页表再进行分页,将各个页表页面分别放到不同的物理块中,同时也要再建立一张外部页表用以记录每个页表页面对应的内存物理块号。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WLg5CVWw-1609837286131)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105144431947.png)]

3、两级页表结构的地址转换
在这里插入图片描述

4、三级页表地址结构
在这里插入图片描述
在这里插入图片描述
三、反置/倒置页表结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0QrxCOYJ-1609837286135)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105144542084.png)]

解决问题的方法:动态调入页表;多级页表;反置页表

1、反置页表概念:

  • 一般页表的表项是按页号进行排序,页表项中的内容是物理块号。反置页表是为每一个物理块设置一个页表项并按物理块号排序,其中的内容是页号P及隶属进程标志符pid。

2、利用反置页表进行地址变换:

  • 1)用进程标志符和页号去检索反置页表。

  • 2)如果检索完整个页表未找到与之匹配的页表项,表明此页此时尚未调入内存,对于具有请求调页功能的存储器系统产生请求调页中断,若无此功能则表示地址出错。

  • 3)如果检索到匹配的表项,则表项的序号i便是该页的物理块号,将该块号与页内地址一起构成物理地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C3UwCxhf-1609837286136)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105144606005.png)]

3、反置页表优点:

  • 反置页表可以有效地减少页表占用的内存,但反置页表中只包含已经调入内存的页面,未包含那些未调入内存的各个进程的页面,因此必须为每个进程建立一个外部页表(External Page Table)。发现页面不在内存时才访问外部页表。

  • 外部页表存放各页在外存中的物理位置。通过外部页表可将所需要的页面调入内存。

  • 反置页表中是为每一个物理块设置一个页表项,通常页表项的数目也很大,可以结合使用Hash表来检索。

四、散列页表结构

  • 以进程号和页号作为参数形成散列值。散列表中每一项有一个链表,它把有相同散列值的元素链接起来。每个链表元素由三部分组成:

    ① 页号

    ② 对应的内存块号

    ③ 指向链表中下一个元素的指针

    散列函数:y = f(x);块号 = f(进程号、页号)

    冲突:f(x1)= f(x2)

    冲突解决方法:拉链法、开地址法、再散列法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f6U26cp9-1609837286137)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105144702558.png)]

3.4分段存储管理

3.4.1 分段存储管理

  • 分段存储管理方式的引入是为了满足用户的要求:

    1、方便编程:通常一个作业是由多个程序段和数据段组成的,一般情况下,用户希望按逻辑关系对作业分段,并能根据名字来访问程序段和数据段。

    2、信息共享:共享是以信息的逻辑单位为基础的。页是存储信息的物理单位,段却是信息的逻辑单位。页式管理中地址空间是一维的,主程序,子程序都顺序排列,共享公用子程序比较困难,一个共享过程可能需要几十个页面。

    3、信息保护:页式管理中,一个页面中可能装有2个不同的子程序段的指令代码,不能通过页面共享实现共享一个逻辑上完整的子程序或数据块。段式管理中,可以以信息的逻辑单位进行保护。

    4、动态增长:实际应用中,某些段(数据段)会不断增长,前面的存储管理方法均难以实现。

    5、动态链接:动态链接在程序运行时才把主程序和要用到的目标程序(程序段)链接起来。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PHhlEith-1609837286138)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105144832109.png)]

一、分段存储基本原理

1、空间划分:将用户作业的逻辑地址空间划分成若干个大小不等的段(由用户根据逻辑信息的相对完整来划分)。各段有段名(常用段号代替),各段的首地址都为0。

2、内存分配:以段为单位装入内存,每段占用一段连续的内存空间,大小由对应段的大小决定,段和段之间不连续。内存空间的分配与回收实际上是基于可变分区管理,只是分配和回收的单位是段,而不再是整个作业。

3、分段结构与内存装入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LJqPusGe-1609837286139)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105144904886.png)]

4、地址结构

  • 逻辑地址要用两个成分来表示:段号s和段内地址d

  • 进程的逻辑地址空间是二维的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3xK8XW48-1609837286140)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105144937174.png)]
(B)

二、空间分配与回收

1、数据结构

  • 1)段表:为了便于在内存中找到作业进程的每个段,系统为每个作业进程建立一个段映射表,简称“段表”,记录了作业进程的每个段与内存位置的对应关系,每个段在段表中占有一项,段表项中包含段号、段长和段的起始地址(又称“基址”)等。访问数据/指令需访问内存两次 (第一次访问内存中的段表,第二次访问内存中的指令或数据)。
    • 系统还要建立一个段表地址寄存器。记录当前正在执行进程的段表信息,包括有两部分:① 段表在内存的起始地址 ② 段表的长度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H4uqHHQh-1609837286142)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105145018356.png)]

  • 2)请求表:整个系统有一个请求表,描述系统内各个进程段表的位置和大小,用于地址转换也可以结合到各进程的PCB里。
作业名 段表起始地址 段表长度
1 125 45
2 186 89
3
  • 3)空闲分区表:用来登记系统中的空闲分区(分区号、分区起始地址、分区大小及状态)。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GbI9Q631-1609837286143)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105145104565.png)]

2、主存分配与回收

  • 内存空间的分配与回收是基于可变分区管理,以作业的段为单位,按照某种分配算法,从空闲分区表/链中找到符合段所需大小的分区,一个段一个段,最终完成整个作业的内存空间分配。

  • 1)事先规定size是不再切割的剩余分区的大小。

  • 2)设作业其中一段大小为u.size,空闲分区的大小为m.size。

  • 3)若 m.size - u.size ≤ size,将整个分区分配给该段,否则,从该分区中按段的大小划分出一块内存空间分配出去,余下的部分仍留在空闲分区表/链中,同时修改作业的段表。

  • 4)该作业所有的段都装入内存,则整个作业完成内存分配。

3、分配算法(查找合适的空闲分区)

  • 分配算法与可变分区一样:

    1)首次适应算法

    2)邻近适应算法

    3)最佳适应算法

    4)最坏适应算法

4、内存回收

  • 进程结束后,按照段表查找每段在内存的起始地址和大小,然后按段一个一个回收其占用的内存,同时修改空闲分区表,把进程所有段回收,则完成整个进程所占内存空间的回收。

    1)回收分区上邻接一个空闲分区

    2)回收分区下邻接一个空闲分区

    3)回收分区上下都邻接空闲分区

    4)回收分区不邻接任何空闲分区

三、地址转换与内存保护

1、地址转换与地址保护

  • 地址变换与地址保护借助段表和段表寄存器来完成,段表驻留内存。为了完成地址变换和保护,系统中设置一个段表寄存器。每个进程对应一段表,信息放在PCB中,执行时将其装入段表寄存器。

  • 地址变换过程:系统将逻辑地址中的段号S与段表长度TL进行比较。若S>TL,表示段号太大,是访问越界,产生越界中断信号。若未越界,则根据段表的起始地址和该段段号,计算出对应段表项位置(内存地址),从内存中读出该段在内存的始址。接着检查段内地址d,是否超过该段的段长SL。若超过,即d>SL,同样发出越界中断信号。若未越界,则将该段的基址与段内地址d相加,即可得到要访问指令或数据的内存物理地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UnU2kEsu-1609837286144)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105145249757.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IKL65Hn2-1609837286145)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105145255713.png)]
在这里插入图片描述

2、段的共享与保护

  • 1)段的共享:共享是在段一级实现的,任何共享信息可以单独成为一段。
    在这里插入图片描述

  • 例:一个多用户系统,可同时接纳40个用户,都执行一个文本编辑程序(Text Editor)。如果文本编辑程序有160KB的代码和另外40KB的数据区,如果不共享,则总共需:(160+40)×40 = 8000KB 内存空间。

  • 可重入代码(Reentrant Code)又称为“纯代码”,是一种允许多个进程同时访问的代码。为使各个进程所执行的代码完全相同,绝对不允许可重入代码在执行中有任何改变。因此,可重入代码是一种不允许任何进程对它进行修改的代码。

    • 如果160KB的代码是可重入的,则无论是在分页系统还是在分段系统中,该代码都能被共享。

    • 在内存中只需保留一份文本编辑程序的副本,此时所需的内存空间仅为:40×40+160 = 1760KB 内存空间。

  • 分页存储共享:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BKZtZX7J-1609837286148)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105145411245.png)]

  • 分段存储共享:在分段系统,只需在每个进程的段表中为文本编辑程序设置一个段表项。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CswRNQQY-1609837286149)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105145423575.png)]

  • 1)段的共享:① 共享段表
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YPi0gyR5-1609837286150)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105145457746.png)]

  • 1)段的共享:② 共享段的分配与回收

    u共享段的分配:当第一个使用共享段的进程提出请求,由系统为该共享段分配一物理区,并调入该共享段,同时修改相应的段表(该段的内存地址)和共享段表,把count置为1。其它进程需要调用此段时,不需再调入,只需修改相应的段表和共享段表,再执行count=count+1操作。

    u共享段的回收:当共享共享段的某进程不再使用该共享段时,修改相应的段表和共享段表,执行count=count-1操作。当最后一共享此段的进程也不再需要此段时,则系统回收此共享段的物理区,同时修改共享段表(删除该表项)。

  • 2)段的保护:段的保护措施包括

    ① 存取控制:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5pwsAAP0-1609837286151)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105145607019.png)]

    ② 段表本身可起保护作用

    ● 表项中设置每段的长度限制信息

    ● 段表地址寄存器中有段表长度信息

    ③ 环保护机构:环保护机构是一种功能较完善的保护机制。在该机制中规定:低编号的环具有高优先权。OS核心处于0环内;某些重要的实用程序和操作系统服务占居中间环;而一般的应用程序则被安排在外环上。

    • 在环系统中,程序访问和调用遵循一定的规则:

      ● 一个程序可以访问同环或较低特权环的数据

      ● 一个程序可以调用同环或较高特权环的服务

四、分页与分段存储管理的主要区别

① 页是信息的物理单位;段是信息的逻辑单位

② 页的大小是由操作系统确定的;段的长度因段而异,由编程长度而定

③ 分页的进程地址空间是一维的;分段的进程地址空间是二维的

④ 分页系统很难实现过程和数据的分离;分段系统却可以很容易实现这些功能

⑤ 分页是面向操作系统的,核心是为了提高内存利用率;分段是面向程序开发的,核心是为了方便程序员编程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QWlxhD9e-1609837286153)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105145743593.png)]

3.4.2 段页式存储管理

一、段页式管理基本原理

段页式存储管理是分段和分页原理的结合,即先将用户程序分成若干个段(段式),并为每一个段赋一个段名,再把每个段分成若干个页(页式)。其地址结构由段号、段内页号、及页内位移三部分所组成。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3w71TPBb-1609837286154)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105150007578.png)]

系统中设段表和页表,均存放于内存中。读一字节的指令或数据须访问内存三次。为提高执行速度可增设高速缓冲寄存器。

每个进程一张段表,每个段一张页表。

段表含段号、页表始址和页表长度。页表含页号和块号。

二、内存管理要求

等分内存,内存分成与页大小相等的块,使用位示图管理内存。内存分配是以页为单位装入内存的块内。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WZPKTCQU-1609837286155)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105150031348.png)]

三、地址转换与保护

1)从PCB中取出段表始址和段表长度,装入段表寄存器。

2)将段号与段表长度进行比较,若段号大于或等于段表长度,产生越界中断。

3)利用段表始址与段号得到该段表项在段表中的位置。取出该段的页表始址和页表长度。

4)将页号与页表长度进行比较,若页号大于或等于页表长度,产生越界中断。

5)利用页表始址与页号得到该页表项在页表中的位置。

6)取出该页的物理块号,与页内地址拼接得到实际的物理地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GAL3UTmh-1609837286156)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105150052681.png)]

3.5 虚拟存储管理

  • 常规存储管理方式的共同点:要求一个作业全部装入内存后方能运行。可能出现的问题:有的作业很大,所需内存空间大于内存总容量,使作业无法运行。有大量作业要求运行,但内存容量不足以容纳下所有作业,只能让一部分先运行,其它在外存等待。

  • 同时一个进程在执行前要全部装入内存,也有一些问题:

    ① 其中往往含有很少使用或不会被执行的代码

    ② 分配的内存空间会大于它们的实际需要

  • 解决方法:第一,物理上增加内存容量;第二,从逻辑上扩充内存容量,如采用覆盖、对换、虚拟存储技术。

3.5.1 虚拟存储器基本概念

一、局部性原理

1、常规存储器管理方式的特征:

  • 1)一次性:作业在运行前需一次性地全部装入内存。

  • 2)驻留性:作业装入内存后便一直驻留内存,直至结束。

2、局部性原理基础:

  • 作业执行时,除了少部分的转移和过程调用指令外,在大多数情况下仍是顺序执行的。

  • 过程调用将会使执行轨迹由一部分区域转至另一部分区域,但过程调用的深度在大多数不超过5。

  • 程序中存在许多循环结构,它们将多次执行。

  • 程序中还包括许多对数据结构的处理,如对数组进行操作,它们往往都局限于很小的范围内。

3、局部性原理

  • 局部性表现在下述两个方面:

    1)时间局部性:如果某条指令一旦执行,则不久以后该指令可能再次执行;如果某数据被访问过,则不久以后该数据可能再次被访问。产生时间局限性的典型原因,是由于代码中存在着大量的循环操作。

    2)空间局部性:一旦访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即在一段时间内所访问的地址,可能集中在一定的范围之内,其典型情况便是顺序执行。

二、虚拟存储器的定义

1、虚拟存储器的基本原理:根据局部性原理,不需要将作业的全部都装入内存,只需将当前需要执行的部分页或段装入内存,就可让作业开始执行(部分装入功能)。

  • 在作业执行过程中,如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段),则由处理器通知操作系统将相应的页或段调入到内存,然后继续执行(请求调入功能)。另一方面,操作系统可以将内存中暂时不使用的页或段调出保存在外存上,从而腾出空间存放将要装入的作业以及将要调入的页或段(置换功能)。

2、虚拟存储器的定义:虚拟存储器,是指只装入作业的一部分就能运行的存储系统,其具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充。

  • 用户能以可编址内存对待的虚拟存储空间,它使用户逻辑存储器与物理存储器分离,是操作系统给用户提供的一个比真实内存空间大得多的地址空间。

3、虚拟存储器的容量

  • 虚拟存储器实质上是把用户地址空间和实际的存储空间区分开来。它主要受到两方面的限制:

    ① 指令中表示地址的字长② 外存的容量

  • 虚拟存储器的逻辑容量由地址寄存器字长决定,实际容量由内存容量和外存容量之和所决定。

  • 运行速度接近于内存速度,成本接近于外存。

4、虚拟存储器的特征

  • 1)离散性:作业在内存中存放在不连续的空间。

  • 2)多次性:作业被分成多次调入内存运行。多次性是虚拟存储器最重要的特征,其它存储器不具备这个特征。

  • 3)对换性:允许在作业运行过程中进行换进、换出。换进、换出可提高内存利用率。

  • 4)虚拟性:指能够从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。

  • 虚拟性以多次性和对换性为基础,而多次性和对换性必须以离散分配为基础。

5、虚拟存储器的实现方法

  • 虚拟存储器的实现方法:请求分页、请求分段、请求段页式。
  • 1)请求分页虚拟存储管理系统:在分页系统的基础上,增加了请求调页功能、页面置换功能所形成的页式虚拟存储器系统。

1)请求分页虚拟存储管理系统:在分页系统的基础上,增加了请求调页功能、页面置换功能所形成的页式虚拟存储器系统。

  • 2)请求分段虚拟存储管理系统:在分段系统的基础上,增加了请求调段功能及分段置换功能,所形成的段式虚拟存储器系统。

  • 3)请求段页式虚拟存储管理系统:在段页式系统的基础上,形成段页式虚拟存储器系统。

3.5.2 请求分页虚拟存储管理

一、基本原理

是在单纯分页技术基础上发展起来的,二者的根本区别在于请求分页提供虚拟存储器。

基本思想是:允许只装入若干页的用户程序和数据,便可启动运行,在运行过程中若用到的页面尚未在内存,通过调页功能将要运行的页面调入内存,使用置换功能把暂不运行的页面换到外存上。

系统须设置相应的硬件支持和软件:

  • 硬件支持:请求分页的页表机制、缺页中断机构和地址变换机构。

  • 软件:请求调页功能和页置换功能的软件

二、数据结构

1、页表:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I9dJpkjA-1609837286157)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105150615958.png)]

  • 状态位P:该页是否已调入内存。供程序访问时参考

  • 访问字段A:记录本页在一段时间内被访问的次数或最近未被访问的时间。供选择页面换出时参考

  • 修改位M:表示该页在调入内存后是否被修改过。若修改过,则置换该页时需重写该页至外存。供置换页面时参考

  • 外存地址:该页在外存上的地址。供调入该页时参考

2、缺页中断机构:

  • 在请求分页系统中,当访问的页不在内存,便产生一个缺页中断。

  • 缺页中断与一般中断的区别:

    1)产生中断的时间不同,一般中断是在一条指令结束后或开始前发生中断,缺页中断是在指令执行期间产生和处理中断信号(要访问的指令或数据不在内存)。

    2)产生中断的次数不同,一般中断在一条指令前后只产生一次中断,缺页中断在一条指令执行期间,可能产生多次缺页中断。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HTvbRrwT-1609837286159)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105150642109.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LrIeb5xb-1609837286160)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105150655903.png)]
在这里插入图片描述
三、请求分页中的内存分配

1、最小物理块数的确定:

  • 最小物理块数指能保证进程正常运行所需的最小的物理块数,最小物理块数与计算机的硬件结构有关,取决于指令的格式、功能和寻址方式。

    1)采用直接寻址方式,所需的最少物理块数为2。一块是用于存放指令,另一块用于存放数据。

    2)间接寻址时,至少要求有三个物理块。(间接寻址中一些物理块放的是其它物理块的块号)

2、物理块的分配策略:

  • 1)固定分配局部置换:为每个进程分配固定数目的物理块来使用,在整个运行中都不改变。如出现缺页则从该进程的物理块置换一页。但每个进程分配的物理块若太少,会频繁出现缺页中断,降低系统吞吐量。若太多,内存中的进程数目减少,可能造成CPU或其它资源空闲。

  • 2)可变分配局部置换:为每个进程分配一定数目的物理块使用,若发现缺页,则从该进程的物理块中置换一页。但系统会根据进程缺页率的高低,动态增加或减少分配给该进程的物理块。

  • 3)可变分配全局置换:为每个进程分配一定数目的物理块,但OS自留一空闲块队列,若发现缺页,则从空闲块队列中分配一空闲块与该进程,并调入所缺页。当空闲块队列用完时,OS才从内存中任选择一页置换。

3、采用固定分配策略时,可采用的几种算法:

  • 1)平均分配算法:平均分配给各个进程,但是没有考虑进程自身的大小,所以小进程会浪费物理块,而大进程会物理块不足。

  • 2)按比例分配算法:根据进程的大小按比例分配给各个进程。如果共有n个进程,各个进程的页面数为Si,系统可用物理块总数为m,则每个进程分到的物理块数bi:image-20210105150759625

  • 3)考虑优先权的分配算法:将系统提供的物理块一部分根据进程大小先按比例分配给各个进程,另一部分再根据各进程的优先权分配物理块数。

四、页面调入策略

1、何时调入页面(调入页面的选择):

  • 1)请求调页策略(只调入所缺的一个页):当进程运行中发生缺页时,立即提出请求,由系统将缺页调入内存。但这种策略每次仅调入一页,须花费较大的系统开销,增加了启动磁盘 I/O 的频率。

  • 2)预调页策略(一次调入多个页):除了将缺的页调入内存,还把预计在不久之后会被访问到的页面也预先调入内存。进程的页一般存放在外存的连续区域中,一次调入若干相邻的页会比一次调入一页高效。但如果调入的一批页面中的大多数都未被访问,则会浪费内存。\

2、何处调入页面:在请求分页系统中,外存分成了按离散分配方式存放文件的文件区和按连续分配方式存放对换页的对换区。

  • 1)对换区:如果系统有足够的对换区空间,运行前可将与进程相关的文件从文件区复制至对换区,以后缺页时全部从对换区调页。

  • 2)文件区:如果系统没有足够的对换区空间,凡是不会被修改的文件,直接从文件区调页,不必回写(换出)。对可能会修改的文件第一次直接从文件区调页,换出时换至对换区,以后从对换区调页。

  • 3)UNIX方式:凡未运行过的页面均从文件区调页,运行过的页面和换出的页面均从对换区调页。

3、页面调入过程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1iBMdCqq-1609837286162)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105151109895.png)]

五、缺页率的问题

1、缺页率p:表示缺页中断的概率(0≤p≤1)

  • 等于缺页次数与全部访问内存次数之比

2、缺页中断处理时间:页面置换时需要考虑置换代价。没有被修改过的页面可以直接放弃,而修改过的页面必须进行保存。

  • 如果被置换页面被修改过的概率是β,其缺页中断处理时间为Ta,被置换页面没有被修改过的缺页中断处理时间为Tb,显然Ta > Tb。则缺页中断处理时间T:在这里插入图片描述

3、缺页率与分配的物理块算数:一般来说,随着可使用物理块数的增加,缺页数将减少,缺页率会降低。

  • 缺页数与内存物理块数的关系:

4、缺页中断处理所花费的时间主要有以下三部分:

  • ① 处理缺页中断的时间

  • ② 调入该页的时间

  • ③ 重新启动该进程的时间

5、将页面从盘上读到内存所花费的时间包括:

  • ① 磁盘寻道时间(即磁头从当前磁道移至指定磁道所用的时间)
  • ② 旋转延迟时间(即磁头从当前位置落到指定扇区开头所用的时间)
  • ③ 数据传输时间

六、页面置换算法

1、页面置换过程:

2、页面置换算法基本概念:用来选择换出页面的算法。页面置换算法的优劣直接影响到系统效率,若选择不合适,可能会出现抖动现象。

  • 抖动:刚被淘汰出内存的页面,过不久又要访问它,需要再次将其调入,而该页调入内存后不久又再次被淘汰出内存,然后又要访问它,如此反复,使得系统把大部分时间用在了页面的调进换出上,这种现象称为抖动。

  • 要尽量避免系统“抖动”。

3、存储访问序列:也叫页面走向。

  • ① 对于给定的页面大小,仅考虑其页号,不关心完整的地址。

  • ② 如果当前对页面p进行了访问,那么,马上又对该页访问就不会缺页,这样连续出现的同一页号就简化为一个页号。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ETsPIKDt-1609837286164)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105151431042.png)]

4、页面置换算法

1)最佳置换算法OPT:选择永远不再需要的页面或最长时间以后才需要访问的页面予以淘汰。

  • 最佳置换算法是一种理想化的算法,性能最好,实际上这种算法无法实现,因为页面访问的未来顺序很难精确预测,但可用该算法评价其它算法的优劣。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rTQm9ufq-1609837286165)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105151525008.png)]

2)先进先出置换算法FIFO:总是淘汰在内存中停留时间最长的一页,即先进入内存的页,先被换出。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9THjWrA8-1609837286166)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105151607687.png)]

  • 先进先出置换算法的出发点是最早调入内存的页面,其不再被访问的可能性会大一些。被置换的页可能含有一个初始化程序段,用过后再也不会用到;但也可能含有一组全局变量,初始化时被调入内存,在整个程序运行过程中都将会用到。FIFO算法易于理解与编程,但它的效率不高。

  • Belady异常现象:先进先出算法存在一种异常现象,即在某些情况下会出现分配给进程的物理块数增多,缺页次数有时增加,有时减少的奇怪现象,这种现象称为Belady异常现象。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y3V8x9Fh-1609837286167)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105151650868.png)]
在这里插入图片描述
3)最近最久未使用算法LRU:最近最久未使用算法虽然是一种比较好的算法,但实现开销很大,必须有硬件的支持。

  • 方法一:移位寄存器。为了记录某个进程在内存中各页的使用情况,为每个在内存中的页面配置一个移位寄存器,可表示为:

在这里插入图片描述

  • 方法二:栈。利用一特殊的栈保存当前使用的页号,每当进程访问某页面时,把被访问页面移到栈顶,于是栈底的页面就是最久未使用的页面。
    在这里插入图片描述
    4)最近最少使用置换算法LFU:选择在最近时期使用最少的页面为淘汰页。LFU置换算法为在内存中的每个页面设置一个软件计数器,记录该页面被访问的频率。发生缺页时,淘汰其计数值最小的页。
    在这里插入图片描述

  • LRU与LFU的区别:

    ① LRU是最近最久未使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面。

    ② LFU是最近最少使用置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yKUZ9vaC-1609837286172)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105152327904.png)]

5)Clock置换算法:是LRU和FIFO的折衷(LRU的近似算法,减少硬件消耗),也称为最近未使用算法NRU。

  • 该算法为每页设置一个访问位,并将内存中的所有页链接成一个循环队列。当某页被访问时,其访问位被置1。

  • 置换算法在选择一页淘汰时,只需检查页的访问位。如果是0,就选择该页换出;若为1,则重新将它置0,暂不换出,而给该页第二次驻留内存的机会,再按照FIFO算法继续检查下一个页面。

  • 当检查到队列中的最后一个页面时,若其访问位仍为1,则再返回到队首去检查第一个页面。

  • 假如某个页被频繁访问,那么它就不会被置换出去。
    在这里插入图片描述
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7SLqOSL5-1609837286176)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105152400010.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vulHPiRr-1609837286177)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105152408832.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mMbYblBx-1609837286178)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105152430409.png)]
    6)改进型Clock置换算法:除须考虑页面的使用情况外,还增加一个因素,即置换代价,这样选择页面换出时,既要是未使用过的页面,又要是未被修改过的页面。

  • 由访问位A和修改位M可以组合成下面四种类型的页面:

  • 第一步:从指针指示的当前位置开始扫描循环队列,寻找A=0且M=0的第一类页面,遇到的第一个页面为所选中淘汰页。在第一次扫描期间不改变访问位A。

  • 第二步:如果第一步失败,开始第二轮扫描,寻找A=0的页面,遇到的第一个这类页面为淘汰页。在第二轮扫描期间,所有扫描过的页面的访问位都置0。

  • 第三步:如果第二步也失败,则将指针返回到开始的位置,此时所有的访问位都复0。然后重复第一步,如果仍失败,必要时再重复第二步。

  • 双指针Clock置换算法:定时淘汰页面。前指针清除访问位,后指针淘汰页面。

7)页面缓冲算法PBA:

  • 影响页面换入换出效率的若干因素:

    ① 页面置换算法。

    ② 回写磁盘的频率。被修改过的页面,换出时应写回磁盘。如果建立一个已修改换出页面链表,可以暂不回写。当达到一定数目后,再将它们一起写入磁盘,能大大减少I/O操作的次数。

    ③ 读入内存的频率。已修改换出页面链表上的页面在回写前,如果要被再次访问,就不需要从外存调入,直接从链表中获取。

  • 页面缓冲算法PBA:该算法维护两个链表,一个是空闲页块链表,另一个是修改页块链表。被选中要置换的页,不是被立即换出,而是放入两个链表之一,如果页面未被修改,就将其物理块放入到空闲页块链表末尾,否则将其放入已修改页块链表末尾。

    这些空闲页块和已修改页块会在内存中停留一段时间。如果这些页面被再次访问,只需将其从相应链表中移出,就可返回进程,从而减少一次I/O开销。

    需调入的新页,将新页读入到空闲页块链表的第一个物理块中,然后将其从该链表中移出。

    当已修改的页面达到一定数目后,再将它们一起写入磁盘。这样能大大减少I/O操作的次数。

8)页面置换算法的比较:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-srRwRlWk-1609837286180)(C:\Users\Diviner\AppData\Roaming\Typora\typora-user-images\image-20210105152755902.png)]

9)访问内存的有效时间EAT:

  • ① 被访问页面在内存,且对应的页表项在快表中。设访问快表的时间为λ,访问内存的时间为t。在这里插入图片描述

  • ② 被访问页面在内存,但对应的页表项不在快表中。这种情况不缺页,但需两次访问内存。一次读页表,并更新快表,一次读数据。另外更新快表λ与读数据t可并行。在这里插入图片描述

  • ③ 被访问页面不在内存,缺页。设缺页中断处理时间为ϵ。在这里插入图片描述

  • ④ 上面的几种没有考虑快表的命中率和缺页率等因素。如果考虑快表的命中率a和缺页率f。
    在这里插入图片描述

  • ⑤ 如不考虑快表,仅考虑缺页率f,即上式中λ=0和a=0。在这里插入图片描述
    在这里插入图片描述
    七、抖动与工作集

1、抖动的概念

  • 由于虚拟存储器系统能从逻辑上扩大内存,人们希望在系统中能运行更多的进程,即增加多道程序度,以提高处理机的利用率。如果多道程度过高,整个系统的页面替换非常频繁,以致大部分系统时间都用在来回进行的页面调度上,只有一小部分时间用于进程的实际运算。此时系统效率急剧下降,甚至导致系统崩溃。这种现象称为颠簸或抖动(Thrashing)。

  • 抖动的后果:缺页率急剧增加,内存有效存取时间加长,系统吞吐量骤减(趋近于零),系统已基本不能完成什么任务。

2、抖动产生的原因

  • 内存不足;同时运行的进程数过多,进程频繁访问的页面数高于可用的物理块数,造成进程运行时频繁缺页;CPU利用率太低时,调度程序就会增加多道程序度,将新进程引入系统中,反而进一步导致处理机利用率的下降。
    在这里插入图片描述
    3、驻留集

  • 驻留集:指请求分页存储管理中给进程分配的物理页面(块)的集合。驻留集大小即是这个集合中元素的个数。每个进程的驻留集越小,则同时驻留内存的进程就越多,CPU利用率越高。进程的驻留集太小的话,则缺页率高,请求调页的开销增大。

  • 缺页率与系统为进程分配物理块的多少(驻留集的大小)有关。缺页率随着分配物理块的增加而减少。当物理块数达到某个数值时,物理块数的增加对缺页率没有明显影响。当物理块数小于某个数值时,减少一块都会对缺页率有较大影响。

4、工作集

  • 工作集:1968年Denning提出工作集理论。工作集就是一个进程在某一小段时间∆内访问页面的集合。把进程在某段时间间隔∆里,在时间t的工作集记为w(t,∆),变量∆称为工作集“窗口尺寸”。

  • 对于给定的页面走向,如果∆=10次存储访问,在t1时刻的工作集是W(t1,10)=(1,2,5,6,7),在t2时刻,工作集是W(t2,10)=(3,4)
    在这里插入图片描述

  • 工作集精确度与窗口尺寸∆的选择有关。如果∆太小,那么它不能表示进程的局部特征;如果∆为无穷大,那么工作集合是进程执行需要的所有页面的集合。

  • 如果页面正在使用,它就落在工作集中;如果不再使用,它将不出现在相应的工作集中。工作集是局部性原理的近似表示。如果能找出一个作业的各个工作集,并求出其页面数最大者,就可估计出该进程所需的物理块数。利用工作集模型可以进行页面置换。

5、工作集页面置换法

  • 工作集页面置换法:找出一个不在工作集中的页面,把它淘汰。

  • 利用工作集进行驻留集调整的策略:

    1)操作系统监视每个进程的工作集变化情况。

    2)只有当一个进程的工作集在内存中时才执行该进程。

    3)定期淘汰驻留集中不在工作集中的页面。

    4)总是让驻留集包含工作集(不能包含时则增大驻留集)

  • 工作集策略存在的问题:

    1)工作集过去的变化未必能够预示工作集未来的变化。

    2)记录每个进程的工作集变化开销太大。 (需要为每个进程维护一个基于时间顺序的访问页面队列)

    3)工作集窗口尺寸 ∆ 大小的最优值难以确定。

    4)工作集策略的思想是合理的,很多操作系统试图采用近似的工作集策略。

    5)操作系统可以不直接监视工作集大小,而是通过监视缺页率来达到类似效果。

6、抖动的预防方法

  • 1)采取局部置换策略:仅允许进程在自身范围内进行置换。即使发生抖动,也可以把影响限制在较小范围内。

  • 2)在处理机调度中引入工作集策略:

    操作系统跟踪每个进程的工作集,并为进程分配大于其工作集的物理块。

    操作系统跟踪每个进程的工作集,并为进程分配大于其工作集的物理块。

    如果所有工作集之和增加到超过了可用物理块的总数,操作系统会暂停一个进程,将其页面调出并且将其物理块分配给其他进程,防止出现抖动现象。

  • 3)挂起若干进程:当多道程序度偏高,已影响到处理机的利用率时,为了防止发生抖动,系统必须减少多道程序的数目。把某些低优先级的进程挂起,从而腾出内存空间。

  • 4)采用缺页频度法(Page Fault Frequency,PFF):根据进程缺页率的高低,动态增加或减少分配给该进程的物理块。
    在这里插入图片描述

3.5.3 请求分段虚拟存储管理

一、基本原理

  • 请求分段存储管理系统基本原理与请求分页存储管理系统一样,在请求分段存储管理系统中,作业运行之前,只要将当前需要的若干个段装入内存,便可启动作业运行(部分装入功能)。

  • 内存基于可变分区管理,执行过程中发现要访问的段不在内存则产生请求调段,把缺的段调入内存(请求调入功能),如果内存空间不够,则选择不用的段调出内存(置换功能),如果所有小的分区不能放下调入的段,但空闲空间的总和可以放下,则会进行紧凑操作,将空闲分区合并,再将调入的段放入内存。

二、数据结构

1、段表:

在这里插入图片描述

2、缺段中断机构:

  • 在请求分页段系统中,当访问的段不在内存,便产生一个缺段中断。

  • 缺段中断与缺页中断相似:

    1)缺段中断在指令执行期间产生和处理中断信号。

    2)缺段中断在一条指令执行期间,可能产生多次缺段中断(因为段是信息完整的逻辑单位,所以在一条指令执行期间,产生多次缺段中断的可能性不大)。

3、缺段中断:

在这里插入图片描述

4、地址变换:
在这里插入图片描述

三、动态链接

在地址转换时,要访问到某个分段时需要将其装入内存,这时在装入时才对它进行链接,从而避免不必要的链接。

在这里插入图片描述

四、部分装入

只需装入部分段就可以运行:

  • 1)只装入一个段即可:初始化段,或者主程序段等。

  • 2)装入两个段:程序段、数据段。

比请求分页装入部分页要简单。

因为各个段的大小不等,所以每个进程在内存占用的空间会不断改变,置换也要在整个内存空间进行。

可以认为是使用:可变分配全局置换。

五、请求调入与置换

1、请求调入

  • 在发生缺段中断时,一般只把缺的段调入内存。

  • 调入位置也可以和请求分页相似,从文件区或对换区装入。

2、置换

  • 置换算法和请求分页一样,最佳置换算法、先进先出置换算法、最近最久未使用置换算法等,可以从中选择。

  • 请求分段的关键是置换的不对等,置换出去一段后得到的空闲空间不一定能把缺的段调入内存。

  • 所以请求分段虚拟存储内存管理效果不佳。

六、请求段页式虚拟存储管理

  • 请求段页式虚拟存储管理的各方面管理总体与请求分页虚拟存储管理一致。

  • 主要的区别是作业有多个段组成,每个段再分页。装入时是把一个段或几个段(部分段)的部分页装入内存便可运行,在运行过程中若用到的段尚未在内存,首先产生缺段中断,把缺的段装入内存,修改段表,在装入缺的段时再执行缺页中断,把缺的页(段的部分页)装入内存。还可能没有发生缺段,而是已在内存的段的某页没有装入内存,则只产生缺页中断,把缺的页调入内存,如果空间不够,使用置换功能把暂不运行的页面换到外存上,把缺的页装入内存(置换是以页为单位)。

3.5.4 Linux系统的内存管理

一、Linux的多级页表结构:三级页表
在这里插入图片描述
二、Linux采用位图和链表两种方法管理内存页
在这里插入图片描述

三、内存交换

由内核的交换守护进程kswapd完成内存交换

  • ① 为页面换出做好准备

  • ② 写入交换设备或者回收一些内存页

为了决定是否回收一些内存页,系统设置两个量,分别表示上限值和下限值。

交换守护进程将用以下三种办法减少系统正在使用的内存页数:

  • ① 减少缓冲区和页高速缓存的大小。

  • ② 把共享内存页换到交换文件,从而释放物理内存。

  • ③ 将页面换出物理内存或者直接将它们抛弃。

猜你喜欢

转载自blog.csdn.net/diviner_s/article/details/112245241