操作系统--03内存管理

2023-05-16

内存管理

  • 第三章:内存管理(存储器管理)
    • 3.内存保护的两种办法:
    • 3.1 覆盖与交换
    • 3.2 连续分配管理方式
    • 3.3 动态分区分配算法
      • 1.首次适应算法:
      • 2.最佳适应算法:
      • 3.最坏适应算法:
      • 4.邻近适应算法:
    • 3.4 基本分页存储管理方式
    • 3.1.8 具有快表的地址变换机构
    • 3.1.9 两级页表
    • 3.1.10 基本分段存储管理
    • 3.1.11 段页式管理方式
  • 3.2虚拟内存:
    • 3.2.2 请求分页管理方式
    • 3.2.2 页面置换算法
      • 1.最佳置换算法(OPT)
      • 2.先进先出置换算法(FIFO)
      • 3.最近最久未使用置换算法(LRU)
      • 4.时钟置换算法(CLOCK)
    • 3.2.3 页面分配、置换策略

第三章:内存管理(存储器管理)

1.链接–形成逻辑地址
2.装载–逻辑地址映射到物理地址

3.内存保护的两种办法:

在CPU中设置一对上限和下限寄存器,存放进程的上下限地址。进程的指令要访问某个地址时,CPU检查是否越界。

采用重定位寄存器和界地址寄存器。
重定位寄存器用来存放进程的起始物理地址
界地址寄存器存放进程的最大逻辑地址(长度)。越出边界,抛出越界异常。

3.1 覆盖与交换

实现内存空间的扩充

覆盖技术:对用户不透明**,

覆盖和交换的区别:覆盖是在同一个进程或者程序中的,交换是在不同进程或者作业之间进行的。

3.2 连续分配管理方式

实现内存空间的分配和回收

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

1.单一连续分配:
设计思想:内存被分为系统区和用户区。系统区通常位于内存的低地址部分,用户存放操作系统的相关数据;用户区存放用户进程相关数据。内存中同一时刻只能有一道用户程序,用户程序独占整个用户区。
优点:实现简单,无外部碎片。可以采用覆盖技术扩充内存,不一定需要采取内存保护。

缺点:只支持单用户、单任务的操作系统。会产生内部碎片,内部碎片指的没有用上的内存空间。存储器利用率低。

2.固定分区分配:
设计思想:将整个用户空间划分为若干个固定大小的分区,在每个分区只装入一个作业。若分区大小相等,缺乏灵活性,但是很适用于用一台计算机控制多个相同对象的场合。分区大小不等:增加了灵活性。
操作系统需要建立一个数据结构–分区说明表,记录对应分区的大小,起始地址,是否已分配状态。

优点:实现简单,无外部碎片。

缺点:当用户程序太大时,需要用覆盖技术,降低了性能;会产生内部碎片。

3.动态分区分配:
设计思想:不会预先划分内存分区,而是在进程装入内存时,根据内存大小动态建立分区。系统分区的大小和数量是可变的。

使用什么样的数据结构记录使用情况?
空闲分区表:记录分区号,分区大小,分区起始地址等;

空闲分区链:分区的起始部分和末尾部分分别设置前向指针和后向指针,起始部分记录分区大小等信息

如何进行分区的分配和回收
相邻的空闲分区需要合并。

动态分区分配没有内部碎片,但是有外部碎片。
内部碎片是指分配给某进程的内部区域中有部分内存空间没有被利用。外部碎片是指内存中某些空闲分区因为太小而难以利用。

可以通过紧凑(拼凑)技术来解决外部碎片。

3.3 动态分区分配算法

1.首次适应算法:

实现:空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区表或者空闲分区链。

2.最佳适应算法:

算法思想:尽可能多的留下大片连续的空闲分区。优先使用满足条件的更小的分区。

实现:空闲分区按容量递增的次序链接。
每次分配内存时顺序查找空闲分区表或者空闲分区链,找到第一个满足条件的空闲分区。总是需要重新排序,算法开销大。

缺点:会留下越来越多的很小的、难以利用的内存快,
这种方法会产生很多的外部碎片

3.最坏适应算法:

算法思想:优先使用最大的空闲分区。

实现:空闲分区按容量递减的次序排列。
每次分配时使用第一个空闲分区。第一个总是分区最大的。总是需要重新排序,算法开销大。

缺点会导致大的空闲分区很快用完,如果有一个大进程到达,会造成无分区分配。

4.邻近适应算法:

算法思想:每次都从上次查找结束的位置开始查找。解决每次都从低地址开始检索的问题。

实现:空闲分区按照地址递增的顺序排列(可排成一个循环链表)。算法开销小。

缺点大分区容易用完,类似于最坏适应算法的缺点。

3.4 基本分页存储管理方式

页表寄存器(PTR):
存放页表在内存中的起始地址F和页表长度M

在这里插入图片描述


逻辑地址–>物理地址的转换过程:

1.根据逻辑地址计算出页号和页内偏移量

2.判断页号是否越界,如果页号>页表长度,则产生越界中断

3.查询页表
找到页号对应的页表项地址(页表项地址 =页表起始地址 + 页号 * 页表项长度),取出该页表项内容,即为物理块号
一般不用计算,可以从页表中直接看到物理块号

页表长度(一共有多少个页),页表项长度(页地址占多大的存储空间)

4.用得到的物理地址去访问内存
物理地址=物理块号*页面大小+页内偏移量


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

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

空间局部性:一旦程序访问了某个存储单元,那么不久后其附近的存储单元很有可能再次被访问。(因为很多数据在内存中都是连续存储的)

以上统称为局部性原理。

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

没有引入快表,需要两次访问内存,引入快表后,先查询快表,若快表命中,只需要一次访问内存,若快表未命中,需要两次访问内存。

3.1.9 两级页表

单极页表存在的问题:

页表必须连续存放,当页表很大时,需要占用很多个连续的页框。
页表可以改为分散存储,一个小分组正好可以装入一个内存块,为页表设置一个顶层页表,也称页目录表,用来记录每个分组的内存块号。

两级页表:将逻辑地址分为一级页号,二级页号,页内偏移量三个部分。可解决第一个问题。

没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。
可以在需要访问页面时才把页面调入内存(虚拟存储技术)。可以在也表中增加一个标志位,用于表示该页面是否已经调入内存。

若采用多级页表机制,则各级页表的大小不能超过一个页面。
N级页表的访问内存次数分析:假设没有快表机构,需要进行N+1次访问内存。

3.1.10 基本分段存储管理

在这里插入图片描述

地址变换过程:

1:比较段号和页表项长度,如果段号大于页表项长度,则产生越界中断

2.段号对应的段表项地址=段表始址+段号*段表项长度
根据段表项地址找到段表项,段表项的前几位为段长,判断段长和段内偏移量的大小,如果段内偏移量>段长,则会产生越界中断

3.取出段表项的始址,物理地址=段表项的始址+段内偏移量


分页和分段区别:

分页对用户不可见,分段对用户可见

分页的地址空间是一维的,分段的地址的空间是二维的。

**分页内存空间利用率高,**不会产生外部碎片,只会产生少量的页内碎片,分段会产生外部碎片。

分段比分页更容易实现信息的共享和保护反应程序的逻辑结构,模块实现信息的共享和保护。例如,页面大小为4KB,其中3KB属于第一个段,1KB属于第二个段,而第一个段可以共享,第二个段不能共享,分页无法实现。


3.1.11 段页式管理方式

将进程按照逻辑模块分段,再将各个段分页。

逻辑地址:段号(决定每个进程最多可以有多少段)+页面(决定每个段最多有多少页)+
页内偏移量(页面大小),因此段页式管理的地址结构是二维的。

段表项:段号(隐含)+页表长度+页表存放块号

页表项:页号(隐含)+页面存放的内存块号

3.2虚拟内存:


虚拟存储器

内存空间有限(从逻辑上扩充)
逻辑地址到物理地址的映射
容量上接近辅存
速度上接近内存


在程序装入时,可以将程序中很快用到的部分装入内存,暂时用不到的部分留在外存。
在程序执行过程中,当所访问的信息不再内存中,由操作系统负责将所需信息从外存调入内存。(请求调页/段)
若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。(页/段置换)
虚拟内存的实现需要建立在离散分配的内存管理方式上。

虚拟内存的主要特征:

多次性:无需在作业运行时一次性管不装入内存,而是允许被分成多次调用内存。

对换性:在作业运行时,无需一直常驻内存,而是允许在作业运行过程中,将作业换入换出。

虚拟性:从逻辑在扩充了内存容量。

3.2.2 请求分页管理方式

请求分页管理方式是在基本分页存储管理上扩展的一种虚拟内存存储技术。

主要区别是增加了两个功能:请求调页,页面置换。

缺页中断属于内中断,属于故障


地址变换过程:
1.判断页号是否大于页表长度:
如果大于则产生越界中断

2.判断页表项是否在块表中
(1)如果在快表中,直接修改访问位和修改位,形成物理地址
(2)如果不在快表中,访问页表,判断页表项是否在内存中:
如果在内存中,直接修改访问位和修改位,形成物理地址
如果不在内存中:产生缺页中断请求调页,从外存中找到缺页,修改页表和修改位


3.2.2 页面置换算法

1.最佳置换算法(OPT)

算法思想:每次选择淘汰的页面将是永久不使用,或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率。

缺点:操作系统无法预判页面访问序列,因此,在实际应用中无法实现。

缺页中断时未必发生页面置换,若还有可用的空闲块,就不用进行页面置换。

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

算法思想:每次淘汰最早进入内存的页面。

实现:把调入内存的页面根据调用的先后顺序排成一个队列,需要置换时选择队头页面即可。队列的最大长度取决于系统为进程分配了多少内存块。

缺点:会产生Belady异常,即当为进程分配的内存块越多时,缺页次数出现不减反增的现象。虽然实现简单,但是该算法与进程实际运行的规律不适应。因为先进入的页面可能也会经常被访问,算法性能差。

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

算法思想:往前看,每次淘汰最后看到的那个页面(最近没有使用的那个页面)。

缺点:该算法的实现需要专门的硬件支持,虽然算法性能好,但是实现困难,开销大。是最接近OPT的。

4.时钟置换算法(CLOCK)

是一种性能和开销比较均衡的算法,又称为最久未用算法(NRU)

简单的CLOCK算法实现:

改进的CLOCK算法:优先淘汰未被访问的
淘汰顺序:未被访问且未修改的,未被访问且被修改,被访问且未修改、被访问且被修改的

3.2.3 页面分配、置换策略

驻留集:指请求分页存储管理中给进程分配物理块的集合。在采用了虚拟存储技术的系统中,驻留集大小一般小于进程的总大小。

固定分配:驻留集不变

可变分配:驻留集大小可变

局部置换:发生缺页时,只能选择进程自己的物理快进程置换

全局置换:发生缺页时,可以将操作系统保留的空闲物理快分配给缺页进程,也可以将别的进程持有的物理快置换到外存,再分配给缺页进程。

可变分配局部置换搭配方案较优。

何时调入页面?

预调页策略:根据空间局部性原理,一次调入若干个相邻的页面可能比一次调入一个页面更加高效。但如果提前调入的页面中大多数都没被访问过,则又是低效的。一般用于进程的首次调入,即运行前调入,由程序员指定应该先调入哪些部分。
请求调页策略:进程在运行期间发生缺页时才将所缺页面调入内存。I/O操作多,开销大。
抖动(颠簸)现象:

刚刚换出的页面马上又要换入内存,刚刚换入的界面马上又要换出外存。这中频繁的页面调度行为,称为抖动。产生抖动的主要原因是进程频繁访问的页面数高于可用的物理块数。

工作集:以箭头为分界线 ,向前划窗口大小的数据集,找出不重复的集合就是工作集

驻留集大小不能小于工作集大小,否则进程运行过程中将频繁缺页。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统--03内存管理 的相关文章

  • Java-新年抽奖-消息自动化发送脚本

    我们公司7点半开年会 然后大约8点半开始抽奖抢 使用腾讯会议的方式进行发关键字消息然后截图方式抽奖 然而我还在地铁上 手速慢的我只抽到了3等奖小米耳机一个 然后我回家后迫不及待第一时间赶紧使用java写一个机器人脚本 疯狂发消息 一言难尽啊
  • Java多线程-CompletableFuture(链式)

    线程池这个大家都知道 xff0c 是为了提高效率 xff0c 可以类比生活 xff0c 如果开个店 xff0c 需要几个员工 xff0c 正常的操作都是雇佣员工 xff0c 而不是每天使用临时工 xff0c 这样用完就解雇掉 xff0c 对
  • Java-Javassist(字节码修改)

    文章目录 开篇Javassist 常用类Javassist 的使用依赖代码示例 如何实现类似 AOP 的功能 开篇 说起 AOP 小伙伴们肯定很熟悉 xff0c 无论是 JDK 动态代理或者是 CGLIB 等 xff0c 其底层都是通过操作
  • Java多线程-Pip管道

    管道的意思 就是向一个管子一样从一端到另一端 只支持单方向的数据传输 需要注意的不能在同一个线程使用管道否则会导致死锁的情况 发生和接收必须在不同线程 通过使用管道 xff0c 实现不同线程间的通信 xff0c 而无需借助于临时文件之类的东
  • 新版本代码自动生成(MybatisPlus-generator) 代码示例+问题解决

    虽然MybatisPlus官网上已经给出了新版本代码生成器的核心依赖和核心代码 xff0c 但对于没接触过的小伙伴还是比较困难上手 x1f62d xff0c 本文将展现如何使用MybatisPlus generator快速生成代码 目录 1
  • 虚拟机如何使用共享文件夹传文件

    项目场景 xff1a 在使用VMware平台 xff0c ubuntu操作系统时 xff0c ftp文件传输一直报错 问题描述 xff1a 尝试了多种 xff0c 更改电脑设置 xff0c 甚至重装虚拟机 xff0c 始终如下图报错 解决方
  • 强化学习入门DQN详解

    Deep Q Network 参考资料 xff1a B站莫烦 xff1a https www bilibili com video BV13W411Y75P spm id from 61 333 337 search card all cl
  • 某项目因为多次流标导致实际项目时间严重压缩,我该咋办?

    问题 xff1a 某政府项目 xff0c 三个月前就开始招标 xff0c 因各种原因 xff0c 流标三次 xff0c 导致时间拖太长 原计划一期工期三个月 43 xff0c 1月底上线 xff0c 但因为招投标影响直到一个月前签订了合同
  • ROS创建工作空间及功能包流程总结整理(python)

    ROS创建工作空间及功能包流程总结整理 xff08 python xff09 参考资料 xff1a B站赵虚左 xff1a https www bilibili com video BV1Ci4y1L7ZZ p 61 19 amp vd s
  • ROS自定义发布消息类型

    ROS自定义发布消息类型 xff1a 在 ROS 通信协议中 xff0c 数据载体是一个较为重要组成部分 xff0c 在上一案例中 xff0c ROS 中通过 std msgs 封装了一些原生的数据类型 比如 String Int32 In
  • ROS服务通信:自定义数据文件以及服务端和客户端代码编写流程及步骤详解

    ROS服务通信具体实现流程 demo xff1a 实现两个整型数相加求和 xff0c 客户端发送两个整型数 xff0c 服务端对其求和 服务通信也需要自定义服务数据类型 xff0c 即自定义srv文件 xff0c 该过程和自定义msg文件非
  • ROS TF静态坐标变换实现

    ROS TF静态坐标变换实现 法一 xff1a 编码实现 发布方代码实现 xff1a 创建功能包并添加依赖 catkin create pkg tf static roscpp rospy std msgs tf2 tf2 ros tf2
  • ROS:Gazebo导入自定义环境

    Gazebo导入自定义环境 之前的案例gazebo中导入的是一个空世界empty world xff0c 这里会介绍如何导入房屋数目等自定义的环境 xff08 1 xff09 启动 gazebo 打开构建面板 xff0c 绘制仿真环境 xf
  • ROS导航实现:SLAM建图(slam_gmapping)与保存(map_server)

    导航实现 xff1a SLAM建图 先安装相关的ROS功能包 安装 gmapping 包 用于构建地图 sudo apt install ros lt ROS版本 gt gmapping 安装地图服务包 用于保存与读取地图 sudo apt
  • ROS导航实现:amcl定位

    ROS导航实现 xff1a amcl定位 xff08 1 xff09 首先编写启动amcl的launch文件 xff0c 这里建议复制粘贴模板 xff0c 再修改相关的参数即可 xff0c 步骤如下 xff1a 主目录下进入amcl文件 r
  • ROS导航实现之路径规划

    导航实现之路径规划 move base 功能包提供了基于动作 action 的路径规划实现 xff0c move base 可以根据给定的目标点 xff0c 控制机器人底盘运动至目标位置 xff0c 并且在运动过程中会连续反馈机器人自身的姿
  • 创建个人网站(github pages)并将站点一键托管到Github

    创建个人网站 xff08 github pages xff09 并将站点一键托管到Github 内容 xff1a 使用网站生成器mkdocs将markdown文件生成wiki站点并挂载到github的流程总结 亮点 xff1a 个人网站一键
  • 视觉SLAM十四讲(第2版)总结

    最近看完了 视觉SLAM十四讲 xff08 第2版 xff09 xff1a 从理论到实践 xff08 高翔等著 xff09 xff0c 原书分两部分 xff0c 先介绍了数学基础 xff0c 然后介绍了具体的SLAM实践 xff0c 非常适
  • 我的公众号 - 豆芽儿 软件研发人才生长社区

    为你系统分享敏捷开发 项目管理 需求分析 软件设计 UML 中层领导力 CMMI IT职场 ACP 软考 PMP等 高大上 的实用知识 xff0c 帮助你进阶为高端人才 xff01
  • Openblas 下载和使用方法

    Openblas 下载及使用 环境 xff1a 平台 xff1a Ubuntu 20 04 xff0c Orin xff1a Arm Cortex A78AE v8 2 64 bit 步骤 xff1a 1 去github 下载openbla

随机推荐

  • FreeRTOS学习记录

    FreeRTOS学习记录 前言FreeRTOS学习记录在STM32CubeMX中配置FreeRTOS 前言 本人小白 xff0c 最近学习了FreeRTOS操作系统 xff0c 打算做一点记录 学习的过程中虽然做了点练习 xff0c 不过都
  • 如何给华三交换机恢复出厂设置及命令

    如何给华三交换机恢复出厂设置及命令 在前几天 xff0c 上级单位线路重新规划 xff0c 需要我们将单位的线路进行改造 xff0c 这就涉及到了网络设备的重新配置 经查看 xff0c 上级接入交换机的业务端口配置为access xff0c
  • 解决Linux下Docker下载安装太慢

    卸载先前版本 yum remove docker docker span class token operator span client docker span class token operator span client span
  • sqlyong连接docker中的mysql 失败can‘t connect to MySQL server on (*******:3306)

    解决sqlyong连接docker中myslq失败 xff1a 一 查看mysql是否运行docker ps 二 查看mysql端口映射是否与连接相符 三 进入mysql容器查看是否能够进行本地连接docker exec it mysql
  • 解决springboot+webSocket出现404错误

    这是因为websocket创建的bean是由自己来管理的 需要将其创建的bean交给spring管理 创建websocketconfig span class token keyword package span com span clas
  • Bytebuffer源码剖析及实现原理

    Bytebuffer 官方解释A byte buffer xff0c 一个字节缓冲区 一 使用方法 ByteBuffer 初始状态是写模式 使用IO流即可写入数据 如 channel read 如果需要读取ByteBuffer中的数据调用f
  • Linux下安装并配置FTP文件服务器

    一 安装vsftpd 1 运行如下代码安装vsftpd yum install span class token operator span y vsftpd 2 运行以下命令设置FTP服务开机自启动 systemctl enable vs
  • Java 实现 图片OCR文字识别

    Java 实现图片OCR文字识别功能 前言 由于网上很多算法 以及语言库无法做到精准识别 所以综合条件下 使用了一款 space OCR API 的产品进行使用 每个月有25000条的 使用额度 日常使用或开发绰绰有余 网址链接 一 注册
  • js实现表单的校验

    js实现表单校验 CV即用 1 效果图 当每个输入框失去焦点时会通过正则表达式来验证输入的格式是否正确 点击登录按钮后 xff0c 如果有格式不正确的将无法登录 当校验全部通过以后才可以登录 2 源代码 xff1a HTML代码 xff1a
  • 你和国际项目经理(PMP),一步之遥?-张传波-专题视频课程

    你和国际项目经理 PMP xff0c 一步之遥 xff1f 913人已学习 课程介绍 项目管理是门实战性超强的大学问 xff0c 项目经理是一位能把控全局的 狠 角色 xff01 你距离这样的 狠 角色有多远呢 xff0c 你应该如何规划自
  • RTOS任务切换原理与实现

    曾今只是使用过移植好的RTOS进行任务开发 xff0c 对其实现的底层原理一直一知半解 xff0c 正好接触到了李述桐老师的课程以及一些网上的资料 xff0c 让我对实时操作系统的原理有了更深的理解 xff0c 特此把一些原理和思考记录下来
  • python报错:Process finished with exit code -1066598274 (0xC06D007E) 解决方法

    1 在运行Mask RCNN项目时 xff0c 导入官网下载的代码和数据集 xff0c 准备运行时报此错误 2 原因 官网要求python版本是3 4 xff0c 但是我python编译器版本为3 9 3 解决 将编译器版本更换为3 7试试
  • OpenCV4学习笔记(72)——ArUco模块之aruco标记的创建与检测

    今天要整理记录的是OpenCV中ArUco模块的基础内容 xff0c 包含aruco标记的创建与检测 要注意的是ArUco模块是包含在OpenCV的contrib拓展库中的 xff0c 需要自行下载OpenCV基础库和contrib拓展库进
  • OpenCV4学习笔记(74)——ArUco模块之对aruco标记进行实时姿态估计

    在之前的笔记 OpenCV4学习笔记 xff08 72 xff09 中 xff0c 记录了在OpenCV中关于aruco标记的创建和检测这方面的内容 xff0c 今天就基于aruco标记检测来进一步实现对aruco标记的实时姿态估计 首先我
  • OpenCV4学习笔记(75)——ArUco模块之实现AR(增强现实)效果

    今天要整理记录的是利用OpenCV中ArUco模块的aruco标记实现一个增强现实的小应用 xff0c 当然了本次笔记的内容也是需要建立在之前的 OpenCV4学习笔记 xff08 72 xff09 基础上的 所谓增强现实 Augmente
  • Ubuntu18.04配置orb-slam2+ROS,一次性通过./build_ros.sh

    1 换源 建议采用清华的源 xff0c 如果采用阿里的源后面很多依赖会报错 xff0c 换源之后记得更新 xff0c 建议勾选源代码 sudo apt get update 1 1 报错error 解决 xff1a sudo apt get
  • process has died 报错

    报错提示 UnicodeEncodeError 39 ascii 39 codec can 39 t encode characters in position 345 350 ordinal not in range 128 spawn
  • Mysql问题Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column

    java sql SQLSyntaxErrorException Expression 2 of SELECT list is not in GROUP BY clause and contains nonaggregated column
  • 【SAP-FI】承诺项目(Commitment item)详解

    定义 xff1a 承诺项目表示组织在财务管理区域 xff08 FM区域 xff09 内的功能分组 用途 xff1a 承诺项目将影响流动性的预算交易和商业交易分类为收入 xff0c 支出和现金余额项目 您可以将特定责任区域 xff08 资金中
  • 操作系统--03内存管理

    内存管理 第三章 xff1a 内存管理 xff08 存储器管理 xff09 3 内存保护的两种办法 xff1a 3 1 覆盖与交换3 2 连续分配管理方式3 3 动态分区分配算法1 首次适应算法 xff1a 2 最佳适应算法 xff1a 3