操作系统——存储器管理(分页存储和分段存储)


  • 连续存储会产生许多的“碎片”,虽然“紧凑”方法可以将许多碎片拼接可用的大块空间,但需为之很大的开销
  • 如果允许将一个进程直接分散的装入到许多不相邻的分区中,便可以充分利用内存空间。基于这一思想,产生了离散分配方法。根据在离散分配时所分配的地址空间的基本单位不同,将离散分配方法分为以下三种:
    • 分页存储管理方式:该方法中,将用户程序的地址空间分为若干个固定大小的区域,成为“页”或者“页面”,典型的页面大小为1KB.相应的,也将内存空间分为若干个物理块或者叶框,页和块的大小相同,这样可将用户程序的任一页放入任一物理块中,实现离散分配。
    • 分段存储管理方式:这种方法时为了满足用户的要求而形成的一种存储管理方式,它把用户程序的地址空间分为若干个大小不相同的段,每段可以定义一组相对完整的信息,在存储器分配时,以段为单位。这些段不相邻,同样也实现了离散分配。
    • 段页式存储管理方式:这是分段和分页结合的产物。它具有两者的优点,是目前应用教广泛的一种存储管理方式。

一、分页存储管理方式

1. 分页存储管理的基本方法

  • 页面和物理块
    • 页面
      分页存储管理将进程的逻辑地址分为若干页。并对每个页进行编号,从0开始,如:第0页,第1页。相应的,把内存中的物理地址分为若干块,同时对他们进行编号,如0#,1#等。在内存分配时,以块为单位,将若干页面分别装入多个不相邻的物理块中。由于进程的最后一页经常装不满,就形成了不可利用的碎片,称为“页面碎片
    • 页面大小
      在分页系统中,页面过小会造成单个进程占有多个页面,从而导致进程的页面过长,占用大量内存,还会降低页面换进换出的效率。页面过大,会导致页面碎片过大。因此,页面的大小应该适中,且页面大小应该为2的幂。通常为1kb—8kb.
  • 地址结构
    • 分页地址中地址结构如下:
      在这里插入图片描述
  • 页表
    • 在分页系统中,为了保证进程可以在内存中找到每个页面对应的物理块,系统为每一个进程建立了一张页面映像表,简称页表。在进程地址空间内的所有页,依次在页表中有一页表项,其中记录了相应页在内存对应的物理块号。如下图。
    • 在分页系统中,常常会在页表的表项中设置一个存取控制字段,用于表示该存储块中的内容是允许读/写还是只读,以此来对该存储块中的内容加以保护。
      在这里插入图片描述

2. 地址变换机构

地址变化机构的任务是将逻辑地址中的页号转换为内存中的物理块号

  • 基本的地址变换机构
    • 进程在运行期间,需要将用户地址空间中的逻辑地址变换为内存空间中的物理地址,由于它执行的频率非常高,每条指令的地址都需要进行变换,因此需要采用硬件来实现。页表功能是由一组专门的寄存器来实现的。一个页表项用一个寄存器。而页表大多驻留在内存中,在系统中只设置一个页表寄存器,在其中存放页表在内存中的的始址和页表的长度
    • 进程未执行时,这两个数据存在进程的PCB中;当操作系统调度该进程时,再将这两个数据装入页表寄存器中。因此。单处理机环境中,虽然系统可以允许多个进程,但只需要一个页表寄存器。
    • 当进程要访问某个逻辑地址中的数据时,分页地址变化机构会自动将有效地址分为页号和页内地址两部分再以页号为索引去检索页表。查找操作由硬件执行。
    • 执行前,将页号和页表长度进行比较,查看是否出现越界错误,如果出现则产生地址越界中断,若未出现,则将表页始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可以得到该块的物理块号,将之装入物理地址寄存器中。与此同时,再将有有效地址寄存器中页内地址送入物理地址寄存器的块内字段中,这样就完成了从逻辑地址到物理地址的转变。
      在这里插入图片描述
  • 具有快表的地址变换机构
    • 上述方法需要访问两次内存一次是访问页表,确定所存取数据或指令的物理地址,一次是根据该物理地址存取数据或者指令。显然这样的方法较慢。
    • 为此我们可以在地址变换机构中增设一个具有并行查找能力的高速缓冲存储器——快表,又称联想寄存器,用来存放当前访问的若干页表项,加速地址变换过程,命中率达到90%以上。
    • 地址变换的过程为:在CPU给出有效地址后,由地址变换机构自动将页号P直接送入高速缓存寄存器,并快速与快表进行匹配,未找到则按慢表处理,同时把未找到的项放入到快表中,如果块表存满后,删除一个老的且被认为不在需要的页表项。
    • 有些处理器设计为快表和慢表同时查找,快表查找成功则终止慢表的查找。
      在这里插入图片描述

3. 访问内存的有效时间

  • 从进程发出指定逻辑地址的访问请求,经过地址变换,到在内存中找到对应的实际物理地址单元并取出数据,所需要花费的总时间,称为内存的有效访问时间(Effective Access Time,EAT)。
  • 假设访问一次内存的时间为t,在基本分页存储管理方式中,有效访问时间为:EAT = t + t = 2t。
  • 在引入快表的分页存储管理方式中,有效访问时间的计算公式即为;EAT=а×λ+(t+λ)(1—а)+t=2t+λ-t×а。λ表示查找快表所需要的时间,а表示命中率,t表示访问一次内存所需要的时间。

4. 两级和多级页表

  • 现代系统大多都支持非常大的逻辑空间,在这种情况下,页表就变得非常大,要占用相当大的内存空间。为了解决这一问题,我们采用了两种方法来改进这个问题
    • 对于页表所需要的内存空间,采用离散分配的算法。来解决难以找到一块连续的大内存问题
    • 只将当前需要的部分页表项调入到内存,其余页表项仍驻留在磁盘上,需要时在调入。
  • 两级页表
    • 外层页表
      两级页表就是将页表再次进行分页,将页表页面在离散的放在不同物理块中。同时为这些分散的页表页面再建立一张页表,称为外层页表,外层页表的页表项记录了页表页面的物理块号
    • 地址结构
      以32位逻辑地址空间为例。当页面大小为4kb时,若采用一级页表,应具有20位页号,即页表项应该有1M 个。如果采用二级页表结构时,在对页表进行分页,页表分页包含 2^10 个页表项,最多允许有 2^10页表页面。外层页表的页表项是页表,页表的页表项是进程的页面
      在这里插入图片描述
    • 地址变换
      在两级页表中,增加了一个外层页表寄存器,存放外层页表的始址,并利用逻辑地址中的外层页号 P1 作为外层页表的索引,从中找到指定页表分页的始址,再利用 P2 作为指定页表分页的索引,找到指定的页表项,其中即含有该页在内存的物理块号P,用该块号P和页内地址d即可构成访问的内存物理地址。
      在这里插入图片描述
  • 多级页表
    • 对于32位的机器,采用两级页表结构是合适的,但对于64位的机器,如果要求它支持 2^32规模的物理存储空间。
    • 对于64位的机器,如果要求它支持 2^64规模的物理存储空间,则即使是采用三级页表结构也是很难办到的的,而当前的实际应用中也无此必要。故在进两年推出的64位的OS中,把可直接寻址的存储器空间减少为45位长度,便可以利用三级页表结构实现分页存储管理。

5. 反置页表

  • 反置页表的引入
    • 为了减少页表占用内存的大小,引入了反置页表。
    • 一般的页表的页表项是按照页号进行排序的。页表项中的内容是物理块号。而反置页表是为每一个物理块建立一个页表项,并将他们按照物理块的编号进行排序,其中内容是页号和其所隶属进程的标识符。
  • 地址变换
    • 在利用反置页表进行地址变换时,是根据进程标识符和页号,去检索反置页表。如果检索到与之匹配的页表项,则该页表项(中)的序号i便是该页所在的物理块号,可用该块号与页内地址一起构成物理地址送内存地址寄存器。若检索了整个反置页表仍未找到匹配的页表项,则表明此页尚未装入内存。对于不具有请求调页功能的存储器管理系统,此时则表示地址出错。对于具有请求调页功能的存储器管理系统,此时应产生请求调页中断,系统将把此页调入内存。
    • 反置页表仅包含以调入内存的页面,并未包含未调入内存的页面,所以还应该为每个进程建立一个外部页表,该表和传统页表一样。
    • 搜索时可以采用哈希算法进行改进

二、分段存储管理方式

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

  • 引入分段存储管理方式的原因
    • 通常的程序都可以分为若干个段,每个段大多都是一个相对独立的逻辑单位
    • 实现和满足信息共享,信息保护,动态链接以及信息的动态增长等需求,也都是以段为基本单位的。

2. 分段系统的基本原理

  • 分段
    • 在分段存储管理方式中,作业的地址空间被划分为若干个段每个段定义了一组逻辑信息。例如,有主程序段MAIN、子程序段X、数据段D及栈段S等,通常,用段号代替段名。每个段都从0开始编址,并采用一段连续的地址空间
    • 段的长度由相应的逻辑信息组的长度决定,因此各段的长度并不相等
      在这里插入图片描述
  • 段表
    • 类似与分页系统,分段系统中段也是离散的分布在内存中,所以需也要为每个进程建立一个段映射表,简称段表
    • 每个段在表中占有一个表项,其中记录了该段在内存空间的起始地址(基址)和段的长度
      在这里插入图片描述
  • 地址变化机构
    • 为了实现进程从逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度TL
    • 在进行地址变换时:
      • 系统将逻辑地址中的段号与段表长度TL进行比较。若S>TL,表示段号太大,是访问越界,于是产生越界中断信号。
      • 若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址。
      • 再检查段内地址d是否超过该段的段长SL。若超过,即d>SL,同样发出越界中断信号。
      • 若未越界,则将该段的基址d与段内地址相加,即可得到要访问的内存物理地址。
        在这里插入图片描述
  • 分页和分段的比较
    • 相似
      • 两者都采用了离散分配方式
      • 都是通过地址映射机构实现地址变化
    • 区别
分页 分段
页是信息的物理单位,分页仅仅是为了系统管理的需求,完全是系统的行为,对用户是不可见的。 段是信息的逻辑单位,它通常是一组意义完整的信息,目的是更好的满足用户的需求。
页的大小固定且由系统决定 段的大小不定
分页的用户程序地址空间是一维的 分段系统中,用户的地址空间是二维的

3. 信息共享

分段系统的一个突出优点,是易于实现段的共享,即允许若干个进程共享一个或者多个分段

  • 分页系统中对程序和数据的共享
    • 分页系统中,虽然也能实现对程序和数据的共享,但远不如分段系统来得方便。例如多用户系统中,多个进程执行一个文本编译程序,该程序有160kb的代码和40kb的数据区。代码区可以共享。假设每个页面的大小为4kb,那么160kb的代码将占用40个页面,数据区占用10个页面。为了实现代码的共享,所以进程的40个代码页表项的物理块号是21#~60#。进程10个数据页表项的物理块号分别是61#~70#,71#~80#…如下图:
      在这里插入图片描述
  • 分段系统中对程序和数据的共享
    • 分段系统中,无论该段有多长,只需为该段设置一个段表项,这就使分段系统实现共享变得很容易。还是以上面的文本编辑器程序为例。下图就是分段程序共享文本编辑器的示意图:
      在这里插入图片描述

三、段页式存储管理方式

分页系统以页面作为内存分配的基本单位,能够有效提高内存的利用率,而分段系统以段作为内存分配的基本单位,它能够更好的满足用户多方面的需求。而段页式系统这很好的集两者之长。段页式系统既有分段系统的便于实现、分段可共享、已与保护、可动态链接等一系列优点;又能像分页系统那样,很好的解决内存的外部碎片问题

  • 基本原理
    • 段页式系统的基本原理是分段和分页原理的结合,即先将用户程序分为若干段,再把系统分为若干页,为每一个段分配一个段名
    • 段页地址结构包括三部分:段号,段内页号,页内地址
      在这里插入图片描述
    • 段表的内容和分段系统不同,它还包括页表大小和页内始址,下图就是利用段表进行从逻辑地址到物理地址的转变:
      在这里插入图片描述
  • 地址变换过程
    • 在段页式系统中,为了便于实现地址变换,须配置一个段表寄存器,其中存放段表始址和段长TL。
    • 进行地址变换时
      • 利用段号S,将它与段长TL进行比较。
      • 若S < TL,表示未越界,于是利用段表始址和段号来求出该段所对应的段表项在段表中的位置,从中得到该段的页表始址
      • 利用逻辑地址中的段内页号P来获得对应页的页表项位置,从中读出该页所在的物理块号b,
      • 再利用块号b和页内地址来构成物理地址。
    • 在段页式系统中,为了获取一条指令,需进行三次内存访问,即访问段表,访问页表,访问物理块号。为了提高运行速度,在其中增加一个高速缓冲寄存器。每次访问地址时,现在高速缓存器中查找,如果有,可直接找到物理块。若未找到,在使用原来的三次访问,之后将该物理块存入高速缓存器中。
      在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/pary__for/article/details/114438194