一、linux内存泛解

news2025/1/13 7:51:18

地址空间

逻辑地址经过段机制转换成线性地址,线性地址经过页机制转换成物理地址
linux采用虚拟内存管理,进程都有各自的地址空间这个空间整体是块大小为4G的线性虚拟空间用户看到的都是虚拟地址,而非实际的物理地址,这既能保护操作系统(用户不能直接访问物理内存),又能使用比实际物理内存更大的虚拟内存空间
4G虚拟内存分为用户空间和内核空间。用户空间从0到3G (0xC0000000),内核空间占据3G到4G,用户进程一般不能访问内核空间,但是当进行系统调用(在内核态执行)时可以访问到内核空间。用户空间会随进程切换而变化,内核空间由内核映射固定不变,都有对应的页表。进程的用户空间相互独立,互不干扰
64位系统的内核空间和用户空间都是128T,分别占据整个内存空间的最高和最低处,剩余的中间部分是未定义的。

在这里插入图片描述
如图是一个x86虚拟地址计算物理地址的过程:首先是分段机制计算出线性地址,再利用分页机制计算出物理地址

  • TI为0表示该段在全局描述符(GDT),TI为1表示在局部描述符(LDT),通过查找段描述符可以找到段基址
  • 把段描述符中取得的段基址加上虚拟地址(偏移量) 上形成一个线性地址
  • 线性地址的高10位索引目录,线性地址的中间10位索引页表,得到物理页面基地址
  • 物理页面基地址加上线性地址的底12位,得到最终的物理地址

在这里插入图片描述
多级页表解决空间上的问题,但是虚拟地址到物理地址的转换增加了寄到转换的工序,转换速率降低,时间变大
MMU查询页表过程,根据程序局部性原理,增加程序最小访问的小片cache(TLB),增加命中率,提高访问速度,当页表内容变化时需要清除防映射出错
在这里插入图片描述

NODE、ZONE、PAGE基本概念

node——非一致性内存访问 NUMA(Non-Uniform Memory Access),内存划分为各个node,访问一个node花费的时间取决于CPU离这个node的距离,CPU内部有一个本地node,访问速度比其他node快。而一致性内存访问 UMA(Uniform Memory Access)或SMP(Symmetric Multi-Process)对称多处理器,访问内存时间都一样,相当于只有一个node。

zone——整个物理内存划分为几个区域,每个区域含义不同。

page——物理页,用struct page表示,比如4k大小的页,这个页内的区域为page frame,编号为page frame num(pfn)。系统启动时,内核将整个struct page映射到虚拟地址空间vmemmap区域,故vmemmap为页基地址,vmemmap+pfn即为struct page对应地址。内核支持的内存模型包含
CONFIG_FLATMEM(平坦内存模型)、CONFIG_DISCONTIGMEM(不连续内存模型)和CONFIG_SPARSEMEM_VMEMMAP(稀疏的内存模型)

zoned page frame allocator——分区页框分配器,用来管理物理内存,内核或进程需要申请页框分配器来获取内存页框,不需要时必须释放内存页框,如果无法分配足够页框,需要按规则从其他管理区获取,按规定要求依次获取:[ZONE_HIGHMEM ->] ZONE_NORMAL -> ZONE_DMA。见组织方式
在这里插入图片描述
内存碎片化
内部碎片化:分配给用户空间未使用的部分内存
外部碎片化:系统无法使用的非连续小内存块
解决外部碎片化,使用伙伴系统,解决内部碎片化,使用slab算法

为了避免内存碎片化,有如下迁移类型在linux系统中

MIGRATE_TYPEShort descrition
MIGRATE_UNMOVABLEPage can’t move,used be kernel/driver
MIGRATE_RECLAIMABLETemp used memory,can be discard
MIGRATE_MOVABLEMemory with MMU mapping,can be move to any where
MIGRATE_RESERVEReserved memory,not used
MIGRATE_CMAFor CMA(Contiguous Memory Allocator) use
MIGRATE_ISOLATETemp isolated area, can’t allocated memory from this type

伙伴系统

order负责管理这些零散的page到对应的order 20~210中
0代表都是零散的1page,page大小是4k,也就是说order0链表中存放的都是N个4K连续的内存块地址
1代表 2^1个连续地址的page,可以理解为order1链表中存放的都是2个连续的page 放在一个,有N个 2个连续的page,可以理解为有N个8k的连续内存块
10就是代表2^10个连续地址的page,可以理解为order10链表中存放的都是1024个连续的page,可以理解为有N个 4x1024k大小的连续内存块
page有不同的类型,所以每一个order又有多个链表,每一种order类型的链表连续块大小是一样的,但是page的类型不一样
zone的作用:负责把新空出来的page合并到最大的内存,比如 新出了一个4k的page,先在order0中找,没有没有连续的,如果有连续的,就合并,放到order1中,以此类推,一直合并到最高的内存中
在这里插入图片描述
Buddy–伙伴系统算法,把所有空闲页框分组为11个块链表(order),每个链表分别包含大小为1、2、4、8、16、…、1024个连续页框的页框块,最大可以申请1024个连续页框,对应4MB的连续内存,每个页框的第一个页框的物理地址是该块大小的整数倍

假设要申请一个256个页框的块,先从256个页框的链表中查找空闲块,如果没有,就去512个页框的链表中找,找到了则将页框块分为2个256个页框的块,一个分配给应用,另外一个移到256个页框的链表中。如果512个页框的链表中仍没有空闲块,继续向1024个页框的链表查找,如果仍然没有,则返回错误。页框块在释放时,会主动将两个连续的页框块合并为一个较大的页框块。Buddy算法一直在对页框做拆开合并拆开合并的动作,可以查看/proc/buddyinfo某页框剩余空闲块个数
在这里插入图片描述

用户空间使用malloc/new/mmap去分配内存,但是page不会马上分配给他,直到访问内存的时候去分配

除了CMA,其他所有内存分配API都是调用__alloc_pages_nodemask从伙伴系统分配内存

Slab分配器
伙伴系统以页分配,slab以字节分配,减少对伙伴系统分配算法的调用次数(频繁分配和回收必然会导致内存碎片化,难以找到大块连续的可用内存),可以很好地利用硬件缓存提高访问速度。slab中的对象分配和销毁使用kmem_cache_alloc与kmem_cache_free
Vmalloc
最小分配一个page,并且分配的页面不保证是连续的,因为alloc_page多次分配单个页面
CMA
reserved的一块内存,用于分配连续的大块内存,预留给驱动使用,当设备驱动不用时,内存管理系统将该区域用于分配和管理可移动页面类型;当设备驱动使用时,此时已经分配的页面需要进行迁移,又用于连续内存内配;其用法与DMA子系统结合在一起充当DMA的后端。
在这里插入图片描述
在这里插入图片描述

用户空间内存分区

在这里插入图片描述

分配与回收

(1) 内存分配与申请
当程序启动时,终端进程调用exec函数将可执行文件载入内存,此时代码段、stack段都是通过mmap函数映射到内存空间,堆则要根据是否有在堆上申请内存来决定是否映射,exec执行之后,此时并未真正开始执行进程,而是将CPU控制权交给了动态链接库装载器,由它来将该进程需要的动态链接库装载进内存;之后才开始进程的执行。

如果用户态申请大内存时,是直接调用mmap分配内存,此时返回给用户态的内存还是虚拟内存,直到第一次访问返回的内存时,才真正进行内存的分配;当进程在用户态通过调用free释放内存时,如果这块内存是通过mmap分配,则调用munmap直接返回给系统;否则内存是先返回给内存分配器,然后由内存分配器统一返还给系统。

(2) 系统内存回收

  • 手动内存回收:
#1 free pagecache
#2 free dentries and inodes
#3 free pagecache,dentries and inodes
echo 1/2/3 > /proc/sys/vm/drop_caches

如果pagecache中有脏数据时,操作drop_caches是不能释放的,必须通过sync命令将脏数据刷新到磁盘,才能通过操作drop_caches释放pagecache.
drop_caches能释放的就是当磁盘读取文件时缓存页以及某个进程将某个文件映射到内存之后,进程退出,这是映射文件的缓存页如果没有被引用,也是可以被释放的。

  • 自动内存回收
    内核有一个kswapd (内核线程,用于页面回收) 会周期性的检查内存使用情况,如果发现空闲内存低于page_low,则kswapd会对lru_list前4个lru队列进行扫描,在活跃链表中查找不活跃的页,并添加不活跃链表;然后再遍历不活跃链表,逐个进行后手释放出32个页,直到free page数量达到page_high水平;针对不同的页,回收方式也不一样。

当内存水平低于某个极限阈值时,会直接发出内存回收,原理跟kswapd一样,但是这次回收力度更大,需要回收更多的内存

如果申请的内存大于系统剩余的内存时,就会产生oom (out of memory)杀死进程,释放内存。

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

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

相关文章

ASP.NET学生成绩管理系统

摘要 本系统依据开发要求主要应用于教育系统,完成对日常的教育工作中学生成绩档案的数字化管理。开发本系统可使学院教职员工减轻工作压力,比较系统地对教务、教学上的各项服务和信息进行管理,同时,可以减少劳动力的使用&#xf…

Kitti数据集初识

kitti数据集 00 无人驾驶数据集汇总 无人驾驶数据集汇总(一)附下载地址 0.kitti数据简介 kitti数据集是一个为立体,光流,视觉里程计,3D目标检测和3D跟踪等任务而开发采集的基准数据集。 它利用了Annieway自动驾驶平台,配备了1个OXTS RT 3003,1台Velodyne HDL-64E激光…

2024-AIDD-人工智能药物设计-AlphaFold3

AlphaFold3|万字长文解读 AlphaFold3预测所有分子相互作用准确结构 AlphaFold3 自2021年AlphaFold2问世以来,科研工作者们便开始利用这一蛋白结构预测模型来详细描绘众多蛋白质的结构、探索新药。近日,Google DeepMind公司推出了其最新产品…

Apache SeaTunnel 正式发布2.3.5版本,功能增强及多个Bug修复

经过两个月的筹备,我们在2.3.4版本基础上进行了新一轮的迭代,本次更新不仅修复了多个关键问题,还引入了若干重要功能增强和性能优化。 在此,我们先提前感谢社区成员的贡献和支持,如果你想升级最新的版本,快…

NSSCTF | [SWPUCTF 2021 新生赛]jicao

打开题目&#xff0c;发现高亮显示了一个 php 脚本 这是脚本的内容 <?php highlight_file(index.php); include("flag.php"); $id$_POST[id]; $jsonjson_decode($_GET[json],true); if ($id"wllmNB"&&$json[x]"wllm") {echo $flag;…

linux上安装Jmeter环境

以前都是在Windows本机上使用界面版Jmeter&#xff0c;今天试一下安装到linux上在linux中使用&#xff0c;Jmeter的使用需要先安装jdk环境然后再配置jmeter。 1.配置环境 linux环境&#xff1a;Centos 8.2 64位 JDK版本&#xff1a;jdk-8u221-linux-x64.tar.gz &#xff08;…

每天五分钟深度学习:数学中的极值

本文重点 在数学领域中,极值是一个极其重要的概念,它不仅在纯数学理论研究中占据核心地位,而且在工程、物理、经济等实际应用领域也发挥着不可替代的作用。极值问题涉及函数的最大值和最小值,是微积分学中的一个基本问题。本文旨在详细介绍数学中的极值概念、性质、求解方…

【数据结构与算法】常见的排序算法

文章目录 排序的概念冒泡排序&#xff08;Bubble Sort&#xff09;插入排序&#xff08;Insert Sort&#xff09;选择排序&#xff08;Select Sort&#xff09;希尔排序&#xff08;Shell Sort&#xff09;写法一写法二 快速排序&#xff08;Quick Sort&#xff09;hoare版本&a…

### 【数据结构】线性表--顺序表(二)

文章目录 1、什么是线性表2、线性表的基本操作3、顺序表3.1、顺序表的定义3.2、顺序表的实现方式&#xff1a;静态分配3.3、顺序表的实现方式&#xff1a;动态分配3.4、顺序表的特点3.5、顺序表的初始化与插入操作3.6、顺序表的删除与查询 1、什么是线性表 ​ 线性表是具有相同…

如何自定义Markdown中插入图片的位置

工作中常常需要在VsCode下写Markdown笔记&#xff0c;在写笔记的过程中不免需要插入图片。  Markdown中插入笔记的操作往往是比较繁琐的&#xff0c;比如&#xff1a;在文档中引用本地某个文件夹下的图片&#xff0c;首先需要你先保存图片到本地路径&#xff0c;然后需要你在文…

OpenNJet,够轻更强云原生应用引擎

前言&#xff1a; 在正式介绍OpenNJet之前&#xff0c;我们先来看看它的技术架构&#xff0c;如下图所示&#xff0c;OpenNJet正是NGINX的Pro版&#xff0c;在100%兼容NGINX基础上&#xff0c;新增了动态配置加载、主动式健康检测、集群高可用、声明式API等多种强大功能。 NGIN…

如何在您的WordPress网站上安装和设置W3 Total Cache

本周有一个客户&#xff0c;购买Hostease的虚拟主机&#xff0c;询问我们的在线客服&#xff0c;如何在您的WordPress网站上安装和设置W3 Total Cache&#xff1f;我们为用户提供相关教程&#xff0c;用户很快解决了遇到的问题。在此&#xff0c;我们分享这个操作教程&#xff…

React19学习-初体验

升级react19版本 安装 npm install reactbeta react-dombeta如果使用ts则需要在package.json中添加。等正式版发布直接可以使用types/react了 "overrides": {"types/react": "npm:types-reactbeta","types/react-dom": "npm:ty…

翻工第二次 Ant Design Pro 下载,发现问题,电脑网络配置有误,魔法了

一、相关网址链接 鱼皮的用户中心项目 &#xff08;前端Ant Design Pro构建&#xff09; 语雀 ## 没有选择umi版本这一步 Issue #11144 ant-design/ant-design-pro GitHub 关于umi ui图标未显示问题_umi ui不出现-CSDN博客 二、存在问题 导致下载速度慢 本人镜像代码写…

vue + element-plus 开发中遇到的问题

1.问题之路由守卫 初写路由守卫&#xff0c;对于next()的理解不是很透彻&#xff0c;就想着都放行&#xff0c;不然看不到效果&#xff0c;结果控制台出现了警告&#xff0c;想着报黄的问题就不是问题&#xff0c;但仔细一看发现他说&#xff0c;如果再生产阶段就会失败&#x…

数据可视化训练第二天(对比Python与numpy中的ndarray的效率并且可视化表示)

绪论 千里之行始于足下&#xff1b;继续坚持 1.对比Python和numpy的性能 使用魔法指令%timeit进行对比 需求&#xff1a; 实现两个数组的加法数组 A 是 0 到 N-1 数字的平方数组 B 是 0 到 N-1 数字的立方 import numpy as np def numpy_sum(text_num):"""…

【软件测试】3.开发模型

目录 1.常见的开发模型 1.1瀑布模型 1.2螺旋模型 1.3增量模型和迭代模型 1.4敏捷模型 1.4.1特点&#xff1a; 1.5Scrum模型&#xff08;三个角色和五个重要会议&#xff09; 1.5.1三个角色&#xff1a; 1.5.2Scrum工作流程&#xff08;五个会议&#xff09; 1.6测试模…

PCIE学习(2)PCIE配置空间详解

文章目录 前言一、配置空间header二、Base Address register&#xff08;BAR&#xff09;2.1、BAR是干什么的2.2、具体实现过程BAR示例1——32bit内存地址空间请求BAR示例2——64bit内存地址空间请求 前言 图片来自&#xff1a;https://zhuanlan.zhihu.com/p/463518877 一、…

传感器—超声波雷达

声波技术 在讲述超声波雷达之前&#xff0c;先了解一下声波的概念以及超声波和声波之间的关系 什么是声波&#xff1f; 声波是物体机械振动状态&#xff08;或能量&#xff09;的传播形式。所谓振动是指物质的质点在其平衡位置附近进行的往返运动形式&#xff0c;这种振动状…

设计模式1——初步认识篇

设计模式1——初步认识篇 一、先让我们浅聊一下面向对象和设计模式。 说起设计模式&#xff0c;我第一次听到它&#xff0c;是在学习面向对象的时候。那么什么是面向对象&#xff0c;什么是设计模式&#xff0c;而且设计模式和面向对象又有什么关系呢&#xff1f; 1、什么是面…