第五章:内存管理

版权声明:本文为博主DarkAngel1228原创文章,未经博主允许不得转载。 https://blog.csdn.net/DarkAngel1228/article/details/82825602
计算机系统中的存储器可以分成两类:内存储器(内存)和外存储器(外存)
处理器可以直接直接访问内存,但不能直接访问外存
CPU要通过启动相应的输入/输出设备后才能使外存与内存交换信息

5.1 基本概念

1.1 存储体系

  • 存储设备速度明显慢于同级别CPU速度
  • 任何存储设备都无法在速度与容量两个方面同时满足用户的需

在这里插入图片描述

  • 少量的、非常快速、昂贵、内容易变的高速缓存器(Cache),通常是几百KB的数量级。

  • 若干兆字节、中等速度、中等价格、内容易变的内存(RAM),通常是千MB的数量级。

  • 低速、价廉、内容不易变的外存(磁盘),通常是百到千GB的数量

1.2 存储管理的任务

任何程序和数据以及各种控制用的数据结构都必须占用一定的存储空间,因此存储管理直接影响系统性能。

内存空间:是由存储单元(字节或字)组成的一维连续的地址空间。
内存空间的作用:用来存放当前正在运行程序的代码及数据,是程序中指令本身地址所指的程序计数器所指的存储空间。
内存空间一般分为两部分:
  1. 系统区:用以存放操作系统常驻内存部分,用户不能占用这部分空间
  2. 用户区:分配给用户使用,用于装入并存放用户程序和数据,这部分的信息随时都在发生变化。

存储管理实质上就是管理供用户使用的那部分空间

内存管理问题主要包括:
  1. 内存管理方法

  2. 内存的分配和释放算法

  3. 虚拟存储器的管理

  4. 控制内存和外存之间的数据流动方法

  5. 地址变换技术和内存数据保护与共享技术

单道、单用户系统中,至少也要把它分成两个区域:
  1. 在一个区域内放系统软件,如操作系统本身

  2. 在一个区域内放用户程序,如应用系统本身

多道、多用户系统中,需要将内存划分成更多的区域,以便支持多道程序。要求:
  • 充分利用内存,为多道程序并发执行提供存储基础

  • 尽可能方便用户使用

    1. 操作系统自动装入用户程序
    2. 用户程序中不必考虑硬件细节
  • 系统能够解决程序空间比实际内存空间大的问题

  • 程序的长度在执行时可以动态伸缩

  • 内存存取速度快

  • 存储保护与安全

  • 共享与通信

  • 及时了解有关资源的使用状况

  • 实现的性能和代价合理

操作系统中存储管理的主要任务:

一.内存的分配和回收
内存的分配和回收:一个有效的存储分配机制,应对用户提出的需求给予响应,为之分配相应的存储空间;在用户程序不再需要它时及时回收,以供其它用户使用。为此,应具有以下功能:
  • 记住每个存储区域的状态。

  • 实施分配

  • 回收

为实现上述功能,必须引入分配表格,通称为内存分配表,包括:

  • 位示图表示法:用一位(Bit)表示一个空闲页面(0空闲,1占用)

  • 空闲页面表:包括首页面号和空闲页面个数,连续若干页面作为一组登记在表中

  • 空闲块表:空闲块首址和空闲块长度,没有记录的区域为进程所占用

内存分配有两种方式:

  • 静态分配:
    程序要求的内存空间是在目标模块连接装入内存时确定并分配的,并且在程序运行过程中不允许再申请或在内存中“搬家”,即分配工作是在程序运行前一次性完成

  • 动态分配:
    程序要求的基本内存空间是在目标模块装入时确定并分配的。但是在程序运行过程中,允许申请附加的内存空间或在内存中“搬家”,即分配工作可以在程序运行前及运行过程逐步完成

动态存储分配具有较大灵活性:

  • 不需要一个程序的全部信息进入内存后运行,而是在程序运行中需要时系统自动调入内存。

  • 程序当前暂不使用的信息可以不进入内存,提高内存利用率

二.存储共享

  • 概念:
    指两个或多个进程共用内存中的相同区域,这样不仅能使多道程序动态地共享内存,提高内存利用率,而且还能共享内存中某个区域的信息。

  • 共享的内容包括:
    代码共享和数据共享,特别是代码共享要求代码必须是纯代码。

  • 存储共享的一个目的是通过代码共享节省内存空间,提高内存利用率;另一个目的是通过数据共享实现进程通信。

三.存储保护

  • 存储保护的目的:
    为多个程序共享内存提供保障,使在内存中的各程序只能访问其自己的区域,避免各程序间相互干扰。存储保护通常需要有硬件支持,并由软件配合实现。

  • 存储保护的内容包括:
    保护系统程序区不被用户有意或无意的侵犯;
    不允许用户程序读写不属于自己地址空间的数据,如系统区地址空间、其它用户程序的地址空间。

1)地址越界保护:每个进程都具有相对独立的进程空间,如果进程在运行时所产生的地址超出其地址空间,则发生地址越界。

  • 地址越界可能侵犯其它进程的空间,影响其它进程的正常运行;

  • 地址越界也可能侵犯操作系统系统空间,导致系统混乱。

处理方法:对进程所产生的地址必须加以检查,发生越界时产生中断,由操作系统进行相应处理。

2)权限保护:对于允许多个进程共享的公共区域,每个进程都有自己的访问权限。

  • 对属于自己区域的信息,可读可写

  • 对公共区域中允许共享的信息或获得授权可使用的信息,可读不可修

  • 对未获得授权使用的信息,不可读不可写

发生地址越界或非法操作时,由硬件产生中断,进入操作系统处理

四.“扩充”内存容量

  • 在硬件支持下实现,软件、硬件相互协作,将内存和外存结合起来统一使用。
  • 借助虚拟存储技术或其它交换技术,达到在逻辑上扩充内存容量,即为用户提供比内存物理空间大得多的地址空间,使用户感觉他的程序是在这样一个大的存储器上运行。

1.3 地址转换

存储器以字节(每个字节为8个二进制位)为编排单位,每个字节都有一个地址与其对应。
  • 绝对地址 :
    假定存储器的容量为n字节,其地址编号顺序为0,1,2,…,n-1。这些地址称为“绝对地址”,与绝对地址对应的内存空间为“物理地址空间”。

  • 逻辑地址 :
    用户程序中使用地地址称为“逻辑地址”,对应 “逻辑地址空间”

地址重定位

     当用户程序进入计算机系统请求执行时,存储管理要为它分配合适的内存空间,
 这个分配到的内存空间可能是从某单元开始的一组连续的地址空间。
     该地址空间的起始 址是不固定的,而且逻辑地址与分到的内存空间的绝对地址经常不一致!。
 因此,每个逻辑地址在内存中也没有一个固定的绝对地址与之对应。
     为了保证程序的正确执行,必须根据分配给程序的内存区域对程序中指令和数据的存放
 地址进行重定位,即要把逻辑地址转换成绝对地址。

把逻辑地址转换成绝对地址的工作称为“地址重定位”或“地址转换”,又称“地址映射”。
  

1.地址映射过程通常是由硬件完成的
2.地址映射是将虚拟地址转成物理地址
3.页表项的一些内容是硬件确定的
4.根据页表项的有效位确定所需访问的页面是否已经在内存
5.如果没有采用分页管理或者直接访问了快速定位快,则不用访问页目录和页表

重定位的方式有“静态重定位”和“动态重定位”两种:

1) 静态重定位

由于地址转换工作是在程序开始执行前集中完成的,所以在程序执行过程中就无需再进行地址转换工作,这种地址转换方式称为“静态重定位”。
在装入一个程序时,把程序中指令地址和数据地址全部转换成绝对地址
在这里插入图片描述

2) 动态重定位

在装入程序时,不进行地址转换,而是直接把程序装入到分配的内存区域中。在程序执行过程中,每当执行一条指令时都由硬件的地址转换机构将指令中的逻辑地址转换成绝对地址。这种方式的地址转换是在程序执行时动态完成的,故称为“动态重定位”。
动态重定位由软件和硬件相互配合来实现。硬件要有一个地址转换机构,该机构可由一个基址寄存器和一个地址转换线路组成。

在这里插入图片描述

    存储管理为程序分配内存区域后,装入程序把程序直接装到所分配的区域中,
并把该内存区域的起始地址存入相应程序进程的进程控制块中。
    当程序进程被调度占用处理器时,随同现场信息的恢复,程序所占的内存
区域的起始地址也被存放到“基址寄存器”中。
    程序执行时,处理器每执行一条指令都会把指令中的逻辑地址与基址寄存器
中的值相加得到绝对地址,然后按绝对地址访问内存

5.2 分区存储管理方案

基本思想 : 把内存划分成若干个连续区域、称为分区,每个分区装入一个运行程序。

分区的方式:固定分区、可变分区

5.2.1 固定分区

基本思想

固定分区是指系统先把内存划分若干个大小固定的分区、一旦划分好,在系统运行期间便不再重新划分。
程序运行时必须提供对内存资源的最大申请量。

内存分配表

用于固定分区管理的内存分配表是一张分区说明表,按顺序每个分区在分区说明表中对应一个表目。
表目内容包括:分区序号、分区大小、分区起始地址以及使用状态(空闲或占用)

5.2.2 可变分区

1.基本思想

是指系统不预先划分固定分区,而是在装入程序时划分内存分区,使为程序分配的分区的大小正好等于该程序的需求量,且分区的个数是可变的。

在这里插入图片描述

2.移动技术

解决碎片问题的办法是在适当时刻进行碎片整理,通过移动内存中的程序,把所有空闲碎片合并成一个连续的大空闲区且放在内存的一端,而把所有程序占用区放在内存的另一端,这一技术叫“移动技术”或“紧缩技术”

采用移动技术需要注意一下几点:

  • 移 动技术会增加系统的开销。增大系统运行时间。

  • 移动是有条件的。不是任何在内存中的作业都能随时移动。
    采用移动技术时尽可能减少需要移动的作业数和信息量

在这里插入图片描述

3.可变分区的实现

采用可变分区方式管理时,要有硬件的地址转换机构作支持。
硬件设置两个专用的控制寄存器:基址寄存器和限长寄存器

基址寄存器用来存放程序所占分区的起始地址
限长寄存器用来存放程序所占分区的长度

当程序被装到所分配的分区后,把分区的起始地址和长度作为现场信息存入该作业进程的进程控制块中。
在这里插入图片描述

    为了实现可变分区的管理,必须设置某种数据结构用以记录内存分配的情况,
确定某种分配策略并且实施内存的分配与回收。内存分配表由两张表格组成:
    一个是已分配区表,记录已装入的程序在内存中占用分区的起始地址和长度,
用标示位指出占用分区的程序名。
    另一个是空闲区表,记录内存中可供分配的空闲区的起始地址和长度,
用标志位指出该分区是未分配的空闲区。

在这里插入图片描述

4.空闲分区的分配策略

1)最先适应算法

又称顺序分配算法,首次适应算法。
倾向于优先使用地地址空闲区
当接到内存申请时,顺序查找分区说明表,找到第一个满足申请长度的空闲区,将其分割并分配。此算法简单,可以快速作出分配决定!
在这里插入图片描述

2)最优适应算法

当接到内存申请时,查找分区说明表,找到第一个能满足申请长度的最小空闲区,
将其分割并分配。
空闲区按照空闲区大小递增排列
此算法最节约空间,因为它尽量不分割大的空闲区;其缺点是可能
会形成很多很小的空闲区域,称作碎片。

3)最坏适应算法:

当接到内存申请时,查找分区说明表,找到能满足申请要求的最大的空闲区。

基本思想:在大空闲区中装入信息后,分割剩下的空闲区相对也很大,还能用于装入其它程序。

优点:可以避免形成碎片,而缺点是分割了大的空闲区后,
如果再遇到较大的程序申请内存时,无法满足要求的可能性较大。

4)下次适应算法:

当接到内存申请时,查找分区说明表,从上一次分配的位置开始扫描内存,
选择下一个大小足够的可用块。

5.分区的回收

当用户程序执行结束后,系统要回收已使用完毕的分区,将其记录在空闲区表中。

在收回空间时,应首先检查是否有与回收区相邻的空闲区,
即检查相邻的空闲区表中标志为“未分配”的栏目,以确定是否有相邻空闲区,
若有,则应合并一个空闲区登记。

  • 如果空闲区表中第i个登记栏中“起始地址+长度”正好等于S,则表明回收区有一个上邻空闲区。这时要修改第i栏登记项内容:起始地址不变,长度为原长度加上L,即:长度=原长度+L,于是回收区便与上邻空闲区合并了。
    在这里插入图片描述
  • 回收分区的下邻分区是空闲的,需要将两个空闲区合并成一个更大的空闲区,然后修改空闲区表。
  • 回收分区的上邻分区和下邻分区都是空闲的,需要将三个空闲区合并成一个更大的空闲区,然后修改空闲区表。
  • 回收分区的上邻分区和下邻分区都不是空闲的,则直接将空闲分区记录在空闲区表中。
6.分区的保护

1)系统设置“界限寄存器”:界限寄存器可以是上、下界寄存器或基址、限长寄存器。
在这里插入图片描述

2)保护键方法:即为每个分区分配一个保护键,相当于一把锁。同时为每个进程分配一个相应的保护键,相当于一把钥匙,存放在程序状态字中。每当访问内存时,都要检查钥匙和锁是否匹配,若不匹配,将发出保护性中断。

5.2.3 分区管理方案的优缺点

优点
  • 通过分区管理,内存真正成为了共享资源,有效利用了处理机和I/O设备,从而提高了系统的吞吐量和缩短了周转时间。
  • 在内存利用率方面,可变分区的内存利用率比固定分区高。
缺点
  • 内存使用仍不充分,存在较为严重的碎片问题(因要移动碎片浪费了处理机时间),且不能提供虚拟内存,不能扩充,受物理内存不足限制

5.3 覆盖技术与交换技术

5.3.1 覆盖技术

  • 覆盖技术:
    指一个程序的若干程序段或几个程序的某些部分共享某一个存储空间。

  • 覆盖技术的实现
    把程序划分为若干功能上的相对独立的程序段,按照其自身的逻辑结构使那些不会同时执行的程序段共享同一块内存区域。
    未执行的程序段先保存在磁盘上,当有关程序段的前一部分执行结束后,把后续程序段调入内存,覆盖前面的程序段。

  • 覆盖技术是用户程序自己添加的控制。
    要求程序员提供一个清楚的覆盖结构,把一个程序划分成不同的程序段,并规定好它们的执行和覆盖顺序。
    操作系统则根据程序员提供的覆盖结构,完成程序段间的覆盖。
    覆盖可以从用户级彻底解决内存装不下程序的问题

  • 事例
    在这里插入图片描述
    该程序正文段所需内存空间:A(20KB)+B(50KB)+F(30KB)+C(30KB)+D(20KB)+E(40KB)=190KB
    在这里插入图片描述
    采用覆盖技术后只需要A(20KB)+B(50KB)+E(40KB)=110KB内存空间即可!

  • 覆盖技术主要用于系统程序的内存管理上
    例如MS-DOS把系统分成两部分,一部分是操作系统中要经常用到的基本部分,
    它们常驻内存且占用固定区域,另一部分是不太经常使用的部分,它们存放在磁盘上,
    当调用它们时才被调入内存覆盖区。

5.3.2 交换技术

也称对换技术。在分时系统中,用户的进程比内存能容纳的数量要多,这就需要在磁盘上保存那些内存放不下的进程。有需要时再装入内存。

  • 进程从内存移到磁盘并再移回内存称为交换。
  • 交换技术是进程在内存与外存之间的动态调度,是由操作系统控制的。
  • 进程交换是指将暂时不用的进程代码,数据和部分进程控制块交换至磁盘
后备存储区(称为盘交换区swapping Area)

目的是尽可能达到“足够快地交换进程,以使当CPU调度程序想重新调度CPU时,
总有进程在内存中牌处于就绪(准备执行)状态“的理想状态,提高内存利用率,多用于分时系统中。

交换技术原理:
  • 换出进程的选择:即系统需要将内存中的进程换出时,选择哪个进程
    根据时间片轮转法或基于优先数的调度算法选择要换出的进程

  • 交换时机的确定:
    在内存空间不够或有不够的危险时,换出部分进程到外存,以释放内存

  • 交换空间的分配:
    有些系统中进程在内存中时,不分配磁盘空间,被换出时,必须分配磁盘交换空间。有些系统进程一旦创建,就分配磁盘上的交换空间。无论何时进程被换出,都被换到所分配空间,而不是每次换到不同空间

  • 换入进程换回内存时位置的确定
    使用绝对地址则为原来位置,相对地址则可重定位(可不在原位置)

交换技术的缺点:

因交换需要花费大量CPU时间,将影响对用户的响应时间,因此,减少交换的信息量是交换技术的关键问题。
合理的做法是:在外存中保留每个程序的交换副本,换出时仅将执行时修改过的部分复制到外存。

覆盖技术和交换技术的发展导致了虚拟存储技术的出现!
在这里插入图片描述

5.4 页式存储管理方案

优点

  • 1.由于它不要求作业或进程的程序段和数据在内存中连续存放,从而有效地解决了碎片问题.
  • 2.动态页式管理提供了内存和外存统一管理的虚存实现方式,使用户可以利用的存储空间大大增加

5.4.1 基本思想

把一个逻辑地址连续的程序分散存放在几个不连续的内存区域中,并且保证程序的正确执行,则既可充分利用内存空间,又可减少移动所花费的开销。

该技术广泛用于微机系统中,支持页式存储管理的硬件部件称为“存储管理部件”(Memory Management Unit,MMU)

存储管理部件首先把内存分成大小相等的许多区(块:是进行主存空间分配的物理单位)同时,要求程序中的逻辑地址也进行分页,页大小与块大小一样

页式存储器提供编程使用的逻辑地址由两部分组成:

页号和页内地址
页式存储管理方案中,系统将程序的逻辑空间按照同样大小也划分成若干页面也称页。
一个进程当前经常使用的页面集合叫做工作集,高效的交换策略能够确保所有进程的工作集保存在物理内存中。操作系统为每个进程提供与工作集大小相等的物理页面数.采用工作集模型可以解决颠簸问题
程序的各个逻辑页面从0开始依次编号,称作逻辑页号或相对页号。
每个页面内从0开始编址,称为页内地址。
页号是地址的高位部分
页内地址是地址的地位部分

页式存储的地址计算:

假定地址用m个二进制表示,其中页内地址部分占用n个二进制位,那么每一个块的长度就是2n,也就是每一页有2n。这时页号部分占用了m-n位,所以最大程序可允许有2(m-n)个页面。

例:逻辑地址从0(页号和页内地址)开始,当编址2n-1,第0页页内地址各位均为1,即占满了一个页面。下一个地址是2n,这时页号为1,而页内地址恢复到0,表示进入了第1页。再继续顺序编址,此时页内地址为0~(2n-1)属于第1页,依次类推,自然分页!

5.4.2 存储空间的分配与回收

页式存储管理分配内存空间以物理页面为单位

为了提高内存利用率并减少内存碎片,页面的划分(与页表数量相关,可以找到平衡点)

哪些块已经分配

哪些块尚未分配

当前剩余空闲块

简单的内存分配表可以用一张“位示图”构成

假设内存的可分配区域被分成256块,则可用字长为32位的8个字作为“位示图”。位示图每一位与内存块对应,每一位的值可以是0或1,0为空闲,1为占用。

在这里插入图片描述

在进行内存分配时,先查看空闲块数是否满足程序要求。

如不能满足:则不分配,程序不能装入内存

如能满足:则根据需求从位示图中找出一些为0的位,把这些位置置1,并从空闲块数中减去本次分配的块数,然后按照找到的位计算出对应的块号。

当找到一个为0的位,根据它所在的字号、位号,按这下公式计算对应块号:

块号=字号*字长+位号

如果有一个书架上有10行和10列格子(每行和每列都有0-9的编号),有100本书要存放在里面,那么我们使用一个行的编号+一个列的编号就能确定某一本书的位置。如果已知这本书的编号87,那么我们首先锁定第8行,然后找到第7列就能准确的找到这本书了
在这里插入图片描述

分配原则:找0置1。从空闲块中减去分配块数,按找到的位计算对应块号

回收原则:找1归0。将占用标志位修改成0,再把回收的块数加入到空闲块中

5.4.3 地址转换与快表

为每个装入内存的进程提供一张页表,该页表所在内存的起始地址和长度作为现场信息存放在该进程的进程控制块中。

页表是一种特殊的数据结构,放在系统空间的页表区,存放逻辑页与物理页帧的对应关系。 每一个进程都拥有一个自己的页表,PCB表中有指针指向页表
  

页框:将物理内存(内存空间)分为固定大小的块,称为物理块/帧/页框;


页: 将逻辑内存(用户程序的地址空间)分为固定大小的块,称为页/页面;


页和页框的大小相同(这样可将用户程序的任一页放入物理块中,实现了离散分配;


页表:各个页离散地存储在内存的任一物理块中,为了能在内存中找到每个页面所对应的物理块,系统为每个进程建立了一张页面映像表,简称页表(一般存放在内存中);

页表项:页表是由页表项组成的,每一行就是一个页表项(在进程地址空间内的所有页,依次在页表中有一个页表项)。
在这里插入图片描述

页表项 = 逻辑地址空间大小 / 页面大小
页表总量 = 页表项 * 物理页号大小
页表数 = 页表总量 / 页表大小

1、页式存储管理的地址转换

系统要提供一对硬件的页表控制寄存器,即页表起始地址寄存器和页表长度寄存器,另外还需要高速缓冲存储器的支持。

  • 页表起始地址寄存器:用于保存正在运行进程的页表在内存的首地址。

当进程被调度程序选中投入运行时,系统将其页表首地址从进程控制块中取出送入该寄存器

  • 页表长度寄存器:用于保存正在运行进程的页表的长度。

当进程被选中(系统)运行时,系统将它从进程控制块中取出送入该寄存器

页表指出该程序逻辑地址中的页号与所占用的内存块号间对应关系。

页表长度是由程序拥有的页面数而定,帮每个程序的页表长度可能是不同的。

物理地址的计算公式为:

物理地址=内存块号*块长+页内地址

33题
2、页表

1)多级页表:

例:用户地址空间为2GB,页面大小为4KB,则一个进程最多可以有 ? 页

1GB=1024MB 1MB=1024KB

2GB=2048MB 2048MB=2048*1024=2097152KB

2097152KB/4=52 4288=219

存放页表的页面为页表页,一般操作系统采用二级页表,即由页表页和页目录一起构成进程页表

第一级表示页目录,保存页表页地址

第二级表示页表页,保存物理页面号(即内存块号)

2)散列页表(集群页表):

当地址空间>32位时,使用以页号为散列值的散列页表,包含三个字段

(a)虚拟页号,(b)所映射的页框号,(c)指向链表中下一个元素的指针

3)反置页表:

原:每个进程都有对应页表,进程中每个页面都有一个表页

现:每个物理页框对应一个表项,每个表项包含与该页框对应的虚拟页面地址以及拥有该页面进程的信息。

3、快表

页式存储管理中的页表是存放在内存中。当要按给定的逻辑地址进行读写时,必须访问两次内存。

第一次按页号读出页表中对应的块号

第二次按计算出来的绝对地址进行读写

两次访问内存延长了指令的执行周期,降低了执行速度
快表命中率 35题

解决方法:

1)在地址映射机制中增加一组高速寄存器保存页表,开销大经济不可行

2)在地址映射机制中增加一个小容量的联想寄存器(相联寄存器),由高速缓冲存储器组成,这个高速缓冲存储器称为“快表”。记录一部分页号与内存块号的对应关系。

解决方法:

快表只存放当前进程最活跃的少数几页,内容动态更新。

更新原理:查找快表和查找内存页表是并行进行的,一旦发现快表中有与所查页号一致的逻辑页号就停止查找内存页表,而直接利用快页中的逻辑页号。

使用快表可以加快存储速度,降低访问时间。

5.5 虚拟存储技术与虚拟页式存储管理方案的实现

5.1 虚拟存储技术

基本思想:

利用大容量外存来扩充内存,产生一个比有限的实际内存空间大得多的、逻辑的虚拟内存空间,简称虚存。操作系统当前使用的部分保留在内存,把其他部分保存在磁盘上,并在需要时在内存和磁盘间动态交换,支持多道程序设计技术。

虚拟存储空间主要跟计算机地址位宽有关
在这里插入图片描述

工作原理:

当进程开始运行时,先将一部分程序装入内存,另一部分暂时留在外存;
当要执行的指令不在内存时,由系统自动完成将它们从外存调入内存的工作;
当没有足够的内存空间时,系统自动选择部分内存空间,
将原内容交换到磁盘上,并释放这些内存空间供其它进程使用。

与交换技术区别:
  • 交换技术:以进程为单位,当进程所需内存大于系统内存则无法运行-
  • 虚拟存储:以页或段为单位,当进程所需内存大于系统内存,仍然可正常运行,因为一部分可以被换出在外存上。

5.2 虚拟页式存储管理

5.2.1 基本思想

在进程开始运行时逐步载入,动态转换。

在使用虚拟页式存储管理时需要在页表中增加以下表项:
  • 页号–页面的编号

  • 有效位–又称驻留位、存在位或中断位,表示该页是在内存还是在外存

  • 页框号–页面在内存中时所对应的内存块号

  • 保护位–是否能读/写/执行

  • 禁止缓存位–采用内存映射I/O的机器中需要的位

在这里插入图片描述

当某个进程发生缺页中断,且选中一个页面进行淘汰时,只需要将该页面移除内存,即修改该页面的有效位又称驻留位.

当创建一个新的进程并调度运行时,该进程需装入一个页面:内存块号指示调入页面对应的物理块号,驻留位指示该页是否调入内存,供程序访问时参考.访问位记录该页一段时间内被访问次数,提供给置换算法在选择换出页面时参考.

当某进程的一个页面内容被修改后,修改位 保护位

5.2.2 缺页中断

实现虚拟页式存储管理的硬件基础是缺页中断机制
若在页表中发现所要访问的页面不在内存,则产生缺页中断。
在这里插入图片描述

5.2.3 页面调度策略

虚拟存储器系统通常定义三种策略来规定如何(或何时)进行页面调度:

  • 调入策略:何时将一个页由外存调入内存中

    • 请求调页:只调入发生缺页时所需页面。易产生较多缺页中断,造成对外存I/O次数多,时间开销过大,易产生抖动现象。

    • 预调页:在发生缺页需要调入某页时,一次调入该页以及相邻的几个页,提高调页I/O效率,减少I/O次数。

第5章 内存管理

  • 置页策略:当线程产生缺页中断时,内存管理器还必须确定将调入的虚拟页放在物理内存的何处。用于确定最佳位置的一组规则称为“置页策略”

  • 置换策略:如果缺页中断发生时物理内存已满,“置换策略”被用于确定哪个虚页面必须从内存中移出,为新的页面腾出空位。

    • 固定分配局部置换:可基于进程的类型,为每进程分配固定的页数的内存空间,在整个运行期间都不会改变。采用该策略时,如果进程在运行中出现缺页,则只能从该进程的N个页面选出一个换出,然后再调入一页,以保证分配给该进程的内存空间不变。

    • 可变分配全局置换:采用这种策略时,先为系统中的每一进程分配一定数量的物理块,操作系统本身也保持一个空闲物理块队列。当某进程发生缺页时,由系统的空闲物理块队列中取出一物理块分配给该进程。但当空闲物理块队列中的物理块用完时,操作系统才从内存中选择一块调出。但当空闲物理块队列中的物理块用完时,操作系统才从内存中选择一块调出.该块可能是系统中任意一个进程的页

    • 可变分配局部置换:基于进程的类型,为每一进程分配一定数目的内存空间。当某进程发生缺页时,只允许从该进程的页面中选出一页换出,这样就不影响其他进程的运行.如果进程在运行过程中频繁的发生缺页中断,则系统再为该进程分配若干物理块,直到进程的缺页率降低到适当程度位置.

5.2.4 页面置换算法

因刚被调出的页面又立即要用,被调出的页面因装入不久又被选中调出,调出不久又被装入的频繁调度现象称为“抖动”或“颠簸”。

  • 1.先进先出页面置换算法(First-In First-Out,FIFO)

    • 原理:选择最先装入内存的一页调出,或把驻留在内存中时间最长的一页调出

    • 过程:把装入内存的那些页面按进入的先后次序排好队列,每次总是调出队首的页,当装入一个新页后,把新页的页号排入队尾。

    • 注:由操作维护维护一个有当前在内存中的页面的链表,最老的页面在表头,最新在页面表尾。当发生缺页时,置换表头的页面把新调入的页面加到表尾。

  • Belady现象:在分页式虚拟存储管理中,发生缺页时的置换算法采用时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多,但缺页率反而提高的异常现象
    在这里插入图片描述

  • 2.最近最少使用页面置换算法(Leat Recently Used,LRU)

    • 原理:在缺页发生时,首先置换掉最长时间未被使用过的页面。

    • 过程:总是选择距离现在最长时间内没有被访问过的页面先调出。实现这种算法的是在页表中为每一页增加一个“计时”标志,记录该页面自上次被访问以来经历的时间,每被访问一次都应从0开始重新计时。

    • 注:计时值最大页调出,最近时间内最长时间没有被调用过被调出,开销较大

  • 3.最近最不常用页面置换算法(Leat Frequently Used,LFU)

    • 原理:根据在一段时间里页面被使用的次数选择可以调出的页,如果一个页面被访问的次数较多,则是经常要使用的页面,就不能调出。
    • 过程:为每页设置一个计数器,每当访问一页时,就把该页对应计数器加1,周期没有发生缺页中断,所有计数器清0重新计数;如果发生缺页中断,则选择计数值最小页调出。
    • 注:实现开销大,且要确定合适的周期具有一定难度。
  • 4.理想页面置换算法(OPT)

    • 原理:该算法转换后不再需要的或者在最长时间后才会用到的页面。
    • 过程:作为衡量其他页面置换算法优劣的一个标准。

例子:
(a)某程序在内存中分配三个页面,初始为空,所需页面的走向为4,3,2,1,4,3,5,4,3,2,1,5,采用FIFO算法,请计算整个缺页次数
在这里插入图片描述
(b)某程序在内存中分配三个页面,初始为空,所需页面的走向为4,3,2,1,4,3,5,4,3,2,1,5,采用LRU算法,请计算整个缺页次数。
在这里插入图片描述
(c)某程序在内存中分配三个页面,初始为空,所需页面的走向为4,3,2,1,4,3,5,4,3,2,1,5,采用OPT算法,请计算整个缺页次数。

在这里插入图片描述

  • 5.最近未使用页面置换算法(NRU)

    • 原理:随机地从类编号最小的非空类中挑选一个页面淘汰。
    • 过程:在最近一个时钟滴答中(典型时间是约20ms)置换一个没有被访问的已修改页面要比置换 一个被频繁使用的干净页面好。
    • 优点:易于理解和实现,性能不是最好但够用。
    • 当访问页面(读或写)时设置R位;当写入页面(修改页面)时设置M位。用R位和M位构造一个简单的页面置换算法:当启动一个进程时,所有页面的两个位都由操作系统设置0,定期将R位清零,以区别最近没有被访问的页面和被访问的页面。
  • 6.第二次机会页面置换算法(NRU)
    FIFO算法可能会把经常使用的页面置换出去。

    • 思想:寻找一个最近的时钟隔以来没有被访问过的页面。如果所有的页面都被访问过,该算法就退化为FIFO算法。
    • 检查进入内存时间最久页面的R位,如果是0,既老又没有被采用,可以立刻置换掉;如果是1就清0,放到链表尾端,修改其进入时间继续搜索。
  • 7.时钟页面置换算法(CLock)
    把所有的页面都保存在一个类似时钟面的环形链表中,一个表针指向最老的页面。当发生缺页中断时,算法首先检查表针指向的页面,如果它的R位是0就置换该页面,并把新页面插入这个位置,然后把表针前称一位;如果R位是1就清除R位并把表针前称一个位置,重复这个过程直到找到一个R位为0的页面为止。称为时钟(Clock)。

5.2.5 缺页中断率

假定一个程序共有n页,系统分配给它的内存块是m块(m、n均为正整数,且1 ≤ m ≤ n)。因此,该程序最多有m页可同时被装入内存。如果程序执行中访问页面的总次数为A,其中有F次访问的页面尚未装入内存,故产生了F次缺页中断。定义为 f =F/A,称 f 为“缺页中断率”。

缺页中断率与缺页中断的次数有关!

  • 1.分配给程序的内存块数:
    分配给程序的内存块数多,则同时装入内存的页面数就多,故减少了缺页中断的次数,也就降低了缺页中断率。反之,缺页中断率就高。

  • 2.页面的大小:
    页面的大小取决于内存分块的大小,块大则页面也大,每个页面大了则程序的页面数就少。装入程序时是按页存放在内存中的,因此,装入 一页的信息量就大,就减少了缺页中断的次数,降低了缺页中断率。反之,若页面小则缺页中断率就高。

  • 3.程序编制方法:
    考生不用了解,不考Pascal编程。
    注:缺页中断率与程序的局部化程序密切相关。

  • 4.页面置换算法:
    对缺页中断率的影响很大,调度不好就会出现“抖动”。理想的调度算法能使缺页中断率最低。

5.2.6 虚拟存储管理的性能问题

在虚拟存储中,页面可能在内存与外存间频繁调度,有可能出现抖动或颠簸。

颠簸是由于缺页率高而引起的。

进程在一段时间内集中访问一些页面,称为“活动”页面。

如果分配给一个进程的内存物理页面数太少,使得该进程所需要的活动页面不能全部装入内存,则进程在运行过程中可能会频繁地发生矶页中断,从而产生颠簸。

5.3 段式与段式存储管理方案

5.3.1 段式存储管理方案

  • 1.设计思想:
    系统将内存空间动态划分为若干个长度不同的区域,每个区域称作一个物理段。每个物理段在内存中有一个起始地址,称作段首址。将物理段中的所有单元从0开始依次编址,称为段内地址。

    用户程序按逻辑上有完整意义的段来划分,称为逻辑段。将一个用户程序的所有逻辑段从0开始编号,称为段号,将一个逻辑段中的所有单元从0开始编址,称为段内地址。用户程序的逻辑地址由段号和段内地址两部分组成。

    内存分配时,系统以段为单元进行内存分配,为每一个逻辑段分配一个连续的内存区(物理段)。逻辑上连续的段在内存中不一定连续存放。

    操作系统为了实现段式管理,需要建立段表。当把程序装入内存后,系统为每个用户程序建立一张表,用于记录用户程序的逻辑段与内存物理段间的对应关系。段表包括逻辑段号、物理段起始地址(段首址)和物理段长度三项内容。用户程序有多少逻辑段该段表就登记多少行,且按逻辑段顺序排列。段表存放在内存系统区里。

  • 2.地址转换:
    与页式存储管理相同,为了实现段式管理,系统提供一对寄存器:段表起始地址寄存器和段表长度寄存器。

    段表起始地址寄存器:用于保存正在运行进程的段表在内存的首地址。当进程被调度程序选中投入运行时,系统将其段表首地址从进程控制块中取出送入该寄存器。

    段表长度寄存器:用于保存正在运行进程的段表的长度。当进程被选中运行时,系统将它从进程控制块中取出送入该寄存器。

  • 3.与可变分区管理方案的比较:

    • 相同点:有相同的内存分配表,包括已分配区表和空闲区表。

    • 不同点:段式存储管理是为程序的每一个分段分配一个连续的内存空间。存储空间管理的方案与可变分区管理方案相同。

5.3.2 段页存储管理方案

为用户提供一个二维地址空间,满足程序和信息的逻辑分段的要求。

段式管理反映了程序的逻辑结构,有利于段的动态增长以及共享和内存保护等,大大方便了用户。等分内存,有效克服碎片,提高存储器利用率。方便用户的程序设计和提高内存的利用率。

  • 基本思想:
    用页式方法来分配和管理内存空间,即把内存划分为若干大小相等的页面;用段式方法对用户程序按照其内在的逻辑关系划分成若干段;再按划分内存页面的大小,把每一段划分成若干大小相等的页面。
    内存是以页为基本单位分配给每个用户程序的,逻辑上相邻的页面在物理内存中不一定相邻。

  • 实现过程:
    需要增加段式管理和页式管理的成分:系统必须为每个程序建立一张段表;由于一个段又被划分成了若干页,系统又为每个段建立一张页表。段表中记录了该段对应的页表的起始地址和长度;而页表则给出该段的各个逻辑页面与内存块号之间的对应关系。

在操作系统各种存储管理方法中,存在外碎片的是(CD)
A.固定分区
B.页式
C.动态分区
D.段式
E.段页式

所谓外部碎片是指内存空间不能够被分配
内部碎片是指内存空间被分配出去但没有被利用。
页式存储管理方案同固定分区一样,将物理内存划分成固定大小的块,每一块都可以分配使用,因而可以很好的避免外部碎片。
但页式存储管理中,进程的最后一页经常装不满一个物理块,所以存储内部碎片。
同样固定分区存储管理方案中,分区通常比装入的进程大,所以也存在内部碎片;
而段式存储管理方案和可变分区一样,总是划分和进程大小相同的块来存放进程,所以不存在内部碎片,但是内存空间被多次分配、回收之后,总会留下一些很难再被分配的小空间,因此存在外部碎片;
段页式存储管理同页式存储管理一样,可以很好的解决内存的外部碎片问题。
虚拟页式存储管理方案是将内存按照一定的大小分页,每个分页都分配出去,但是总存在最后一个分页装不满的情况,存在内部碎片。
虚拟段式存储管理方案是将内存按照程序段的长度进行分配的,分配出去的内存都是刚好够装下整个程序段,所以不存在内存碎片,但是在分配过程中,可能存在某一块内存装不下任何一个程序段的情况,所以存在外存碎片。

下列各种内存管理方案中,哪些可以与虚拟存储技术结合使用(BCD)
A.可变分区
B.页式
C.段式
D.段页式
E.固定分区

要能与虚拟存储技术结合使用的内存管理方案必须具有如下特性:
1.使用动态内存地址,内存中的进程是可以移动的
2.不能要求全部程序加载入内存,进程才能运行的

下列存储管理方案中,能支持多道程序设计的是(ABDE)
A.可变分区存储管理
B.页式存储管理
C.单一分区存储管理
D.固定分区存储管理
E.段页式存储管理

在引入虚拟页式存储管理的系统中,会出现下列哪些现象(ABCE)
A.页面抖动(颠簸)
B.Belady异常
C.缺页中断
D.越界中断
E.页面写错误

下列哪一种存储管理方案以进程为单位分配一组连续的内存单元(AB)
A.固定分区
B.可变分区
C.页式
D.段式
E.段页式

在虚拟页式存储管理中,为实现地址变换所涉及到的数据结构是(ACE)
A.空闲区表
B.分区分配表
C.页表
D.段表
E.位图

下列存储管理方案中,可进行进程部分交换的是(CDE)
A.固定分区
B.可变分区
C.页式
D.段式
E.段页式
AB可以将整个进程进行交换

在可变分区管理方案中,移动技术可以解决碎片问题。当一个程序在内存中移动时,需要做哪些工作(ABCDE)
A.读出该程序在内存中的所有代码和数据
B.进程内存重定位(静态或动态)
C.将读出的代码和数据写入目标内存中
D.修改内存已分配区表
E.修改空闲区表

下列关于虚拟页存储管理方案的叙述中,哪些是正确的(ABCD)
A.将内存等分成大小为2的幂次方的内存块,称为页框
B.系统将虚拟地址空间等分为若干页面,大小与页框相同
C.虚拟页面在物理空间上不要求连续存放
D.硬件机制实现逻辑地址到物理地址的动态转换
E.所有页必须常驻内存

在虚拟页式存储方案中,当判断一个页面是否已调入内存时需要用到页表表项的哪些位(AB)
A.驻留位
B.中段位
C.修改位
D.访问位
E.保护位

程序局部性原理

局部性原理:CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中.

  • 时间局部性
    如果一个信息项正在被访问,那么在近期它很可能还会被再次返回.
  • 空间局部性
    在最近的将来将用到的信息很可能与现在正在使用的信息在空间地址上是临近的,比如代码的顺序性,内存访问的顺序性
  • 顺序局部性
    在典型程序中,除转移类指令外,大部分指令是顺序进行的.

猜你喜欢

转载自blog.csdn.net/DarkAngel1228/article/details/82825602
今日推荐