操作系统专栏1-内存管理from 小林coding
操作系统专栏1-内存管理
- 虚拟地址
- 内存管理方案
- 分段
- 分页
- 页表
- 单级页表
- 多级页表
- TLB
- 段页式内存管理
- Linux内存管理
- malloc工作方式
- 操作系统内存回收
- 回收的内存种类
- 预读失败和缓存污染问题
- 预读机制
- 预读机制失效
- 解决方案
- 缓存污染
- 内核对虚拟内存的表示
- 内核对内核空间的表示
- 直接映射区
- vmalloc映射区
- 永久映射区
- 固定映射区
- 临时映射区
虚拟地址
首先第一个问题,虚拟地址为什么要存在呢,原因其实很简单,隔离开多个进程之间的地址空间,让每个进程都认为自己拥有一块完整的物理空间,并且提供大的逻辑内存供进程使用,虚拟地址是现代操作系统进行内存管理的基石
内存管理方案
分段
程序的内存空间由多个段组成,代码段,数据段,堆段和栈段组成,用分段的方式将这些段隔离开来
那么分段的方式有什么缺点呢,主要两点外部内存碎片和交换效率
外部内存碎片的解决方案为内存交换,将音乐程序占用的256MB先换出到磁盘上,然后读回到内存中(实际上就是换了位置,紧邻着存)Linux系统中的SWAP分区就是干这个的
分页
分段的弊端在上节描述,为了减少内存换进换出的装载量,出现了分页,分页就是把整个内存区域切分成固定大小的片(一般为4KB).示意图如下
分页访问在发现虚拟地址在页表中查询不到时,产生一个缺页异常,操作系统分配好内存空间之后,更新页表,返回进程继续运行,页与页之间是紧密排列的,所以不会有外部碎片,但是引入了内部碎片,而且页的大小固定,换入换出的开销也变得可以接受了
页表
页表实际上就是虚拟地址和物理地址的一个映射关系
单级页表
单级页表存在一个页表存储空间占用过大的问题,假设目标机为32位机,虚拟内存共有4GB,那么共有4GB/4KB = 2^20个页,每个页表项4B,那么共需4MB的空间来存储页表,注意,每个进程有自己的页表,那么100个进程需要400MB,1000个进程就将4GB全部占完了
多级页表
解决上述的问题,采用多级页表,多级页表的实质就是只在一级页表页实际用到的情况下才创建2-n级的页表,
TLB
多级页表实际上是一种时间换空间的方案,为了加速虚拟地址到物理地址的转换,TLB被提出,TLB存在于CPU中,存放的是最近访问的页表
段页式内存管理
段页式是操作系统常用的内存管理方式,实现方式为,先把程序的内存空间分段,再对这些段分页
Linux内存管理
Linux主要是页式内存管理,段内存被Linux给绕了过去,每个段都是从0地址开始的4GB地址空间
Linux的内核空间是每个进程共享的
其中
- 代码段:存放二进制可执行代码
- 数据段:已初始化的静态常量和全局变量
- BSS:为初始化的静态变量和全局变量
- 堆段:动态分配的内存,地址空间从低到高增长
- 文件映射段:动态库,共享内存
- 栈段:局部变量和函数调用的上下文,栈大小固定,大小一般为8MB
malloc工作方式
malloc申请内存有两种方式
- 小于128KB,brk()系统调用在堆上分配内存
- 大于128KB,mmap()系统在文件映射区分配内存
这两种方式的区别在于
- brk()方式申请的内存,在free释放内存时,并不会归还给操作系统,而是缓存在内存池中,待下次使用
- mmap()申请的内存,free释放时,会归还给操作系统
操作系统内存回收
当没有空闲的物理内存可用时,内核就会开始进行回收内存的工作,回收方式有两种,直接内存回收和后台内存回收
- 后台内存回收:在物理内存紧张时,唤醒kswapd内核线程,这个线程是异步的,不会阻塞进程的执行
- 直接内存回收,当后台异步回收跟不上进程内存的申请速度,就会开始直接回收,这个回收过程是同步的,会阻塞进程的执行
直接回收后,若空闲的物理内存仍然无法满足物理内存的申请,那么内核就会使用OOM机制(直接杀掉内存占用高的进程)
回收的内存种类
能被回收的内存有两类,分别是文件页和匿名页
- 文件页:内核缓存的磁盘数据和内核缓存的文件数据都可以被称为文件页,分为干净页和脏页,干净页指没有被修改过的,直接释放即可,脏页需要先写到磁盘后才能释放
- 匿名页:这部分内存没有实际上的载体(没有对应的磁盘文件),堆和栈都属于这种页,这种页的回收方式是通过Linux的Swap机制先写到磁盘中
实际上由于文件页回收有可能是干净页,这个时候不需要磁盘IO,所以文件页的回收往往性能高
回收内存的算法为LRU算法,在linux的回收算法中,维护两个链表,active和inactive列表,active列表存放最近被访问过的活跃内存页,inactive列表存放非活跃的页,回收时,优先访问不活跃的内存
预读失败和缓存污染问题
预读机制
当操作系统试图磁盘读时,会把临近的数据也读到内存中,以备之后访问
预读机制失效
提前被加载的页,如果以后不被访问,还可能挤掉热点数据页,大大降低了缓存命中率
解决方案
- Linux解决方案是分为了两个LRU链表,活跃LRU和非活跃LRU,这两个LRU互相独立,互不干扰
- MySQL的InnoDB在LRU列表上划分两个区域young区域和old区域
缓存污染
上面的方案如果数据被加载并被读了一次,还是会挤走热点数据,解决方案是提升加入活跃LRU的门槛
内核对虚拟内存的表示
主要是通过mm_struct这个结构体表示的
内核对内核空间的表示
通过TASK_SIZE将进程的虚拟内存空间和内核内存空间分割开来之后,在32位下0xC000000 - 0xFFFF FFFF这段空间的分配如下
直接映射区
其中ZONE_NORMAL和ZONE_DMA共同构成了直接映射区,直接映射区占896M会直接映射到物理内存的前896M内存空间中,当进程被创建完毕,在内核运行的过程中,内核会为每一个进程设置一个内核栈,每个进程的掉用链存放在自己的内核栈中,每个内核栈大概占据2的页的内存空间
- ZONE_DMA为DMA映射区,为16MB
- ZONE_NORMAL存放上问所述的内核栈等信息
vmalloc映射区
vmalloc区分配的内存在虚拟内存上连续,而在物理内存上不连续
永久映射区
虚拟地址于物理地址建立长期的映射关系
固定映射区
虚拟地址固定,但是物理地址不固定(指针常量)
临时映射区
在中断处理等时使用的救急内存
相关文章:

操作系统专栏1-内存管理from 小林coding
操作系统专栏1-内存管理 虚拟地址内存管理方案分段分页页表单级页表多级页表TLB 段页式内存管理Linux内存管理 malloc工作方式操作系统内存回收回收的内存种类 预读失败和缓存污染问题预读机制预读机制失效解决方案缓存污染 内核对虚拟内存的表示内核对内核空间的表示直接映射区…...
SpringCloud远程服务调用
下面介绍在SpringCloud中如何使用openfeign实现远程服务调用 1.在字典服务中有这么2个接口 Api(tags "数据字典接口") RestController RequestMapping("/admin/cmn/dict/") CrossOrigin public class DictController {Autowiredprivate DictService dic…...

Arcgis通过模型构建器计算几何坐标
模型 模型中,先添加字段,再计算字段 计算字段 模型的计算字段中,表达式是类似这样写的,其中Xmin表示X坐标,Ymin表示Y坐标 !Shape.extent.Xmin!...
java设计模式-工厂模式(下)
接java设计模式-工厂模式(上) 抽象工厂模式 针对耳机的生产需求,我们可以知道,刚才的工厂已经不满足了,因为只是生产一类产品-手机,但是现在我们需要的工厂类是要生产一个产品族(手机和耳机&a…...

深蓝学院C++基础与深度解析笔记 第13章 模板
1. 函数模板 ● 使用 template 关键字引入模板: template<typename T> //声明:T模板形参void fun(T); // T 函数形参template<typename T> //定义void fun(T) {...}– 函数模板不是函数 –…...

装饰器模式——扩展系统功能
1、简介 1.1、概述 对新房进行装修并没有改变房屋用于居住的本质,但它可以让房子变得更漂亮、更温馨、更实用、更能满足居家的需求。在软件设计中,也有一种类似新房装修的技术可以对已有对象(新房)的功能进行扩展(装…...

无涯教程-jQuery - jQuery.get( url, data, callback, type )方法函数
jQuery.get(url,[data],[callback],[type])方法使用GET HTTP请求从服务器加载数据。 该方法返回XMLHttpRequest对象。 jQuery.get( url, [data], [callback], [type] ) - 语法 $.get( url, [data], [callback], [type] ) 这是此方法使用的…...

【Vue3】递归组件
1. 递归组件mock数据 App.vue <template><div><Tree :data"data"></Tree></div> </template><script setup lang"ts"> import { reactive } from vue; import Tree from ./components/Tree.vue; interface Tr…...

【Python】数据分析+数据挖掘——探索Pandas中的索引与数据组织
前言 在数据科学和数据分析领域,Pandas是一个备受喜爱的Python库。它提供了丰富的数据结构和灵活的工具,帮助我们高效地处理和分析数据。其中,索引在Pandas中扮演着关键角色,它是一种强大的数据组织和访问机制,使我们…...

matlab进阶:求解在约束条件下的多元目标函数最值(fmincon函数详解)
🌅*🔹** φ(゜▽゜*)♪ **🔹*🌅 欢迎来到馒头侠的博客,该类目主要讲数学建模的知识,大家一起学习,联系最后的横幅! 喜欢的朋友可以关注下,私信下次更新不迷路࿰…...

Kotlin知识点
Kotlin 是 Google 推荐的用于创建新 Android 应用的语言。使用 Kotlin,可以花更短的时间编写出更好的 Android 应用。 基础 Kotlin 程序必须具有主函数,这是 Kotlin 编译器在代码中开始编译的特定位置。主函数是程序的入口点,或者说是起点。…...

亚马逊云科技联合霞光社发布《2013~2023中国企业全球化发展报告》
中国企业正处于全球聚光灯下。当企业全球化成为时代发展下的必然趋势,出海也从“可选项”变为“必选项”。中国急速扩大的经济规模,不断升级的研发和制造能力,都在推动中国企业不断拓宽在全球各行业的疆域。 过去十年,是中国企业…...

【解析excel】利用easyexcel解析excel
【解析excel】利用easyexcel解析excel POM监听类工具类测试类部分测试结果备注其他 EasyExcel Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&…...
JQuery操作单选按钮Radio和复选框checkbox
获取选中值: $(input:radio:checked).val();$("input[typeradio]:checked").val();$("input[namerd]:checked").val();$("input[idrand_question]:checked").val();设置第一个Radio为选中值: $(input:radio:…...

7.28 作业 QT
手动完成服务器的实现,并具体程序要注释清楚: widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QMessageBox> //对话框类 #include …...
HTML <pre> 标签
定义和用法 pre 元素可定义预格式化的文本。被包围在 pre 元素中的文本通常会保留空格和换行符。而文本也会呈现为等宽字体。 <pre> 标签的一个常见应用就是用来表示计算机的源代码。 可以导致段落断开的标签(例如标题、"><p> 和 标签"><a…...

查询结果元数据-MetaData对象、数据库工具类的封装、通过反射实现数据查询的封装
六、查询结果元数据-MetaData对象 七、数据库工具类的封装 1、PropertieUtil类 2、DbUtil类 3、DBHepler类 查询: 4、TestDb测试类: 更新: 1)插入: 2)修改: 3)删除: 查…...

【Minio中间件】上传图片并Vue回显
流程: 目录 1.文件服务器Minio的安装 1.1 下载Minio安装后,新建1个data文件夹。并在该安装目录cmd 敲命令。注意不要进错目录。依次输入 1.2 登录Minio网页端 1.3 先建1个桶(buckets),点击create a bucket 2. Spr…...

Jmeter配置不同业务请求比例,应对综合场景压测
需求: 每次向服务器发出请求时,先生成一个随机数,我们对随机数的取值划分若干个范围(对应若干个业务请求),然后对随机数进行判断,当随机数落在某个范围内,就可以执行对应的请求。比…...

数学分析:流形的线性代数回顾
因为是线性的,所以可以把所有的系数都提取出去。这也是多重线性代数的性质。可以看成基本的各项自变量的乘法。 这里可以看到两个不同基向量下,他们的坐标转化关系。 引出了张量积,也就是前面提到的内容。 对偶空间的例子总是比较美好。 因为…...
多模型协同:基于 SAM 分割 + YOLO 检测 + ResNet 分类的工业开关状态实时监控方案
一、技术优势与适配性分析 1. 任务分工的合理性 YOLO(目标检测) 核心价值:快速定位工业开关在图像中的位置(边界框),为后续分割和分类提供ROI(感兴趣区域)。工业场景适配性…...

如何使用Webhook触发器,在 ONLYOFFICE 协作空间构建智能工作流
在数字化办公中,ONLYOFFICE 协作空间作为一款功能强大的文档协作平台,提供了丰富的自动化功能。对于开发者而言,Webhook 触发器是实现业务流程自动化与系统集成的关键工具。本文将深入探讨如何在 ONLYOFFICE 协作空间中高效利用 Webhook&…...

OpenVINO环境配置--OpenVINO安装
TOC环境配置–OpenVINO安装 本节内容 OpenVINO 支持的安装方式有很多种,每一种操作系统以及语言都有对应的安装方法,在官网上有很详细的教程: 我们可以根据自己的需要,来点选环境配置和安装方法,然后网页会给出正…...

BugKu Web渗透之网站被hei(仅仅是ctf题目名称)
启动场景,打开网页,显示如下: 目前没有看出任何异常。 步骤一: 右键查看源代码。源代码较多,也没发现异常。 步骤二: 用dirsearch扫描网站目录。 如图: 看起来shell.php很可疑。 步骤三&…...
区块链架构深度解析:从 Genesis Block 到 Layer 2
# 区块链架构深度解析:从 Genesis Block 到 Layer 2 目录 一、Genesis Block:区块链的起点 二、Layer 0:区块链的底层网络架构 三、Layer 1:核心协议层 🚀 四、Layer 2:扩展性解决方案 五、未来展望&a…...
解决获取视频第一帧黑屏问题
文章目录 解决获取视频第一帧黑屏问题核心代码 解决获取视频第一帧黑屏问题 废话不多说,直接上代码: <script setup> const status ref(请点击“添加视频”按钮添加视频) const videoElement ref(document.createElement(video)) const curren…...
在 Spring Boot 中使用 WebFilter:实现请求拦截、日志记录、跨域处理等通用逻辑!
💡 前言 在开发 Web 应用时,我们经常需要对所有请求进行统一处理,例如: 记录请求日志实现跨域(CORS)接口权限控制请求参数预处理防止 XSS 攻击 这些功能如果都写在每个 Controller 或 Service 里&#x…...

超声波清洗设备的清洗效果如何?
超声波清洗设备是一种常用于清洗各种物体的技术,它通过超声波振荡产生的微小气泡在液体中破裂的过程来产生高能量的冲击波,这些冲击波可以有效地去除表面和细微裂缝中的污垢、油脂、污染物和杂质。超声波清洗设备在多个领域得到广泛应用,包括…...

创客匠人:以 AI 利器赋能创始人 IP 打造,加速知识变现新路径
在知识付费与个人 IP 崛起的时代,创客匠人作为行业领先的技术服务商,正通过 AI 工具重构创始人 IP 打造与知识变现的生态。其推出的三大 AI 利器 ——AI 销售信、免训数字人、AI 智能客服,精准解决 IP 运营中的核心痛点。 以 AI 销售信为例&…...
DDD架构实战 领域层 事件驱动
目录 核心实现: 这种实现方式的优势: 在实际项目中,你可能需要: 事件驱动往往是在一个微服务内部实现的 领域时间是DDD架构中比较常见的概念 在领域层内部的一个模型更改了状态或者发生了一些行为 向外发送一些通知 这些通…...