03 内存管理

第3章 内存管理

3.1 内存管理概念

3.1.1 内存的基础知识

1.内存的概念

  • 内存是用于存放数据的硬件,程序执行前需要先放入到内存中才能被处理(因为外存读取较慢)
  • 内存地址从0开始,每个地址对应一个存储单元
  • 如果计算机按字节编址,则每个存储单元为1个字节即1B,即8个二进制位;如果计算机按字长为16的按字编址,则每个存储单元大小为1个字,即16个二进制位

2.数量单位

  • 210 = 1K,220 = 1M,230 = 1G。
  • 若一台电脑的内存为4GB则指该内存可以存放4*230个字节,若该电脑为按字节编址,则有232个存储单元,所以一个地址需要用32个二进制位来表示

3.指令

  • 高级语言代码经过编译后生成机器指令,这些指令是由机器语言二进制来写的
  • 指令放在程序段,数据放在数据段,每个变量在内存中都有一个地址
  • 编译生成的指令中一般使用的地址是逻辑地址(相对地址)

4.逻辑地址 vs 物理地址

  • 逻辑地址即相对地址,物理地址即绝对地址

5.从写程序到程序运行

在这里插入图片描述

  • 编译:由编译程序将用户源代码编译成若干个目标模块(编译即将高级语言翻译为机器语言)
  • 链接:由链接程序将编译后形成的一组目标模块以及所需库函数链接在一起,形成装入模块
  • 装入:由装入程序将装入模块装入内存中运行

6.装入的三种方式

  • 绝对装入:在编译时如果知道程序放到内存哪个位置,编译程序将产生绝对地址的目标代码,这种方式只适用于单道程序环境
  • 静态重定位(可重定位装入):装入时对地址进行重定位,将逻辑地址变换为物理地址,这种方式要求一个作业装入内存时必须分配其要求的全部内存空间,否则不能装入,且作业进入内存后运行期间就不能再移动,也不能再申请内存空间
  • 动态重定位(动态运行时装入):装入程序把装入模块装入内存后,并不会立即把所有逻辑地址转换位物理地址,而是把地址转换推迟到程序真正执行时才进行,这种方式需要重定位寄存器

7.链接的三种方式

  • 静态链接
  • 装入时动态链接
  • 运行时动态链接

在这里插入图片描述

8.总结

在这里插入图片描述

3.1.2 内存管理的概念

  • 内存空间的分配与回收

  • 内存空间的扩展(os的虚拟性)

  • 地址转换(逻辑地址和物理地址的转换)

  • 内存保护

    • 法1:在CPU中设置一对上、下限寄存器,进程的指令访问某个地址时,CPU检查是否越界
    • 法2:重定位寄存器(基址寄存器,即起始物理地址)+界地址寄存器(限长寄存器,即最大逻辑地址

在这里插入图片描述

  • 总结

在这里插入图片描述

3.1.3 覆盖与交换

1.覆盖技术

  • 引入覆盖技术用来解决程序大小超过物理内存总和的问题
  • 内存中有固定区覆盖区。覆盖技术将程序分为多段,需要常驻内存的段放在固定区,调入后不再调出;不常用的段放在覆盖区,需要时调入内存,不需要时调出
  • 覆盖技术必须由程序员声明覆盖,对用户不透明,增加了用户负担,适于早期操作系统

在这里插入图片描述

2.交换(对换)技术

  • 定义:内存空间紧张时,系统将内存中的某些进程暂时换出外存把外存中某些已具备运行条件的进程换入内存,注意PCB会常驻内存,不会被换出内存
  • 回忆:暂时换出外存等待的进程状态称为挂起状态,可分为就绪挂起和阻塞挂起,中级调度就是实现交换技术的策略
  • 被换出进程保存在外存的位置:具有对换功能的操作系统将磁盘(外存)分为文件区和对换区。文件区追求存储空间的利用率,采用离散分配;对换区追求换入换出速度,采用连续分配。对换区的I/O速度比文件区快,所以外存中的对换区保存被调出的进程
  • 交换时机:内存吃紧就交换,系统载荷降低就停止
  • 交换进程:优先换出阻塞进程、低级进程(有的操作系统还会考虑进程在内存的驻留时间)

3.总结

在这里插入图片描述

3.1.4 连续分配管理方式

连续分配指为用户进程分配的必须是一个连续的内存空间

1.单一连续分配

  • 内存被分为系统区(通常位于低地址)和用户区
  • 内存中只能有一道用户程序,用户独占整个用户区
  • 优点:实现简单,无外部碎片,不一定需要内存保护;缺点:只用于单用户、单任务的操作系统,有内部碎片(即分配给某进程的内存区域中,如果有内存没用到就是内存碎片),存储器利用率极低

在这里插入图片描述

2.固定分区分配

  • 用户空间划分为若干个固定大小的分区,每个分区中只装入一道作业
  • 固定分区分配分为分区大小相等分区大小不等两种。分区大小相等缺乏灵活性,但适用于一台计算机控制多个相同对象的场合;分区大小不等增加了灵活性,可以满足不同大小的进程需求
  • os需要建立一个数据结构分区说明表,包括大小、起始地址、状态(是否被分配)
  • 固定分区分配的优点是无外部碎片,缺点是当用户程序太大时导致分区大小不满足时需要使用覆盖技术,这会降低性能,此外还可以产生内部碎片,内存利用率低

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

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

  • 不会预先划分内存分区,而是在进程装入程序时,根据进程的大小动态地建立分区
  • 两种数据结构记录内存情况:空闲分区表(每个空闲分区对应一个表,每个表包括分区号、分区大小、起始地址和状态)和空闲分区链(每个分区地起始部分和末尾部分分别设置前向和后向指针,起始部分还可记录分区大小)

在这里插入图片描述

  • 分配算法:即当有多个空闲分区都能满足需求时,需要按照一定的动态分区分配算法

  • 回收方式:回收后如果有相邻的空闲分区需要合并起来

  • 内部碎片:分配给某进程的内存区域中有些部分没用到;外部碎片:内存中某些空闲分区由于太小而难以利用,可以通过紧凑技术来解决

4.总结

在这里插入图片描述

3.1.5 动态分区分配算法

1.首次适应算法

  • 思想:每次从低地址开始查找,找到第一个能满足大小的空闲分区
  • 方法:空闲分区以地址递增的次序排列,每次分配内存时顺序查找空闲分区表(链),找到第一个满足大小的空闲分区

在这里插入图片描述

2.最佳适应算法

  • 思想:优先使用更小的空闲区

  • 方法:空闲分区按容量递增顺序链接,找到第一个满足要求的空闲分区

  • 缺点:会产生许多外部碎片

在这里插入图片描述

3.最坏适应算法(最大适应算法)

  • 思想:为了解决最佳适应算法产生的外部碎片问题,在每次分配时选择最大的连续空间进行分配
  • 方法:空闲分区按容量递减次序链接,找到第一个满足要求的空闲分区
  • 缺点:可能导致之后的大进程无内存可用

在这里插入图片描述

4.临近适应算法

  • 思想:与首次适应算法类似,只不过首次适应算法每次检索时都需要从头检索,增加了开销,而临近适应算法每次都从上次查找结束的位置开始检索
  • 方法:空闲分区以地址递增的顺序排列,每次分配内存时从上次查找结束的位置开始查找
  • 首次适应算法有最佳适应算法的优点,而临近适应算法有最大适应算法的缺点

在这里插入图片描述

5.总结

在这里插入图片描述

3.1.6 基本分页存储管理的基本概念

连续分配:为用户进程分配的必须是一个连续的内存空间;非连续分配:为用户进程分配的可以是一些分散的内存空间

1.分页存储管理的基本概念

  • 将内存空间分为大小相等的分区,每个分区称为一个页框(页帧、内存块、物理块),每个页框都有一个编号,称为页框号(页帧号、内存块号、物理块号),页框号从0开始
  • 将用户进程的地址空间也分为与页框大小相等的分区,称为页(页面),每个页的编号称为页号,页号也从0开始
  • os以页框为单位分配各个进程的内存空间,每个页不必连续存放。页框不能太大否则可能会产生过大的内部碎片。

在这里插入图片描述

2.实现地址转换(逻辑地址→物理地址)的方法

  • 物理地址 = 页面始址 + 页内偏移量
    • 页号 = 逻辑地址 / 页面长度(取整数部分),操作系统使用**某种数据结构(页表)**记录页面始址
    • 页内偏移量 = 逻辑地址 % 页面长度
  • 如果每个页面的大小为2KB,用二进制表示逻辑地址,则末尾K位即为页内偏移量,其余部分为页号

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.逻辑地址结构

  • 若地址长度为32位,页面大小位212存储单元,则0-11位为页内偏移量(页内地址),12-31位为页号。如果用K位表示页内偏移量,则说明一个页面大小为2K个存储单元;如果用M位表示页号,则说明一个进程最多有2M个页面。

在这里插入图片描述

4.页表

  • 一个进程对应一个页表,每个页表由页号块号组成,页表记录的是进程页面实际存放的内存块之间的对应关系。(进程的每一页对应一个页表项
  • 每个页表项的长度相同,页号是隐含的,只需知道页表存放的起始地址页表项长度,即可找到各个页号对应的页表项存放的位置。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.总结

在这里插入图片描述

3.1.7 基本地址变换机构

1.页表寄存器

  • 页表寄存器存放页表在内存中的起始地址F页表长度M,程序未执行时,页表的始址和页表长度放在进程控制块PCB中,当进程被调度时,操作系统内核会把他们放在页表寄存器中

2.逻辑地址到物理地址转换过程

  • 页表长度:页面中总共有几个页表项,即总共有几页
  • 页表项长度:每个页表项占多大的内存空间
  • 页面大小:一个页面占多大的存储空间
  • 页式管理中地址是一维的

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.页表项大小的进一步研究

  • 为了方便页表的查询,通常会使每个页面恰好可以装得下整数个页表项

在这里插入图片描述

4.总结

在这里插入图片描述

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

1.局部性原理

  • 时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很有可能再次被访问(因为程序中可能存在大量循环)

  • 空间局部性:一旦程序访问了某个存储单元,在不久后,其附近的存储单元也有可能被访问(因为数据在内存中是连续存放的)

2.快表

  • 快表又称为联想寄存器(TLB),是一种访问速度比内存快很多的高速缓冲存储器,用来存放当前访问的若干页表项,加速地址变换过程。而内存中的页表通常称为满表

在这里插入图片描述

在这里插入图片描述

3.总结

在这里插入图片描述

3.1.9 两级页表

1.单级页表的问题

  • 问题1:页表必须连续存放,当页表很大时,需要占用多个连续的页框
  • 问题2:没必要让整个页表常驻内存

2.两级页表原理(解决了问题1)

  • 将页表进行分割,并用新的表表示,这个新的表称为页目录表(顶层页表/外层页表)

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

3.几个细节

  • 采用多级页表机制,各级页表的大小不能超过一个页面
  • n级页表如果没有快表机构,则需要n+1次访存

在这里插入图片描述

4.总结

在这里插入图片描述

3.1.10 基本分段存储管理方式

1.分段

  • 进程的地址空间按照自身逻辑关系划分为若干个段,每个段有一个段名每段从0开始编址
  • 内存分配规则:以段为单位进行分配,每段在内存中占据连续空间,但各断之间可以不相邻
  • 分段系统的逻辑地址由**段号(段名)和段内地址(段内偏移量)**组成,段号的位数决定每个进程最多可以分为几段,段内地址的位数决定每个段的最大长度是多少。

在这里插入图片描述

在这里插入图片描述

2.段表

  • 记录了各个逻辑段到实际的物理内存存放位置的映射关系

  • 每个段对应一个段表项,每个段表项包括起始位置(基址)和段的长度

  • 段表项的长度是是相同的,段号是隐含的,不占内存空间

在这里插入图片描述

3.地址变换

在这里插入图片描述

4.分段、分页管理的对比

  • 页是物理信息的单位,属于系统行为,对用户不可见;段是逻辑信息的单位,属于用户行为,对用户可见
  • 页的长度固定且由系统决定,段的长度不固定由用户编程决定
  • 分页的用户进程地址空间是一维的,程序员只需给出一个记忆符即可表示一个地址;分段的用户进程地址空间是二维的,程序员既要给出段名,又要给出段内地址
  • 分段比分页更容易实现信息的保护与共享
  • 分页(单级页表)和分段(单级段表)都需要两次访存

5.总结

在这里插入图片描述

3.1.11 段页式管理方式

1.分页、分段的优缺点

  • 分页管理:优点是内存空间利用率高,不会产生外部碎片,只会有少部分的内部碎片。缺点是不方便实现信息的共享与保护。
  • 分段管理:优点是方便按照逻辑模块实现信息的共享与保护。缺点是如果段长太长会产生外部碎片(也可以通过紧凑技术解决)

2.段页式管理

  • 先分段再分页

在这里插入图片描述

在这里插入图片描述

3.段表、页表

  • 一个进程对应一个段表,一个进程有可能对应多个页表

在这里插入图片描述

3.地址转换

在这里插入图片描述

4.总结

在这里插入图片描述

3.2 虚拟内存管理

3.2.1 虚拟内存的基本概念

1.传统存储管理方式的特征、缺点

  • 一次性:作业必须一次性全部装入内存后才能开始运行,会导致大作业无法运行、多道程序并发度下降
  • 驻留性:一旦作业装入内存就会一直驻留在内存

2.局部性原理

  • 时间局部性:如果执行了程序中的某条指令,不久后这条指令可能会再次执行
  • 空间局部性:一旦程序访问了某个存储单元,不久后其附近的存储单元也也有可能被访问
  • 高速缓冲技术思想:将近期会频繁访问到的数据放到更高速的存储器中,暂时用不到的数据存放在更低速存储器中,快表机构就是将近期常访问的页表放到更高速的联想寄存器中

3.虚拟内存的定义和特征

在这里插入图片描述

  • 基于局部性原理,在程序装入时可以将程序中很快会用到的部分转入内存,暂时用不到的部分留在外存;程序执行过程中如果所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存;若内存空间不够,则由操作系统负责将内存中暂时用不到的信息换出到外存。因此在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存
  • 虚拟内存的最大容量由计算机的地址结构(CPU的寻址范围)确定,虚拟内存的实际容量 = min(内存和外存容量之和,CPU寻址范围)

在这里插入图片描述

  • 虚拟内存由多次性、对换性、虚拟性特征

4.实现虚拟内存技术的方法

  • 虚拟内存的实现建立在离散分配的内存管理方式的基础上
  • 分为请求分页存储管理请求分段存储管理请求段页式存储管理方式。操作系统还需要提供请求调页/段(调入内存)和段/页面置换(换出外存)

5.总结

在这里插入图片描述

3.2.2 请求分页管理方式

1.页表机制

  • 基本分页的基础上增加了状态位(页面是否在内存中)、访问字段(被访问的次数或时间)、修改位(是否被修改)、外存地址形成请求分页
  • 缺页中断属于内中断中的故障

在这里插入图片描述

2.缺页的中断机构

在这里插入图片描述

在这里插入图片描述

3.地址变换机构

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.总结

在这里插入图片描述

3.2.3 页面置换算法

页面的换入、换出需要磁盘I/O,会有较大的开销,因此好的页面置换算法应该追求更少的缺页率

1.最佳置换算法(OPT)

  • 思想:每次选择淘汰的页面将是以后永不使用,或者在最长时间内不再被访问的页面
  • 最佳置换算法由于操作系统无法提前预判页面的访问序列,因此是无法实现的

在这里插入图片描述

2.先进先出置换算法(FIFO)

  • 思想:每次淘汰的页面是最早进入内存的页面
  • 方法:把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择队头页面即可,队列的最大长度却决于系统为进程分配了多少个内存块

在这里插入图片描述

  • Belady异常:当为进程分配的物理块数增大时,缺页次数不增反减的异常现象。只有FIFO算法会产生Belady异常,所以FIFO算法虽然实现简单,但算法性能差

3.最近最久未使用置换算法(LRU)

  • 思想:每次淘汰的页面是最近最久未使用的页面
  • 方法:赋予每个页面对应的页表项中,用访问字段记录该页面上次被访问以来所经历的时间t。当需要淘汰一个页面时,选择现有页面中t值最大的,即最近最久未使用的页面。

在这里插入图片描述

4.时钟置换算法(CLOCK)

  • 又称为CLOCK算法最近未使用算法(NRU)

  • 简单的CLOCK算法:为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位置位1。当需要淘汰一个页面时,只需检查页的访问位,如果为0,则选择该页换成;如果为1,则将它置换为0,暂不换出,继续检查下一个页面。

在这里插入图片描述

  • 改进型的时钟置换算法:在其他条件都相同时,应优先淘汰没有修改过的页面,避免I/O操作。修改位为0,表示页面没有被修改过,修改位为1,表示页面被修改过。
  • 规则:将所有可能被置换的页面排成一个循环队列

在这里插入图片描述

5.总结

在这里插入图片描述

3.2.4 页面分配策略

1.页面分配、置换策略

  • 驻留集指请求分页存储管理中给进程分配的物理块的集合,在采用虚拟存储技术的系统中,驻留集的大小一般小于进程的总大小。驻留集不能太大和太小
  • 固定分配:驻留集的大小不变;可变分配:驻留集的大小可变
  • 局部置换:发生缺页时只能选择自己的物理块进行置换;全局置换:可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配给缺页进程

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

2.何时调入页面

  • 预调页策略
  • 请求调页策略
    在这里插入图片描述

3.何处调入页面

在这里插入图片描述

4.抖动(颠簸)现象

在这里插入图片描述

5.工作集

在这里插入图片描述

6.总结

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值