操作系统的内存究竟是怎么一回事?

news2024/11/17 13:43:02
摘要:操作系统的内存究竟是怎么一回事?带你完整复习一遍《操作系统》一书中有关内存的所有知识点

本文分享自华为云社区《操作系统的内存究竟是怎么一回事?带你完整复习一遍《操作系统》一书中有关内存的所有知识点》,作者:breakDawn 。

1 内存管理的概念

内存管理指操作系统对内存的划分和动态分配

地址空间:
逻辑地址空间: 相对地址, 从0开始编址
物理地址空间: 地址转换的最终地址

程序运行时:
编译: 把源代码编译成目标模块
链接: 把目标模块、库函数链接成1个装入模块
链接属于形成进程逻辑地址的过程

装入:
绝对装入: 编译时就确定了装入地址
可重定位装入: 根据内存情况, 把程序装到适当位置
运行时动态装入:运行前才真正把程序装起来(前面2个都是先分配,再装,再运行)

2 内存防溢出机制

即怎么防止内存越界

设置上下限寄存器:
存放内存中该进程的上下限地址
每次访问时,判断是否越界

重定位+界地址:
重定位寄存器——存放物理地址的最小地址
界地址寄存器——存放逻辑地址的最大值

先把访问地址(相对地址) 与界地址比较是否越界
再加到重定位寄存器上,作为物理地址

min + x, 且x <max, 这样保证地址在min到min+max之内

3 内存分配机制

3.1 连续分配内存

连续分配指 为用户程序分配的内存空间一定是连续的

3.1.1 单一连续:

内存分为系统区和用户区2个区
每次用户区只能放1个程序, 这样可确保不会越界

3.1.2 固定分区分配

用户区分成若干个大小的分区, 每个分区只能装一个作业。
程序如果大了会装不下
程序小了则有内存碎片

3.1.3 动态分区分配

程序装入内存时,按照所需大小动态生成1个分区。 有多少碎片空间就给多少

可能会存在碎片, 比如中间的进程结束了, 于是中间就空出来一个内存碎片,而可能因为太小,其他进程帆布进来。

动态分配策略:

  • 首次适应: 从上往下找第一个满足的分区——最简单也最好
  • 最佳适应: 找一个大小差距最小的分区——最烂,碎片最多
  • 最坏适应: 直接找最大的分区转入
  • 邻近适应: 从上次查找位置开始找,而不是从第一个碎片位置开始找。——末尾碎片会很多

3.2 非连续内存分配

非连续指进程内存可以 分成不同地址存放,不一定全部集中在一起。

3.2.1 分页

把内存划分成固定大小的块, 进程以块为单位申请多个不同位置的块作为空间。

  • 页表:
    每个进程PCB中会有一个页面寄存器PRT, 告知页表的起始位置和起始长度
    找到页表后, 页面中会告知你所持有的页号和偏移。
    通过 页号 * 块大小 + 偏移, 可知道这段内存的起始位置。

进程每次想通过虚拟地址去定位物理地址时,都需要先去页表中找到虚拟地址对应的页,然后再得到物理地址。

  • 快表TBL(Translation Lookaside Buffer )):
    为了避免每次都取页表换算地址, 快表会缓存 虚拟地址->物理地址的直接映射,加快速度

  • 多级页表
    地址空间超级大, 1页装不下怎么办?
    用多级
    一级页表指明二级页表的地址
    二级页表再去实际地址
    这样就可以有多页了。

3.2.2 分段

分页的话, 页的长度是固定的, 所以偏移量的最大值是固定的

分段的话不限制偏移量最大值,即可以很长一段。

分段属于二维地址空间, 因为他除了给出逻辑地址,还得给出段长

有利于做动态链接: 程序动态修改

3.2.3 段页结合

作业先分成若干段, 再把段分页, 每个段可以找到一个也变

段号S 页号P 页内偏移

Q: 遍历二维数组的时候, 行遍历优先和列遍历优先的效率差别, 为什么会这样

A: 按行遍历比按列遍历的效率高体现在这些方面:

  1. CPU高速缓存
  2. CPU缓存从内存中抓取一般都是整个数据块,所以它的物理内存是连续的,几乎都是同行不同列的,而如果内循环以列的方式进行遍历的话,将会使整个缓存块无法被利用,而不得不从内存中读取数据,而从内存读取速度是远远小于从缓存中读取数据的。随着数组元素越来越多,按列读取速度也会越来越慢。

4 虚拟内存

4.1 概念

虚拟地址可以让进程获得比实际内存要大的内存

特征:

  • 多次性——作业可分多次装入内存
  • 对换性——可在运行时对内存做兑换处理
  • 虚拟性——逻辑上可充分扩充容量

要求:

必须使用非连续分配方式——分页、分段、段页
硬件需要支持 页表、中断、地址变换机构

理论依据:

时间局部性—— 指令和数据总是会在一段时间内被连续访问
空间局部性——某单元被访问,那么他附件的单元也很大概率会被访问

4.2 请求分页机制

再分页的基础上, 增加了2个功能:

请求调页——当页面不在内存中时,从外村申请调入
页面置换——把暂时不用的内存换出去,给其他需要进来的页腾出空间

页表项:
页号、物理块号
状态位P:是否已经调入内存
访问字段A: 记录访问次数或者访问标记,用于置换策略判断
修改维 M: 记录是否被修改过
外村地址——当页被换出去时,指明这个页在外存的何处

缺页中断机构: 当页面不存在时, 负责产生缺页中断,进行页面置换操作。

缺页只能高端和系统中断不同, 属于指令中的操作,在执行期产生多次

地址变换机构:
1.先检索块表,如果能找到,则直接修改页表项的访问位。
2.块表中没有,则去 再检索内存中的页表,通过状态为P确认是否在内存中
如果不在,则产生缺页中断。

4.3 工作集概念

驻留集:指系统给每个进程分配的内存中实际页面集合
但是可能分配了10个, 却只有5个经常在用

工作集: 某时间段内,这个进程访问和使用的页面集合

通过工作集, 系统可以评估这个驻留集是否需要做删减,以及哪些页应该持续保留。
这样可以减少抖动,即减少内外村之间频繁的交换页

4.4 页面置换算法

  • 最佳置换算法:
    选未来最长时间不会被用到的页
    这个要基于预测,比较难
  • 先进先出FIFO
    可能引发bleady异常:

较早调入的页往往是经常被访问的页,这些页在FIFO算法下被反复调入和调出,并且有Belady现象。所谓Belady现象是指:采用FIFO算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。

  • 最近最久未使用(LRU)
    选之前最长时间没访问的, 引入优先队列(最大堆)
    需要设置访问时间字段
  • 简单时钟clock(最近未使用NRU)
    每个页有个标记。
    刚换入内存或者被访问时,都会置1

如果需要换页时,步骤如下:

  1. 扫描围成换的页链表
  2. 如果标记为1,则改成0,继续往下扫
  3. 如果位0, 则替换,并让指针指向下一页。

改进的clock
把标记为改成 访问位u和修改维m

  • 1类(A =0, M = 0):表示该页面最近既未被访问,又未被修改,是最佳淘汰页。
  • 2类(A =0, M = 1):表示该页面最近未被访问,但已被修改,并不是很好的淘汰页。
  • 3类(A =1, M = 0):表示该页面最近已被访问,但未被修改,该页有可能再被访问。
  • 4类(A =1, M = 1):表示该页最近已被访问且被修改,该页可能再被访问。
  1. 先优先找u=0和m=0的页,有就直接替换
  2. 没有,则找 u = 0 且m=1的页( 没访问的最优先替换), 做替换
  3. 如果中间遇到U=1的, 则都会置0, 如果m=1的也会置0
  4. 如果一圈都没有,则下一圈肯定有01或者00的。

4.5 页面分配量策略

  • 固定分配,局部替换
    每个进程分配固定的物理块, 且只能自己的块之间做替换
  • 可变分配,全局替换
    缺页时,可以从全局队列的页替换
  • 可变分配,局部置换
    自己替换自己,但是不够的时候可以加块

分配来源:
对换区:频繁切换的区
文件区:补怎么会变动和修改的

点击关注,第一时间了解华为云新鲜技术~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【图神经网络】使用DGL框架实现简单图分类任务

使用DGL框架实现简单图分类任务简单图分类任务实现过程打包一个图的小批量定义图分类器图卷积读出和分类准备和训练核心代码参考资料图分类&#xff08;预测图的标签&#xff09;是图结构数据里一类重要的问题。它的应用广泛&#xff0c;可见于生物信息学、化学信息学、社交网络…

aws xray ec2环境搭建和基础用法

参考资料 https://docs.amazonaws.cn/en_us/xray/latest/devguide/xray-daemon.html https://docs.aws.amazon.com/xray-sdk-for-nodejs/latest/reference/ https://github.com/aws/aws-xray-sdk-node https://docs.aws.amazon.com/xray-sdk-for-python/latest/reference/ba…

联想集团:长期前景稳定,业务转型正在提高盈利能力

来源;猛兽财经 作者&#xff1a;猛兽财经 由疫情驱动的个人电脑需求正在减弱 在经历了两年的个人电脑销售强劲增长之后&#xff0c;随着全球对疫情封锁限制的放松&#xff0c;由疫情引发的远程工作和在线学习趋势带来的全球个人电脑需求正在减弱。根据IDC的数据&#xff0c;20…

文件之间的拷贝(拷贝图片实例)java.io.FileNotFoundException: G:\dad (拒绝访问。)通过绝对路径获取各种文件名

1.报错解决 :java.io.FileNotFoundException: G:\dad (拒绝访问。) 参考文献:(364条消息) java.io.FileNotFoundException:(拒接访问&#xff09;_corelone2的博客-CSDN博客_java.io.filenotfoundexception 2.code 代码参考地址:(364条消息) java中文件拷贝的几种方式_babar…

深入理解New操作符

前言 当我们对函数进行实例化时&#xff0c;需要用new操作符来实现。那么&#xff0c;对于它的底层实现原理你是否清楚呢&#xff1f;本文就跟大家分享下它的原理并用一个函数来模拟实现它&#xff0c;欢迎各位感兴趣的开发者阅读本文。 原理分析 我们通过一个具体的例子来看…

MySQL——数据库基础

文章目录什么叫做数据库&#xff1f;主流数据库基本使用服务器、数据库、表之间的关系MySQL逻辑结构MySQL架构MySQL分类存储引擎什么叫做数据库&#xff1f; 软件角度&#xff1a; 为用户或者用户程序提供更加方便的数据管理的软件&#xff0c;通过SQL语句进行&#xff01; 数…

【PostgreSQL-14版本snapshot的几点优化】

最近在分析PostgreSQL-14版本性能提升的时候&#xff0c;关注到了Snapshots的这一部分。发现在PostgreSQL-14版本&#xff0c;连续合入了好几个和Snapshots相关的patch。 并且&#xff0c;Andres Freund也通过这些改进显著减少了已确定的快照可扩展性瓶颈&#xff0c;从而改进了…

【C++】C/C++内存管理

众所周知&#xff0c;C/C没有内存&#xff08;垃圾&#xff09;回收机制&#xff0c;所以写C/C程序常常会面临内存泄漏等问题。这一节我们一起来学习C/C的内存管理机制&#xff0c;深入了解这套机制有利于我们之后写出更好的C/C程序。 在那些看不到太阳的日子里&#xff0c;别忘…

Spring(九)- Spring自定义命名空间整合第三方框架原理解析

文章目录一、Spring通过命名空间整合第三方框架1. Dubbo 命名空间2. Context 命名空间二、Spring自定义命名空间原理解析三、手写自定义命名空间标签与Spring整合一、Spring通过命名空间整合第三方框架 1. Dubbo 命名空间 Spring 整合其他组件时就不像MyBatis这么简单了&#…

电影影院购票管理系统

1、项目介绍 电影影院购票管理系统拥有两种角色&#xff1a;管理员和用户 管理员&#xff1a;用户管理、影片管理、影厅管理、订单管理、影评管理、排片管理等 用户&#xff1a;登录注册、个人中心、查看电影票、电影选座、下单支付、发布影评、查看票房统计等 2、项目技术 …

14、Horizontal Pod Autoscal

一、为何进行缩扩容&#xff1f; 在实际生产中&#xff0c;经常会遇到某个服务需要扩容的场景&#xff0c;可能会遇到由于资源紧张或者工作负载降低而需要减少服务实例数量的场景。可以利用Deployment/RC的Scale机制来完成这些工作。二、缩扩容模式 Kubernetes 对 Pod 扩容与缩…

mysql-Innodb解析

一.计算机不同介质操作速度 相对于CPU和内存操作&#xff0c; 我们可以看到磁盘的操作延时明显要大得多&#xff0c; 一次磁盘搜索的延时需要10ms。 假入我们某一个业务操作进行了大量磁盘读写&#xff0c; 那可以预料到这个服务的性能肯定是非常差的&#xff0c; 那么到底是什…

3.2文法与语言

1、文法生成语言 推导 定义&#xff1a;当αAβ直接推导出αγβ&#xff0c;即αAβ⇒αγβ&#xff0c;仅当A→γ是一个产生式&#xff0c;且α,β∈(VT∪VN)*。 注&#xff1a;按照我的理解是两个字符串的推导。如果α1⇒α2⇒…⇒αn,则我们称这个序列是从α1到αn的一个…

动态规划01 背包问题(算法)

上篇文章说了&#xff0c;查找组成一个偶数最接近的两个素数算法&#xff1a; 查找组成一个偶数最接近的两个素数https://blog.csdn.net/ke1ying/article/details/127872594 本篇文章题目是 动态规划01 背包问题&#xff1a; 背包容量5kg&#xff0c;现在有三个物体&#xf…

BVH动捕文件导入到E3D骨骼树

BVH动捕文件导入到E3D骨骼树 1. BVH动捕文件 BVH动作捕捉文件有两部分组成&#xff0c;第一部分描述了静止状态下角色的基本骨骼结构&#xff0c;角色通常处于Apose或Tpose姿态下&#xff0e;文本用树状结构描述了各个关节点的相对位置(OFFSET xyz)&#xff0c;连接两关节点的…

学好MySQL增删查改,争取不做CURD程序员【下篇(六个小时肝MySQL万字大总结)】

✨✨hello&#xff0c;愿意点进来的小伙伴们&#xff0c;你们好呐&#xff01; &#x1f43b;&#x1f43b;系列专栏&#xff1a;【MySQL初阶】 &#x1f432;&#x1f432;本篇内容&#xff1a;一套打通MySQL基础操作. &#x1f42f;&#x1f42f;作者简介:一名现大二的三非编…

解决小程序-wx.canvasGetImageData()-RGB取色盘苹果手机获取颜色慢问题

简介 最近做了一个微信小程序控制蓝牙设备&#xff0c;通过小程序中的RGB取色盘&#xff0c;获取当前的RGB颜色&#xff0c;通过蓝牙发送给设备&#xff0c;设备接收到RGB以后&#xff0c;做出相应的调整。 图1&#xff1a;RGB取色盘 在安卓手机上运行正常&#xff0c;能够迅速…

企业实战项目rsync+inotify实现实时同步

目录 一、inotify安装和介绍 1. 安装inotify 2. inotify-tools常用命令 3. rsync inotify 实践 3.1 服务端配置 3.2 客户端配置 一、inotify安装和介绍 1. 安装inotify yum install epel-release -y yum install inotify-tools -y 2. inotify-tools常用命令 inotify-to…

C++ 使用哈希表封装模拟实现unordered_map unordered_set

一、unordered_map unordered_set 和 map set的区别 1. map set底层采取的红黑树的结构&#xff0c;unordered_xxx 底层数据结构是哈希表。unordered_map容器通过key访问单个元素要比map快&#xff0c;但它通常在遍历元素子集的范围迭代方面效率较低。 2. Java中对应的容器名…

vivo和oppo通知权限弹窗

在vivo和oppo部分手机上&#xff0c;首次安装app时&#xff0c;会弹出一个系统级的通知权限弹窗&#xff0c;&#xff08;部分一加手机也会出现&#xff0c;是因为一加手机使用了OPPO的colorOS系统&#xff09;如图。 这个通知权限弹窗比较坑&#xff0c;一来可能不符合产品对…