存储器和虚拟存储器

程序的装入和链接

用户程序要在系统中运行,必须先将它装入内存,然后再将其转变成为一个可以执行的程序,通常都要经过以下几个步骤:
1)编译:由编译程序对用户源程序进行编译,形成若干个目标模块
2)链接:由链接程序将编译后形成的一组目标模块以及他们所需要的库函数链接在一起,形成一个完整的装入模块
3)装入:由装入程序将装入模块装入内存

1.程序的装入

  • 绝对装入方式

    在编译时,如果知道程序驻留在内存的什么位置,那么编译程序将产生绝对地址的目标代码
    1)程序中所使用的绝对地址,可在编译或汇编时给出,也可由程序员赋予
    2)只适合单道程序环境

  • 可重定位装入方式

    在多道程序环境下,目标模块的起始地址通常从0开始,程序中的其他地址都是相对于起始地址计算的。因此应采用可重定位装入方式,根据内存的当前情况,将装入模块装入到内存的适合位置。
    注意:在采用可从定位装入方式将装入模块装入内存后,会使装入模块中的所有逻辑地址与实际装入内存的物理地址不同。
    在这里插入图片描述

  • 动态运行时装入方式

    动态运行时的装入程序,在把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。
    1)装入内存后的所有地址都仍是相对地址
    2)为使地址转化不影响指令的执行速度,应设置一个重定位寄存器

2.程序的链接

  • 静态链接:在程序运行前,将目标模块及所需的库函数链接成一个完整的装配模块,以后不再拆开。

    静态链接方式:事先进行链接,以后不再拆开
    在这里插入图片描述
    将目标模块装配成装入模块时需要解决的两个问题:
    1)对相对地址进行修改
    2)变换外部调用符号

  • 装入时动态链接:指将用户源程序编译后所得的一组目标模块,在装入内存时,采用边装入边链接的链接方式

    用户源程序经编译后所得的目标模块,是在装入内存时,边装入边链接的,即在装入一个目标模块时,若发生一个外部模块调用事件,将引起装入程序去找出相应的外部目标模块,并将它装入内存,还要修改目标模块中的相对地址。
    优点:
    1)便于修改和更新
    2)便于实现对目标模块的共享

  • 运行时动态链接:指对某些目标模块的链接,是在程序执行中需要该目标模块时,才对他进行链接。

    运行时动态链接是将对某些模块的链接推迟到执行时才执行,即在执行过程中,当发现一个被调用模块尚未装入内存时,立即由OS去找到该模块并将之装入内存,把它连接到调用者模块上。
    凡执行过程中未被用到的目标模块,不会调入内存和链接,这样不仅加快程序的装入过程,而且节省大量的内存空间。

连续分配方式

连续分配方式:指为一个用户程序分配一个连续的内存空间。

1.单一连续分配

把内存分为系统去和用户区两部分,系统区仅提供给OS使用,通常放在内存低址部分,用户区是指除系统区以外的全部内存空间,提供给用户使用。但只能用于单用户、单任务的操作系统中
在这里插入图片描述

2.固定分区分配

  • 原理

    将内存用户空间划分为若干个固定大小的区域,在每个分区中只装入一道作业,便可以有多道作业并发执行。当有一空闲分区时,便可以再从外存的后备作业队列中,选择一个适合大小的作业装入该分区,当该作业结束时,可再从后备作业队列中找出另一作业调入该分区。

  • 划分分区的方法

    1)分区大小相等
    所有的内存分区大小相等,缺乏灵活性
    2)分区大小不等
    把内存划分成含有较多个较小的分区、适量的中等分区及少量的大分区

  • 实现

    为便于内存分配,通常将分区按大小进行排序,并为之建立一张分区使用表,其中包括每个分区的起始地址、大小及状态(是否已经分配)。当有一用户程序要装入时,由内存分配程序检索该表,从中找出一个能满足要求的、尚未分配的分区,将之分配给该程序,然后将该表项中的状态置为”已分配“;若未找大小足够的分区,则拒绝为该用户程序分配内存。
    在这里插入图片描述

3.动态分区分配

  • 原理

    动态分区分配是根据进程的实际需要,动态地为之分配内存空间。作业装入内存时,把可用内存分出一个连续区域给作业,且分区地大小正好适合作业大小的需要。
    分区的大小和个数依装入作业的需要而定

在实现过程中涉及:

  • 分区分配中的数据结构

    1)空闲分区表示
    空闲分区表:记录每个空闲分区的情况。每个空闲分区占一个表目。
    在这里插入图片描述
    空闲分区链:在每个分区的起始部分,设置一些用于控制分区分配的信息,以及用于链接各分区所用的前向指针;在分区尾部则设置一后向指针,将所有的空闲分区连链接成一个双向链。
    在这里插入图片描述

    2)已占分区说明表
    在这里插入图片描述

  • 分区分配算法
    把一个新作业装入内存,需按照一定的分配算法,从空闲分区表或空闲分区分区链中选出一分区分配给该作业

    1)首次适应算法(FF)
    FF算法要求空闲分区表以地址递增的次序排列。再分配内存时,从表首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止;然后按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲分区表中。若从头到尾不存在满足要求的分区,则分配失败。
    优点:优先利用内存低址部分的内存空间,保留了高址部分的大空闲区
    缺点:低址部分不断划分,产生小碎片;每次查找从低址部分开始,增加了查找的开销。

    2)循环首次适应算法
    在分配内存空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业。
    为实现算法,需要:
    1)设置一起始查询指针
    2)采用循环查找方式
    优点:使内存空闲分区分布均匀,减少查找的开销
    缺点:缺乏大的空闲分区

    3)所谓”最佳“是指每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区分配给作业,避免“大材小用”。要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链
    缺点:产生许多难以利用的小空闲区

    4)最坏适应算法
    最坏适应分配算法要扫描整个空闲分区表或链表,总是挑选一个最大的空闲区分割给作业使用。该算法要求将所有的空闲分区按其容量以大到小的顺序形成一空闲分区链,查找时只要看第一个分区能否满足作业要求
    优点:剩下的空闲区还可以利用,同时查找效率很高
    缺点:缺乏大的空闲区

    5)快速适应算法
    该算法又称为分类搜索法,是将空闲分区根据其容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设置一个空闲分区链表,系统中存在多个空闲分区链表,同时在内存中设置一张管理索引表,该表的每一个表项对应了一种空闲分区类型,并记录了改类型空闲分区链表表头的指针。
    优点:查找效率高,仅需要根据进程的长度,寻找到能容纳它的最小空闲区链表,并取下第一块进行分配即可。在进行空闲分区分配时,不会对任何分区产生分割,所以能保留大的分区,满足对打空间的需求,也不会产生内存碎片。
    缺点:在分区归还主存时算法复杂,系统开销大。浪费空间,空间分区划分细,浪费则严重。

  • 分区分配及回收操作

    分配内存
    利用某种分配方法,从空闲分区链(表)中找到所需大小的分区给。设请求的分区大小u.size,表中每个空闲分区的大小表示为m.size,若m.size-u.size<=size(规定的不在切割的分区大小),将整个分区分配给请求者,否则从分区中按请求的大小划出一块内存空间出去,余下部分留在空闲链中,将分配区首地址返回给调用者。

    回收内存
    在这里插入图片描述

4.可重定位分区分配

  • 动态重定位的引入

    在连续分配方式中,必须把系统或用户程序装入一连续的内存空间。如果在系统中只有若干个小分区,即使他们的容量总和大于要装入的程序,但由于这些分区不相邻,也无法将程序装入内存。
    解决方法:将内存中的所有作业进行移动,使它们全部邻接,这样把原来分散的小分区拼接成大分区,这种方法称为“拼接”或“紧凑”。
    缺点:用户程序在内存中的地址发生变化,必须重定位。

  • 动态重定位的实现

    在动态运行时装入的方式,将相对地址转换为物理地址的工作在程序指令真正要执行时才进行。地址转换需要重定位寄存器的支持。程序执行时访问的内存地址是相对地址与重定位寄存器中的地址相加而成。
    在这里插入图片描述

  • 动态重定位分区分配算法

    动态重定位分区分配算法与动态分区分配算法基本相同,差别在于增加了紧凑的功能
    在这里插入图片描述

5.对换

  • 对换的引入

    1)阻塞进程占据大量内存空间
    2)许多作业在外存而不能进入内存运行
    对换:把内存中暂时不能运行的进程或者暂时不用的程序和数据,调到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程和进程所需要的程序和数据调入内存。

  • 对换的分类

    1)整体对换(或进程对换):以整个进程为单位
    2)页面对换或分段对换:以页或段为单位
    实现进程对换,系统必须具备的功能:
    1)对换空间的管理
    2)进程的换出
    3)进程的换入

  • 对换空间管理

    在这里插入图片描述

  • 进程的换出与换入

    1)进程的换出:
    系统首先选择处于阻塞状态且优先级最低的进程作为换出进程,然后启动盘块,将该进程的程序和数据传送到磁盘的对换区上。
    2)进程的换入
    系统应定时查看所有进程的状态,从中找出“就绪“状态但已换出的进程,将换出进程最久的进程作为换入进程,将之换入,直至已无可换入的进程或无可换出的进程为止。

基本分页存储管理方式

连续分配方式会形成“碎片",虽然可以通过”紧凑“解决,但开销大。如果允许将一个进程直接分散地装入许多不相邻的分区中,则无需”紧凑”,由此产生离散的分配方式。
分类:
1)分页存储管理方式:离散分配的基本单位是页
2)分段存储管理方式;离散分配的基本单位是段
基本的分页存储管理方式(或存分页存储管理方式):不具备页面对换功能,不具有支持实现虚拟存储器的功能,要求把每个作业全部装入内存后方能运行。

1.页面与页表

  • 页面

    分页式存储管理的原理:
    将一个进程的逻辑地址空间分成若干个大小相等的片称为页面或页,并为各页加以编号,从0开始。同时把内存空间分成与页面相同大小的若干个存储块,称为块或页框。
    在为进程分配内存时,以块为单位将进程的若干个页分别装入到多个可以不相邻的物理块中。进程的最后一页经常装不满一块而形成”页内碎片"。

    基本分页存储管理(简单页式存储管理)的原理
    系统若满足一个作业要求的全部块数,次作业才能被抓入内存,否则不为它分配任何内存。

    请求分页式存储管理的原理
    运行一个作业时,并不要求把该作业的全部程序和数据都装入内存,可以只把目前要执行的几页调入内存的空闲块中,其余的仍保存在外存中,以后根据作业运行的需要再调入内存。

    页面大小的选择:
    1)由机器的地址结构所决定的,即由硬件所决定
    2)某一机器只能采用一种大小的页面
    小:内碎片小,内存利用率高,但页面数目多,使页面过长,占大量内存,管理开销大。
    大:页面短,管理开销小,内碎片大,内存利用率低,页面大小应适中,是2的幂,通常是512B~8KB

  • 地址结构
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 基本分页式存储管理(简单页式存储管理)的实现

    进程的每一页离散的存储在内存的任一存储块中,为方便查找,系统为每一进程建立一张页面映像表,简称页表。
    页表实现了从页号到物理块号的地址映射。
    在这里插入图片描述

2.地址变换机构

为了能将用户地址空间的逻辑地址转换为内存空间的物理地址,在系统中必须设置地址变换机构。
地址变换机构实现从逻辑地址到物理地址的转换,由于页内地址与物理地址是一 一对应的,因此地址变换机构的任务是借助页表,将逻辑地址中的页号转换为内存中的物理块号。
在这里插入图片描述

  • 基本的地址变换机构

    页表的功能可以由一组专门的寄存器来实现,一个页表项用一个寄存器。但寄存器成本高,系统页表可能很大, 所以页表大多常驻内存。
    在系统中只设置一个页表寄存器PTR,在其中存放页表的内存中的始址和页表的长度。平时,进程没有执行时,页表的始址和页表长度存放在进程的PCB中,当调度到进程时,才将这两个数据装入到页表寄存器中。
    在这里插入图片描述

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

    由于页表是存放在内存中的,CPU在每存取一个数据时,需要两次访问内存:
    1)第一次:访问页表,找到指定页的物理块号,将块号与页内偏移量拼接形成物理地址。
    2)第二次:从第一次所得地址中获得所需数据,或向此地址中写入数据。

    存储器利用率提高,处理器处理速度降低
    解决方法;在地址变换机构中,增设一个具有并行查询能力的特殊高速缓存寄存器,称为"联想存储器”或“快表“。
    在这里插入图片描述

3.两级和多级页表

基本分段存储管理方式

1.分段存储管理方式的引入

在这里插入图片描述
在这里插入图片描述

引入分段存储管理方式,主要为了满足用户和程序员的需要

  • 便于编程:用户常把自己的作业按逻辑关系划分成若干个段,每段都由自己的名字,且都从零开始编址,这样,用户程序在执行中可用段名和段内地址进行访问。
  • 分段共享:在实现程序和数据的共享时,常常以信息的逻辑单位为基础,而分页系统中的每一页只是存放信息的物理单位,其本身没有完整的意义,因而不便于实现信息的共享,而段却是信息的逻辑单位,有利于信息的共享。
  • 分段保护:信息保护是对相对完整意义的逻辑单位(段)进行保护
  • 动态链接:当运行过程中有需要调用某段时,再将该段(目标程序)调入内存并链接起来。所以,动态链接是以段为基础的。
  • 动态增长:在实际系统中,有些数据段会不断地增长,而事先却无法直到数据段会增长到多大,分段存储管理方式能较好地解决这个问题。

2.分段系统的基本原理

  • 分段

    在分段存储管理方式中,作业地址空间被划分为若干个段,每个段定义了一组逻辑信息,都有自己的名字。通常用段号代替段名,每段从0开始编制,并采用一段连续地址空间。段长由逻辑信息组的长度决定。整个作业的地址空间分多个段,逻辑地址由段号(段名)和段内地址所组成。
    在这里插入图片描述

  • 分段存储管理的原理

    作业分为若干个段。每段分配一个连续的内存区,由于各段的长度不等,这些区域也就大小不一。作业各段间不要求连续。
    1)基本分段式存储管理的原理:在段式存储管理原理的基础上,将整个作业的全部段装入内存。
    2)请求分段式存储管理的原理:在段式存储管理原理的基础上,不要求将整个作业的全部段装入内存。只装入作业的几段即可运行,其余段根据运行需要再装入内存。

  • 基本分段存储管理的事先

    1)段表
    为使程序正常运行,须在系统中为每个进程建立一张段映射表,简称”段表“。每个段在表中占有一个表项。
    段表结构:段号、段在内存中的起始地址、段长
    段表可以存放在寄存器中,但更多的是存放在内存中。
    段表用于实现从逻辑段到物理内存区的映射在这里插入图片描述

  • 地址变换机构

    在系统中设置段表寄存器,用于存放段表始址和段表长度,以实现进程的逻辑地址到物理地址的变换。
    当段表存放在内存中时,每访问一个数据,都需要访问两次内存,降低了计算机的速率。
    解决方法:设置联想寄存器,用于保存最近常用的段表项。
    在这里插入图片描述

  • 分页和分段的主要区别

    相似点:采用离散分配方式,通过地址映射机构实现地址变换。
    不同点:
    1)页是信息的物理单位,分页是为了满足系统的需要;段是信息的逻辑单位,含有意义相对完整的信息,是为了满足用户的需要。
    2)页的大小固定且由系统确定,由系统把逻辑地址分为页号和页内地址,有机器硬件实现;段的长度不固定,取决于用户程序,编译程序对源程序编译时根据信息的性质划分。
    3)分页的作业地址空间是一维的;分段的作业地址空间是二维的。

3.信息共享

分段系统的一个突出优点是易于实现段的共享和保护,允许若干个进程一个或多个分段给,且对段的保护十分简单易行。分页系统中虽然也能实现程序和数据的共享,但远不如分段系统方便。
在这里插入图片描述
在这里插入图片描述

4.段页式存储管理方式

分段和分页存储管理方式各有优缺点。把两者结合成一种新的存储管理方式—段页式存储管理方式,具有两者的长处。
>基本原理
先将用户程序分成若干段,再把每个段分成若干页,并为每个段赋予一个段名。
基本段页式存储管理:把作业的所有段装入内存方可运行
请求段页式存储管理:没必要把整个作业装入内存,可把作业的几段或几页装入内存即可运行。
段页式系统地址结构:段号、段内页号、段内地址。在这里插入图片描述

  • 地址变换过程

    在段页式系统中,为了实现地址变换,增加一个段表寄存器,用来存放段表始址和段长。在这里插入图片描述

    在段页式系统中,为了获得一条指令数据,需要三次访问内存:
    第一次:访问内存中的段表,取得页表始址
    第二次:访问内存中的页表,取得该页所在的物理块号,将块号与内存地址形成物理地址
    第三次:根绝第二次所得的地址,取出指令或数据
    缺点:访存次数增加两倍
    解决方法:增设高速缓冲寄存器

虚拟存储器的基本概念

1.虚拟存储器的引入

  • 常规存储器管理方式的特征

    一次性:作业在运行前一次性的全部装入内存
    驻留性:作业装入内存后,便一直驻留在内存中,直至作业运行结束。

  • 程序运行的局部性原理

    在这里插入图片描述

  • 虚拟存储器的定义

    基于局部性原理,应用程序在运行前,没有必要全部装入内存,仅将当前要运行的部分页面或段先装入内存即可运行,其余部分暂留在外存上。
    虚拟存储器:是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。其逻辑容量由内存容量和外存容量之和所决定,其运行速度接近于内存速度,而每位的成本却接近于外存。

2.虚拟存储器的实现方法

在虚拟存储器中,允许将一个作业分多次调入内存。如果采用连续分配方式,不仅造成内存资源的浪费,而且无法从逻辑上扩大内存容量。因此,虚拟存储器的实现都是建立在离散分配的存储管理方式的基础上。

  • 请求分页系统

    在分页系统的基础上,增加了请求调页功能和页面置换功能所形成的页式虚拟存储系统。它允许只装入部分页面的程序(及数据),便启动运行。以后再通过调页功能及页面置换功能,陆续将即将要运行的页面调入内存,同时把暂不运行的页面换出到外存上。置换时以页面为单位。
    为实现请求调页和置换功能,系统必须提供必要的支持:
    硬件支持:
    ①请求分页的页表机制
    ②缺页中断机构
    ③地址变换机构
    软件支持:
    ①实现请求调页的软件
    ②实现页面置换的软件

  • 请求分段系统

    在分段系统的基础上,增加了请求调段功能和分段置换功能所形成的段式虚拟存储结构。它允许只装入若干段的程序(及数据),便启动运行。以后再通过调段功能及段的置换功能,把暂不运行的段调出,同时调入即将运行的段。置换时以段位为单位。
    为实现请求调段和置换功能,系统必须提供必要的支持:
    硬件支持:
    ①请求分段的段表机制
    ②缺段中断机构
    ③地址变换机构
    软件支持:
    ①实现请求调段的软件
    ②实现段的置换的软件

3.虚拟存储器的特征

1)多次性:一个作业被分成多次调入内存运行
2)对换性:允许在作业的运行过程中进行换出、换入。
3)虚拟性:能够从逻辑上扩充内存容量,使用户看到的内存容量远大于实际内存容量

>虚拟性以多次性和对换性为基础
多次性和对换性又必须建立在离散分配的基础上。

请求分页存储管理方式

1.请求分页中的硬件支持

  • 页表机制

    在请求分页系统中所需的主要数据结构是页表。基本作用仍是将用户地址空间中的逻辑地址转换为内存空间中的物理地址。由于只将程序的一部分装入内存,还有一部分在外存中,因此需在页表中增加若干项,供程序或数据在换进、换出时参考。
    在这里插入图片描述

  • 缺页中断机构

    在请求分页系统中,每当要访问的页面不在内存时,便产生一缺页中断,请求OS将所缺页调入内存。
    缺页中断作为中断,同样需要经历诸如保护CPU环境、分析中断原因、转入缺页中断处理程序仅需处理、恢复CPU环境等几个步骤。但缺页中断是一种特殊的中断,与一般中断有明显区别:
    1)在指令执行期间产生和处理中断信号
    2)一条指令在执行期间,可能产生多次缺页中断
    在这里插入图片描述

  • 地址变换机构

    请求分页系统中的地址变换机构,是在分页系统地址变换机构的基础上,再为实现虚拟存储器而增加了某些功能而形成的,如产生和处理缺页中断,以及从内存中换出一页的功能等。
    在这里插入图片描述

2.内存分配策略和分配算法

  • 最小物理块数的确定

    最小物理块数,指能保证进程正常运行所需的最小物理块数。当系统为进程分配的物理块数少于此值时,进程将无法运行。进程应获得的最小物理块数与计算机的硬件结构有关,取决于指令的格式、功能和寻址方式。

  • 物理块的分配策略
    在请求分页系统中,可以采取两种内存分配策略,即固定和可变分配策略。在进行置换时,也可以采取两种策略,即全局置换和局部置换,于是组合出三种和合适的策略:
    1)固定分配局部置换

    为每个进程分配一定数目的物理块,在整个运行期间不再改变。采用该策略时,如果进程在运行中发现缺页,只能从该进程在内存中的n个页面中选出一页换出,然后再调入一页。
    困难:应为每个进程分配对少物理块难以确定

    2)可变分配全局置换

    在采用这种策略时,先为系统中的每个进程分配一定数目的物理块,而OS自身也保持一个空闲的物理块队列。如果某进程发生缺页时,由系统从空闲的物理块队列中,取出一个物理块,分配给该进程,并将欲调入的页装入其中。当空闲物理块队列中的物理块用完后,OS才能从系统的任一进程中选择一页调出。

    3)可变分配局部置换

    为每个进程分配一定数目的物理块,如果某进程发生缺页时,只允许从该进程在内存的页面中选出一页换出,不会影响其他进程执行。如果进程在进程中频繁发生缺页中断,则系统再为进程分配若干物理块;如果进程在运行中缺页率特别低,则适当减少分配给该进程的物理块。

  • 物理块的分配算法
    在采用固定分配策略时,如何将系统中可供分配的物理块分配给各个进程,可采用以下几种算法:
    1)平均分配算法:将系统中所有可供分配的物理块,平均分配各个进程

    缺点:未考虑各进程本身的大小

    2)按比例分配算法:根据进程的大小按比例分配物理块

    在这里插入图片描述

3)考虑优先权的分配算法

在实际应用中,为了照顾重要的、急迫的作业尽快完成,应为它分配较多的内存空间
方法:
把内存中可供分配的物理块分为两部分:
1)一部分按比例分配给各进程
2)一部分则根据各进程的优先权,适当地增加其响应份额,分配给各进程

3.调页策略

  • 何时调入页面:为了确定系统将进程运行时所缺页面调入内存的时机,可采取预调入策略或请求调页策略
    1)预调入策略

    采用以预测为基础的预调页策略,将那些预计在不久之后便会被访问的页面,预先调入内存。
    主要用于进程的首次调入,由程序员指出应该先调入哪写页。

    2)请求调页策略

    当程序在运行中需要访问某部分程序和数据时,若发现其所在的页面不在内存,便立即提出要求,由OS将其所需要的页面调入内存。
    优点:有请求调页策略所确定调入的页,一定会被访问;请求调页策略比较容易实现。
    缺点:每次仅调入一页,需要花费较大的系统开销,增加了磁盘I/O的启动频率。

  • 从何处调入

    将请求分页系统的外存分为文件区和对换区
    每当发生缺页时,系统应从何处将缺页调入内存,可分为:
    1)系统拥有足够的对换区空间,可以全部从对换区调入所需页面,以提高调页速度
    2)系统缺少足够的对换区空间,凡不会被修改的文件,直接从文件区调入;当换出这些页面时,因为未修改不用换出,再调入时仍从文件区调入。可能被修改的部分,换出时需调到对换区,换入时从对换区调入。

  • 页面调入过程

    1)每当程序索要访问的页面未在内存时,便向CPU发出一缺页中断,中断处理程序首先保护CPU环境,分析中断原因后,转入缺页中断处理程序。
    2)程序通过查找页表,得到该页在外存上的物理块后,如果此时内存能容纳新页,则启动磁盘I/O将所缺之页调入内存,然后修改页表。
    3)如果内存已满,则须按照某种置换算法从内存中选出一页准备换出;如果该页未被修改过,可不必写回磁盘;但如果此页已被修改,则必须将它写回磁盘,然后将所缺的页调入内存,并修改页表中的相应表项,置其存在位为”1“,并将此页表项写入快表。
    4)在缺页调入内存后,利用修改后的页表,形成所要访问的物理地址,再去访问内存数据。整个页面调入过程对用户是透明的。

页面置换算法在这里插入图片描述

1.最佳置换算法和先进先出算法

最佳置换算法是一种理想化的算法,具有最好的性能,但难于实现。先进先出置换算法最直观,但可能性能最差,故应用极少。

  • 最佳置换算法

    其所选择的被淘汰的页面,将是以后永不再用的,或许是在最长时间内不再被访问的页面。
    优点:保证获得最低的缺页率
    缺点:无法预知一个进程在内存的若干个页面,哪个在未来最长时间内不再被访问
    算法无实现,但可评价其他算法在这里插入图片描述

  • 先进先出置换算法

    算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰
    算法实现简单,只需把一个进程已调入内存页面,按先后次序链接成一个队列,并设置一个指针。使它总是指向最老的页面
    算法与进程的实际运行规律不相适应,因为进程中的某些页面经常被访问,但先进先出置换算法不能保证这些页面不被淘汰。
    在这里插入图片描述

  • Belady现象

    如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。发生在FIFO(先进先出)置换算法。

2.最近最久未使用(LRU)算法

  • LRU置换算法的描述

    算法根据页面调入内存后的使用情况进行决策。由于无法预测各页面将来的使用情况,只能利用“最近的过去“作为”最近的将来“的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当需淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰。
    在这里插入图片描述

  • LRU置换算法的硬件支持

    LRU置换算法虽然较好,但需要较多的硬件支持,为了了解一个进程在内存中的各个页面各有多少时间未被进程访问,以及如何快速地直到哪一页是最近最久未使用的页面,需要以下两类硬件之一的支持:
    1)寄存器
    2)栈

    寄存器
    为每个在内存中的页面配置一个移位寄存器,用来记录某进程在内存中各页的使用情况。移位寄存器表示为:
    R=Rn-1Rn-2Rn-3…R2R1R0
    当进程访问某页物理块时,要将相应寄存器的Rn-1位置成1。此时,定时信号将每隔一定时间将寄存器右移一位。如果把n位寄存器的数看作一个整数,那么具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。在这里插入图片描述


    利用一个特殊的栈来保存当前使用的各个页面的页面号。每当进程访问某页面时,边疆该页面的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用页面的页面号。在这里插入图片描述

3.Clock置换算法

  • 简单的Clock置换算法(又称为最近未使用算法(NRU))是LRU和FIFO的折衷。

    原理:NRU算法是根据访问位来确定谁是最近一个时期内未被访问的页,循环扫描,如要到的访问位是0,则选中置换,如遇到的访问位是1,则将其改为0,让其继续驻留内存了,继续循环扫描下一个。
    每页有一个使用标志位(use bit),若该页被访问则置标志位为1。置换时采用一个指针,从当前指针位置开始按地址先后检查各页,寻找use bit=0的页面作为被置换页。指针经过的use bit=1的页都修改use bit=0,若检查到队列的最后一个页面时,访问位仍为1,则再返回到队首去检查第一个页面。

  • 改进的Clock置换算法(改进的NUR)

    原理:改进型NUR算法是通过多轮扫描访问位和修改位来一起确定谁是淘汰的页。
    第一次扫描寻找A=0,M=0的页;若失败进行第二次扫描,寻找A=0,M=1的页,同时把遇到的A为1的都改为0;若仍失败,进行第三次扫描,此时重复第一次扫描的任务,寻找A=0,M=0的页面;若仍失败,则重复第二步扫描,此时一定能找到淘汰页。

4.其它置换算法

  • 最少使用置换算法LFU
    选择到当前时间为止被访问次数最少的页面被置换。
    1)基本方法:记录每个页面的访问次数最少访问的页面首先考虑淘汰
    2)实际采取的方法:为页面设置移位寄存器

请求分段存储管理方式

在请求分段系统中,程序运行之前,只需先调入若干个分段(不必调入所有的分段),便可启动运行。当所访问的段不在内存中时,可请求OS蒋所缺的段调入内存。

  • 请求分段中的硬件支持
    1)段表机制

    在请求分段系统中所需要的主要数据结构是段表。由于在应用程序的许多段中,只有部分段装入内存,其余的一些段仍留在外存上,故须在段中增加若干项,以供程序在调进、调出时参考。在这里插入图片描述

  • 缺段中断机构

    在请求分段系统中,每当发现运行进程所要访问的段为调入内存时,便有缺段中断机构产生一缺段中断信号,进入OS后由却段中断处理程序将所需的段调入内存。
    缺段中断同样需要在一条指令的执行期间,产生和处理中断,以及在一条指令执行期间,可能产生多次缺段中断。但不会出现一条指令被分割在两个分段或一组信息被分割在两个分段中的情况。

  • 地址变换机构

    请求分段系统中的地址变换机构,是在分段系统地址变换机构的基础上形成的。因为被访问的段并非全在内存,因而在地址变换时,若发现要访问的段不在内存,必须先将所缺的段调入内存,并修改段表,然后次啊能利用段表进行地址变换。在地址变换机构中需增加缺段终端的处理及请求等功能。

在这里插入图片描述

  • 共享段表在这里插入图片描述
  • 共享段的分配

    为共享段分配内存时,对第一个请求使用该共享段的进程,由系统为该共享段分配一物理区,再把共享段调入该区,同时将该区的始址填入请求进程的段表的相应项中,还需再共享段表中增加一表项,填写有关数据,把count设置为1;之后当又有其他进程需要调入该共享段时,无需再为该段分配内存,只需在调用进程的段表中,增加一表项,填写该共享段的物理地址;在共享段的段表中,填上调用进程的进程名、存取控制等,再执行count=count+1的操作。

  • 共享段的回收

    当共享该段的进程不再需要该段时,应将该段释放,包括撤销在该进程段中共享段所对应的表项,以及执行count=count+1操作。如果结果为0,则需由系统回收该共享段的物理内存,以及取消在共享段中该段对应的表项,否则只取消调用者在共享段中的有关记录。

  • 分段保护

    在这里插入图片描述
    在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值