操作系统的内存管理机制(连续分配管理、页式、段式、段页式、快表、二级页表)

本文详细介绍了操作系统的内存管理机制,包括连续分配管理(单一分配、固定分配、动态分配)和非连续分配管理(分页、分段、段页式)。分页存储通过页表实现地址转换,快表(TLB)加速了这一过程。两级页表解决了大页表占用内存的问题。分段存储强调逻辑性,易于共享和保护信息。段页式存储结合了两者的优点,提高了内存利用率。
摘要由CSDN通过智能技术生成

来源:https://www.bilibili.com/video/BV1YE411D7nH

操作系统的内存管理机制(连续分配管理、页式、段式、段页式、快表、二级页表)

内存被分为系统区用户区,系统区存放操作系统相关数据;用户区存放用户进程相关数据。操作系统的内存管理机制分为两大类:连续分配管理、非连续分配管理

一、连续分配管理

1.单一分配管理
  • 概念:内存中只有一道程序,该道程序独占整个用户区(一次只有一个进程可以执行)
  • 特点:无外部碎片,可以采用覆盖技术,有内部碎片,内存利用率极低。
2.固定分配管理
  • 概念:固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存空间划分为若干固定大小的区域,每个区域只装入一道作业。

    ​ 固定分配管理可以分为两种:

    ​ 1、将内存中的用户区划分为若干个相同大小的分区,每个分区装入一道作业

    ​ 2、将内存中的用户区划分为大小不等的分区,每个分区装入一道作业

  • 特点:是用于多道程序设计的最简单存储分配,无外部碎片。有内部碎片,无法实现多进程共享一个主存区,所以会造成存储空间上的浪费。

3.动态分配管理
  • 概念:不会预先划分内存分区,当进程进入内存后,根据进程的大小动态建立分区,使分区的大小正好合适进程的需要。

  • 特点:实现了多道程序设计的存储分配,无内部碎片;内存中会产生越来越多的外部碎片(由于内存中的程序执行完了后会留下一个内存空间,当后面的进行需要的内存大小超过了这些遗留大小,那么就会源源不断地产生外部碎片),我们可以通过紧凑技术解决,但是该技术相当耗费时间。

以上几种方式都不会对当前进程/作业拆分,会根据进程的大小在内存中找到适合的分区进行加载。因此可以看出,连续分配的连续二字是针对一个进程/作业,若进程未进行拆分成而是保留成一个整体,则称之为连续分配的。因此,连续分配方式是指为一个进程分配一个连续的内存空间。

二、非连续分配管理

1.分页存储管理

将内存空间分为一个个大小相等的分区,每个分区称为一个"页框"或者"内存块",每个页框拥有一个页框号,页框号的编号从0开始。

同时将进程一个地址空间划分为与页框大小相同N个子区域,将这些区域称为"页"。每个页也具有一个编号,即"页号",其编号也从0开始。

注意:

  1. 进程的最后一个页的大小可能小于页框大小

  2. 页框不宜过大,否则会产生较大的内部碎片

每次将进程载入内存的过程也就是将该进程的N个页载入页框的过程。那么如果知道每个页面在内存中存放的起始地址呢?这时候操作系统会为每个进程创建一张页表

在这里插入图片描述

说明:
​ 1、 每个进程维护一张页表

​ 2、进程的每一页对应页表的一项(简单理解为一行)

​ 3、每个页表项由"页号"和"块号(内存块的编号)"组成

​ 4、页表中记录进程的每一页和实际存放内存块之间的对应关系

​ 5、页表项的长度是相同的,页号是"隐含的"(页表项按顺序连续存放在内存中,如果已知页表在内存中存放的 首地址X,那么M号页的页表项就会放置在 X + 一个块号所占的内存大小 * M

​ 6、通过页表可以找到块号,块号乘以内存块的大小可以获得当前页在实际内存中存放的首地址

记录一次从逻辑地址到物理地址的查找流程

假设进程A被分为5页,其中每页的大小为10k,假设第3页中存在一个逻辑地址为35的指令。当这条指令需要执行的时候

1.首先通过逻辑地址/页面长度 (35/10)获得页号3

2.再通过逻辑地址%页面长度 (35%10)获得偏移量5

3.通过页表查找页号3对应的块号,若采用上图,那么对应第n块,通过块号乘以内存块的大小得到当前页在实际内存中存放的首地址m

4.通过m + 5(偏移量)得到该指令在内存中的实际地址

注:以上是一种简单的表示形式,实际中页的大小通常是2的k次幂,而这个K代表的二进制位大小就是偏移量其余位数代表页号。

a.具有快表的地址变换机构
  1. 局部性原理
    • 时间局部性
      • 程序中某条指令在很短的时间间隔内会被多次执行(常见于循环语句)
    • 空间局部性
      • 程序访问了某个存储单元后,在很短的时间间隔内,其附近的存储单元很可能被访问(由于很多数据在内存中会连续存放,比如数组等)
  2. 快表(TLB)
    • 引入快表的背景

      ​ 根据前面分页式存储的地址查询过程可知,每次访问地址的时候都需要查询页表。通过局部性原理可知:很可能多次查询的都是同一个页表项

    • 快表的概念

      ​ 快表也称为联想寄存器(TLB),存储在相联寄存器中,它是一种访问速度比内存高很多高速缓冲存储器。目的是用于存放当前访问的若干页表项,进而达到加速地址访问的目的。相当于TLB,页表被称作慢表

  3. 引入快表后,地址的变换过程是什么样的?

    第一步:通过CPU给出的逻辑地址,根据硬件计算出页号和偏移量,检测页号准确性。若准确,则进行下一步,不准确,则终止运行。

    第二步:拿着偏移量在快表中查询,若找到对应的页表项副本,那么直接根据该副本信息对应的内存块和偏移量找出对应的内存中实际的物理地址物理地址(由于快表是存在相联寄存器中,因此本次找到只经过了一次访存操作,也就是访问物理内存那一次操作,访问高速缓存存储器这一次并不算访存操作)。若没有副本,则转到下一步。

    第三步:由于快表中不存在对应的副本,因此本次首先访问内存中的页表,通过页表查询出对应的页表项(此时还会将该页表项的副本存入快表中,若快表满了,会按照一定的淘汰策略对快表终的某一副本进行淘汰、替换,如LRU等),根据页表项中的内存块和偏移量拼接,得到内存中实际的物理地址(经过两次访存操作)。

    总结

    1. 通过快表访问时,访存次数为1,访问次数为2(访问快表的次数+访问物理内存的次数)。若快表中没有对应的页表项副本,则访存次数为2(访问页表的次数+ 访问物理内存的次数),访问次数为3(访问快表的次数+访问页表的次数+ 访问物理内存的次数)
    2. 快表中存储了部分或者全部页表中的页表项副本,根据局部一致性原则,访问快表的命中率会达到90%以上
    3. 快表可以加快逻辑地址到物理地址的转换
b.两级页表
单级页表存在的问题
  • 页表在内存中必须连续存放,当页表很大时,需要占用很多个内存连续的页框,这违反了非连续分配管理方式(采用多级页表)
  • 一个进程的执行可能不需要将整个页表常驻内存可能仅仅需要一部分的页表项就可以正常执行(采用虚拟存储技术)。
解决单级页表的问题
  • 将页表进行分组,使每个内存块刚好可以放下一个分组。将一个个分组离散地放入内存块中。
  • 为了得到分组前的顺序,再为这些离散分配的页表简历一张页表,称为页目录表(也称为顶级页表)
两级页表的原理、逻辑地址结构

​ 根据上面提到的分页存储管理的思想,若是将当前这个页表也分成若干个小的页表,那么就不需要分配连续内存的页框了。同时还需要一个页表来记录这若干个小的页表的基本信息(其格式如:【页号,1号小页表在内存中的起始地址】)。

二级页表的原理、结构

在这里插入图片描述

实现地址转换的流程

在这里插入图片描述

  1. 从进程的PCB(进程控制块)中读出页目录表的起始地址,再根据一级页号查询页目录表,通过其中的逻辑地址找到对应的内存块号
  2. 通过1中查询到的内存块号,可以在这个内存块号中取得对应的二级页表的内容,根据二级页号查找该二级页表表,找到最终想访问的内存块号
  3. 根据内存块号和业内偏移量得到真正的物理地址
细节问题
  • 两级页表的访存次数问题(没有快表的情况下)

    第一次:访问内存中的页目录表

    第二次:访问内存中的二级页表

    第三次:访问目标内存

    注意:在单级页表的情况下,只会有两次访存操作。因此多级页表页表解决了内存空间利用率低的问题,但是增加了时间复杂度。

    总结:在没有快表的情形下,N级页表需要访存N+1次

2. 分段存储管理

​ 与分页存储最大的不同点就是——离散时分配地址空间的基本单位不同。

​ 进程的划分规则:将进程按照自身逻辑划分为若干个段,每个段有一个段名(段是有实际意义的,分页管理的页没有实际意义),每一个段都会从0开始编址

​ 内存分配规则:以段为单位,每个段在内存中占有连续的存储空间,各个段之间可以连续,也可以不连续
在这里插入图片描述
由于各个段会离散地存储在内存中,因此段式存储也需要维护一张表,称为"段表"

在这里插入图片描述

地址转换过程:
在这里插入图片描述

1、由逻辑地址获得段号段内地址

2、将段号与段表寄存器中的段长度进行比较,查看是否越界。若越界,则终止退出,否则进入3

3、根据段表始址段号找到对应的段表项

4、根据段表项中的段长,判断段内地址是否越界。若越界,则终止退出,否则进入5

5、根据段表中的基址+段内地址得到最终的物理地址

6、访问目标单元

段式管理与页式管理的对比

段式管理与页式管理的对比

相同点:

  • 提高资源利用率,降低内存碎片
  • 每个页/段都是离散存储,单一个页/段内部是连续的

不同点:

  • 页的大小是固定的;段的大小是不相同的
  • 页是信息划分的物理单位(大小固定,没有实际意义);段是信息划分的逻辑单位(每个段具有物理意义)
  • 页的大小由操作系统决定,对用户来说是不可见的;段的大小是按照逻辑划分的,对用户来说是可见的(用户编程时可以显示给出段名)
  • 分页的用户进程是一维的(根据页号确定地址);分段的用户进程是二维的(标记地址时需要段名和段内地址确定)
  • 分段比分页更容易实现信息的共享和保护(因为分段是按照逻辑进行划分的,分页可能将一个逻辑部分划分为不同的页,则不容易实现信息的共享和保护)

最后,注意在段式存储里,也可以引入快表的机制。

3.段页式存储

前言:分段、分页管理的优缺点

优点缺点
分页管理内存利用率高;不产生外部碎片有少量的页内碎片不容易实现信息的共享和保护
分段管理容易根据逻辑模块实现信息的共享和保护若段太长,则会分配较长的连续内存空间;会产生外部碎片

段页式存储思想:首先将进程按照逻辑分段,再将各段分。再将内存划分为大小相同的内存块,将各页加载到内存中去。如下图所示:

在这里插入图片描述

段页式管理的逻辑地址结构组成: 段号 + 页号 + 页内地址(页内偏移量)

在这里插入图片描述

其中:段号的位数决定了每个进程可以分为多少段

页号的位数决定了每个段可以有多少页

​ 页内偏移量决定了页面的大小内存块的大小

段表与页表的关系

在这里插入图片描述

​ 一个进程会对应一个段表,由于一个段表对应多个页表,所以一个进程会对应多个页表。

地址转换过程:

在这里插入图片描述

1、由逻辑地址得到段号、页号、页内偏移量

2、段号与段表寄存器中的段长度比较,检测是否越界

3、有段表起始地址、段号找到对应的段表项

4、根据段表项中记录的页表长度,检查页号是否越界

5、根据段表中的页表地址、页号得到查询页表,找到相应的页表项

6、由页面存放的内存块号、页内偏移量得到最终的物理地址

7、访问目标单元

注:

  • 若没有引入快表机构,那么会进行三次访存,第一次查段表,第二次查页表,第三次访问目标单元
  • 若引入了快表机构,而且命中的话,则只需要一次访存
  • 12
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值