操作系统第五章笔记

第五章

存储器的层次结构

在这里插入图片描述
在这里插入图片描述
存储器的速度必须快,还要求存储器具有非常大的容量,存储器的价格还应很便宜

多层结构的存储器

  • 存储器的多层结构
    • 通用计算机而言,存储层次至少应具有3层:CPU寄存器-主存-辅存
    • 层次越高存储介质访问速度越快,价格越高,存储容量越小
    • 操作系统的存储管理负责对可执行存储器的分配回收以及在存储层次之间数据移动的管理机制
  • 可执行存储器
    • 寄存器和主存储器(内存)被称为可执行存储器

主存储器和寄存器

  • 主存储器访问速度远远低于CPU执行指令的速度,为缓和这一矛盾,引入和寄存器和高速缓存
  • 寄存器与处理器速度相同,能和CPU协调工作,价格贵,容量小

高速缓存和磁盘缓存

  • 高速缓存:寄存器和存储器之间,用于备份主存中常用的数据,减少处理机对主存储器的访问次数
  • 磁盘缓存:缓和IO与主存的访问速度差异,用于暂时存放频繁使用的一部分磁盘数据和信息,以减少对磁盘的访问次数

程序的装入与链接

用户源程序执行通常要经过的步骤:

  • 编译:有编译程序将用户源代码编译成若干个目标模块
  • 链接: 由链接程序将编译后形成的目标模块以及他们所需要的的库函数,链接在一起,形成一个装入模块
  • 装入:由装入程序将装入模块装入主存的过程(加载)
    在这里插入图片描述

地址绑定和内存保护

  • 内存的每个存储单元都有一个编号,这种编号称为内存地址(或称为物理地址,绝对地址)
    内存地址的集合称为内存空间(或物理地址空间)
    用户编程用的地址叫逻辑地址(或程序地址,或虚地址),由逻辑地址组成的空间称为逻辑地址空间(或程序地址空间)
    用户程序装入内存时对有关指令的地址部分的修改(从程序地址到内存地址的地址映射)称为地址重定位
  • 内存保护
    保证在内存中的多道程序在各自的存储区域活动,互不打扰
    防止地址越界;防止越权(对共享区有访问权)
    • 硬件支持:界地址寄存器(界限寄存器);界地址寄存器被广泛使用的一种存储保护技术;机制比较简单,易于实现
    • 实现方法:在CPU设置一对下限寄存器和上限寄存器存放用户作业再主存中的下限和上限地址;也可将寄存器作为基址寄存器,另一寄存器作为限长寄存器(指示存储区长度);每当CPU要访问主存,硬件自动将被访问的主存地址与界限寄存器的内容进行比较,判断是否越界,如果未越界,则按此地址访问主存,否则将产生程序中断——越界中断(存储保护中断)
      在这里插入图片描述

程序的装入

  • 绝对装入方式:在可执行文件中记录内存地址,装入时直接定位在上述内存地址。直接装入到物理地址对应的上面
    • 优点:装入过程简单
    • 缺点:过于依赖于硬件结构,不适于多道程序系统
  • 可重定位装入方式
    通常吧装入时对目标程序中指令和数据的逻辑地址变换为物理地址的过程,称为重定位。如果地址变换是在进程装入时一次性完成的,以后不再改变,则称这种重定位方式为静态重定位
    在这里插入图片描述
    • 说明:重定位表中列出所有修改的位置,如:重定位表的150表示相对地址150处的内容为相对地址(即100为从0起头的相对位置)。在装入时,要依据重定位后的起始位置(2000)修改相对地址
    • 地址单位修改:重定位表中的150->绝对地址2150(=2000+150)
    • 相对地址值修改:内容100变成2100(=2000+100)
    • 优点:不依赖于硬件,可以装入有限多道程序;无须硬件支持
    • 缺点:一次性全部装入;一个程序通常需要占用连续的内存空间,程序装入内存后运行时不能移动
  • 动态运行时装入方式
    • 在装入模块装入主存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序要真正执行时才进行。实现时需要重定位寄存器
    • 优点:不需要一次装入;OS可以将一个程序分散存放于不连续的内存空间,可以移动程序。
    • 缺点:需要硬件支持,OS实现较复杂。

程序的链接

链接程序的功能是将编译完成的目标模块以及他们所需要的库函数装配称一个完成的模块

  • 静态链接:程序运行前链接好,以后不会拆开
  • 装入时(运行时)动态链接:用户源程序编译后得到的目标模块,是在装入主存(运行)时,边装入边链接的
    • 优点:共享、部分装入,便于局部代码修改、便于运行环境适应
    • 缺点:增加了链接开销。程序由多个文件组成,增加管理开销

对换技术

在多道环境下扩充内存的方法,用于解决在较小的存储空间中运行较大程序时遇到的矛盾

  • 交换技术被广泛用于小型分时系统中,交换技术的发展导致了虚拟存储器技术的出现

对换技术

进程的程序和数据主要放在外存,当前需要执行的部分放在内存,内外存之间进行信息交换(对换)
把内存中暂时不能运行的进程或者暂时不用的程序和数据换在外存上,以便腾出足够的内存空间,再把已具备运行条件的进程或者进程所需要的程序和数据换入内存
作用:改善内存利用率;提高处理机的利用率和系统的吞吐量
这种技术是进程在内存与外存之间的动态调度:

  • 整体对换(进程对换)
  • 部分对换(页面对换、分段对换)

选择原则:选择优先级低的或者长时间等待的进程
对换时机:很少用就换出去,内存空间不够就换出去

交换时需要做的工作

需要一个磁盘交换区
在这里插入图片描述磁盘分为:

  • 文件区:占磁盘空间的大部分,目标是提高文件存储空间的利用率,离散分配
  • 交换区:只占磁盘空间的小部分,操作频率高,需要提高换进换出的速度,连续分配

对换空间的分配与交换:连续分配的方式,与动态分区方式的内存分配与回收类似(FF,NF,BF,WF)
换出:选择换出进程(阻塞休眠状态,优先级最低,内存驻留时间);在进程换出时,只能换出非共享的程序和数据段;申请对换空间成功以后将该进程的程序和数据传送到对换区,然后回收其内存空间,修改PCB
换入:找出就绪状态已换出的进程,选择换出时间最长的进程作为换入进程,进行换入

换出时机:处理机正常时不需要启动对换程序
如果发现许多进程在运行时经常发生缺页而且明显出现内存紧张的情况,则主要启动对换程序,将一部分进程调至外存;如果发现多有进程的缺页率都已经明显减少,这可以暂停运行对换程序

连续分配存储管理方式

单一连续分配

早期的存储器管理方式是把内存分为用户区和系统区两部分,系统区仅供OS使用,它通常放在内存的低址部分。而在用户区内存中,仅装有一道用户程序,即整个内存的用户区由该程序独占。这样的存储器分配方式被称为单一连续分配
优点:易于管理
缺点:对要求内存空间少的程序,造成内存浪费;程序全部装入,很少使用的程序部分也占用内存

固定分区分配

把内存固定的划分为若干个固定大小区域,每个分区装入一道作业
分区的发奋可采用分区大小相等和不等两种方式
在这里插入图片描述

  • 为了便于内存分配,通常将分区按大小排队,并为之建立固定分区使用表,其中包括每个分区的起始地址,大小,状态
  • 例如:某系统的内存容量为256K,操作系统占用低地址的20K,其余空间划分为4个固定大小的分区
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 性能分析:如果作业大小和出现频率都知道的情况下,固定分区比较合适,不知道的话,就会造成存储空间的浪费,从而影响整个系统的效率
  • 优点:易于实现,开销小
  • 缺点:内存碎片造成浪费;分区总数固定,限制并发执行的程序数目

动态分区分配(可变分区分配)

根据进程的实际需要,动态地为之分配内存空间,解决了固定分区严重浪费内存的问题。是一种较为实用的存储管理方法。涉及到分区分配中的数据结构/分区分配算法/分区的分配回收问题

  • 动态分区分配中的数据结构
    • 常用空闲分区表和空闲分区链结构来登记空闲分区的大小和位置
    • 系统还设置了等待分区队列,当系统中没有满足的空闲区时,就把申请者送入等待队列,等待别的进程释放内存之后唤醒
      在这里插入图片描述
  • 动态分区分配算法
    • 首次适应算法(FF)
      要求空闲分区按首址递增的次序组织空闲分区表(队列)

      优点:优先使用低地址空间,在高地址空间可能会保留较大的空闲分区,所以,大进程申请存储空间大都能在高地址端得到满足

      缺点:由于每次只简单地使用第一个分区,结果可能导致低址部分不断被使用,将较大的空闲分区不断地分割为较小的空闲分区。每次查找都从低址开始,增加开销
      在这里插入图片描述

    • 循环首次适应算法(NF)
      在首次适应算法的基础之上,按空闲分区的前后次序,从上次分配的分区处查找(到最后分区再回到开头),找到符合要求的第一个分区

      • 该算法分配和释放的时间性能较好,使空闲分区分布得更均匀,但较大的空闲分区不易保留,从而使大进程无法装入内存运行,NF算法可能会导致大量的外零头,需要较频繁的实施“紧凑”操作
    • 最佳适应法(BF)
      要求按空闲分区大小从小到大的次序组成空闲分区,注意:分配和回收后要对空闲区表(队列)按照分区大小重新排序
      缺点:随着时间的推移,系统中的小空闲区会越来越多,从而造成存储区的大量浪费

    • 最坏适应法(WF)
      要求按空闲分区大小从大到小的顺序组织空闲区表/队列,注意:分配和回收后要对空闲区表/队列按照分区大小重新排序

      • 优点:每次仅做一次查询,效率高,避免产生大量较小外零头,分配后,可能剩余的空闲分区还相当大
      • 缺点:总分割大空闲分区,当大进程申请时,找不到满足的空闲分区,较大的空闲分区也成了外零头
  • 基于索引搜索的动态分区分配算法
    • 快速适应算法
      把空闲分区根据容量大小进行分类,对每一类具有相同容量的空闲分区,设立一个空闲分区表,同时在内存中设立一张管理索引表,根据进程的大小,在索引表中找到能容纳它的最小空闲分区链表,取下链表中第一块进行分配,一个分区只属于一个进程
      • 缺点:合并,分区归还内存时算法较复杂
    • 伙伴系统
      伙伴系统规定所有分区大小都为2的k次幂,对于具有相同大小的所有空闲分区,为他们单独设立一个空闲分区双向链表,当进程需要一个长度为n的存储空间时,找到一个值i,使2的i-1次方小于n,2的i次方小于等于n,然后在空闲分区大小为2的i次方的空闲分区链表中查找,若能找到,则分配,若不能,则在分区大小为2的i+1次方的空闲分区链表中继续查找,若存在该空闲分区,则把该分区等分为大小为2的i次方的分区。这两个分区称为“一对伙伴”,其中一个分区用于分配,另一个加入大小为2的i次方的空闲分区链表中。若不存在,继续查找
    • 哈希算法
      建立哈希函数,构造一张以空闲分区大小为关键字的哈希表,每个表均记录了对应的空闲分区链表表头指针,根据所需空闲分区的大小,通过哈希函数计算得到哈希表中的位置,从中得到相应的空闲分区链表
  • 分区的分配与回收操作
    • 系统初启时,除操作系统占用一个分区外,其余存储区为一个大的空闲区
    • 分区的分配是指系统根据用户的请求,在空闲分区表中或空闲分区队列中寻找一个满足用户要求的空闲分区,把这个空闲分区分配给用户
    • 以空闲分区表为例,当用户要求一个大小为SIZE的存储空间时,系统查询空闲分区表,找一个大于或等于SIZE的空闲区
    • 当找到的空闲分区大于SIZE,这时将空闲分区一分为二
      • 从空闲分区的上部开始划出SIZE大小的空闲分区给用户
      • 从空闲分区的底部开始向上划出SIZE大小的空闲分区给用户
      • 一般采用第二种方法,因为这样划分,空闲分区表中的首地址不变
        在这里插入图片描述
        在这里插入图片描述
  • 分区存储管理中碎片的解决方法
    • 规定门限值(由操作系统规定,如1K),分割空闲区时,若剩余部分小于门限值,则不再分割此空闲区
    • 定期压缩存储空间,将所有空闲区集中到内存的一端(紧凑),但这种方法系统开销较大

动态可重定位分区分配

将相对地址转换为物理地址的工作推迟到程序指令要执行时进行。为了不影响指令的执行速度,必须有硬件地址变换机构的支持:重定位寄存器
动态重定位分区算法与动态分区算法相同,差别仅在于增加了紧凑功能

分页存储管理方式

分页存储管理的基本方法

  • 页面:将进程划分为称若干个大小相等的部分,每一部分称为页,并为每页编号。同样,分页存储管理也会为内存空间分块并加以编号,在为进程分配内存时,以块为单位,将进程的页放入块中。用户程序的划分是系统自动完成的,用户不知道,通常,一页的大小为2的整数次幂

  • 地址结构:前一部分为页号P,后一部分为位移量W。

  • 若给定逻辑地址空间中的地址为A,页面大小为L,则P=A/L,W=A%L
    在这里插入图片描述

  • 页太大:浪费;页太小:页表过长,进程中的最后一页经常装不满一个块,所以会形成不可用的碎片,称为“页内碎片”
    在这里插入图片描述

  • 页表:若将应用程序的包含页号和页内地址的逻辑地址转换为内存地址(物理地址),必须要有一个数据结构,用来登记页号和块号的对应关系和有关信息,这样的数据结构称为页表。系统会为每个进程在内存建立一个页表

  • 页表内容

    • 页号:登记程序地址空间的页号
    • 块号:登记相应的页所对应的内存块号
    • 其它:登记与存储信息保护有关的信息
  • 页表的首地址和长度存于该进程的PCB中,占用处理机的当前进程的页表首地址和长度需要放在地址映射机构的页表首址寄存器和页表长度寄存器
    在这里插入图片描述
    在这里插入图片描述
    这个转换过程是在程序执行过程中完成的,是动态地址映射

地址变换机构

  • 基本的地址变换机构
    地址变换机构的任务是将逻辑地址中的页号转变为物理地址中的块号,这个任务借助于页表来实现
    页表驻留在内存,在系统中只设一个页表寄存器PTR,其中存放着页表在内存中的始址和页表长度存放在本进程的PCB中。页表功能由一组专门的寄存器来实现
    在现代计算机系统中,由系统提供的地址映射硬件(页表寄存器)来完成地址映射工作
    在这里插入图片描述
    分页系统中的地址变换如上

分页存储管理中的信息保护

信息保护从两方面实现:

  • 在分离程序地址的页号和页内地址时判别访问地址是否越界
    • 若产生的页号满足下式为合法:
      0<=页号<程序地址空间的页数
    • 判断由硬件自动做,若不合法,硬件产生越界中断,由操作系统的越界中断处理程序进行处理
  • 判断访问是否越权
    在页表中增加用于存取控制和存储保护的信息,当要访问某页的某个逻辑地址时系统要根据该页的存取控制和存储保护信息检查访问是否合法

快表/联想寄存器

每一次对内存的访问都要访问页表,页表是放在内存中的,每一次访问内存的指令至少要访问两次内存,运行速度要下降一半

  • 为了提高地址变换速度,可以把页表放在一组特殊的高速缓冲寄存器中,从而加快访问内存的速度。这种快速存储器组成的页表称为快表,把存放在内存中的页表叫做慢表。快表又叫联想存储器,或TLB
    在这里插入图片描述
    由于成本的关系,快表不可能做的很大,通常只存放16~512个页表项
    硬件根据需要将页表中当前需要的少量表目读入快表,其他表木仍留在内存的页表中,当需要时读入新的表目,并淘汰适当的表目

引入快表后内存有效访问时间

访问快表的速度是内存速度的数倍或数十倍,引入快表,CPU访问数据所花的时间明显减少
EAT=aλ+(1-a)(t+λ)+t+t=2t+λ-t*a
λ为查找快表的时间,a表示命中率,t表示访问一次内存的时间

两级页表和多级页表

当页表项很多时,存放一级页表需要大片连续空间,可将页表分页,并对页表所占的空间进行索引形成外层页表
在这里插入图片描述
将页表进行分页,使每个页面大小与内存物理块大小相同,离散的将各个页面分别存放在不同的物理块中。再建立一张外层页表
在页表的每个表项中存放的是某页在内存中的物理块号,在外层页表中的每个页表项中存放的是某页表分页的首址
在这里插入图片描述

在这里插入图片描述

分段存储管理方式

分段存储管理方式的引入

优点:

  • 方便编程:用户按逻辑关系来划分若干个段
  • 信息共享:段是可以信息共享的逻辑单位
  • 信息保护:以信息的逻辑单位为基础
  • 动态增长
  • 动态链接:以段作为动态链接的基本单位

分段系统的基本原理

程序地址空间

  • 按程序自身逻辑关系划分为若干个段,每个段都有一个段号
  • 段号从0开始
  • 每段段内从0开始编址,段内地址连续
  • 各段长度不相等,段长由相应逻辑信息组的长度决定
    在这里插入图片描述
    -内存地址空间
    • 内存空间被动态的划分为若干个长度不相同的- 区域,称为物理段;
    • 每个物理段由起始地址和长度确定
  • 内存分配
    • 以段为单位分配内存,每一个段在内存中占据连续空间
    • 各段之间可以不连续存放
      在这里插入图片描述

段地址映射

  • 地址映射数据结构
    • 每一进程有个段表,它的每一个段在段表中占用一个表目,记录了该段在内存中的起始地址和段长度
    • 段表包括有段的首址、段的长度和存取状态等信息
    • 段表可以存放在一组寄存器中,以此提高地址转换速度,常见的是将段表放入内存
    • 段表首址指针和段表的长度存放在进程PCB中
    • 段表示用于实现从逻辑段到物理内存区的映射的
      在这里插入图片描述

段表寄存器

段表同样被保存在内存中
段表寄存器:实现快速地址变换,用来存放当前执行进程的段表在物理内存中的起始地址
当创建进程,将进程的程序和数据装入内存时,系统为之建立段表,并将段表的起始地址填入进程的PCB中
当进程被调度执行时,取出其PCB中的段表首址,填入段表寄存器中

地址变换和存储保护

类同页表
物理地址:段表表项中的基址+段内偏移量
存储保护:防止越界访问;段表项中还可以存其他的信息,用于防止越权访问

  • 分段存储管理中也有快表(TLB),与页表中的快表功能类似,在CPU寄存器中
    在这里插入图片描述

分段与分页技术的比较

页是信息的物理单位,段是信息的逻辑单位(分页是出于系统管理的需要,分段是出于用户应用的需要)

  • 一条指令或一个操作数可能会跨越两个页的分界处,但是不会跨越两个段的分界处

页的大小是系统固定的,段大小通常不固定。通常段比页大,因为段表比页表段,可以缩短查找时间,提高访问速度

地址表示

  • 分页是一维的,查找时只用提供逻辑地址
  • 分段是二维的,查找时需要提供段号和段内地址

信息共享

分页存储管理实现共享因为每个进程都有一个页表,数据和程序会分页存储,页面大小固定,所以数据和程序会被分为很多块,导致多个进程不方便共享。但是分段存储管理中,段的大小不是固定的,可以将需要共享的数据和程序段分为一段,各个进程只需要一到两个段表项就能实现进程之间的共享

段页式存储管理方式

  • 基本原理
    • 按段式划分:对用户来讲,按段的逻辑关系进行划分;
    • 按页划分:对系统讲,按页划分每一段
      在这里插入图片描述
      先将用户程序分为若干个段,再将段分为若干个页
      系统需要同时配置段表和页表
      内存分配以块为单位进行分配
      在这里插入图片描述
      在这里插入图片描述

地址变换过程

首先,从段表寄存器中获得进程段表的起始地址,根据该地址,查找进程的段表
然后,根据逻辑地址指定的段号检索段表,找到对应段的页表起始地址
再根据逻辑地址中指定的页号检索该页表,找到块号
块号*页面的大小+偏移量=物理地址

快表

采用段页式存储管理访问了三次内存,可以增设一个高速缓冲寄存器,其中保存最近使用过的页号以及所属的段号

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值