物理内存的分配

Linux内存管理——物理内存分配与回收 在Linux中,CPU访问的地址不是物理内存中的实地址,而是虚拟地址空间中的虚地址。因此,对于内存页面的管理,通常是先在虚存空间中分配一个虚存区间,然后才根据需要为此区间分配相应的物理页面并建立映射,先分配虚存区间,再分配物理页面。 1、页描述符 内核用struct page结构表示系统中的每个物理页,也叫页描述符,在linux/mm_types.h中。 struct page { ... 阅读详情
物理内存的分配在内核分配内存时,必须记录页帧的已分配或空闲状态,以免两个进程使用同样的内存区域。由于内存分配和释放非常频繁,内核还必须保证相关操作尽快完成。内核可以只分配完整的页帧。将内存划分为更小的部分的工作,则委托给用户空间中的标准库。标准库将来源于内核的页帧拆分为小的区域,并为进程分配内存。
1. 伙伴系统
内核中很多时候要求分配连续页。为快速检测内存中的连续区域,内核采用了一种古老而历经检验的技术:伙伴系统。
系统中的空闲内存块总是两两分组,每组中的两个内存块称作伙伴。伙伴的分配可以是彼此独立的。但如果两个伙伴都是空闲的,内核会将其合并为一个更大的内存块,作为下一层次上某个内存块的伙伴。
内核对所有大小相同的伙伴(1、2、4、8、16或其他数目的页),都放置到同一个列表中管理。各有8页的一对伙伴也在相应的列表中。
如果系统现在需要8个页帧,则将16个页帧组成的块拆分为两个伙伴。其中一块用于满足应用程序的请求,而剩余的8个页帧则放置到对应8页大小内存块的列表中。
如果下一个请求只需要2个连续页帧,则由8页组成的块会分裂成2个伙伴,每个包含4个页帧。其中一块放置回伙伴列表中,而另一个再次分裂成2个伙伴,每个包含2页。其中一个回到伙伴系统,另一个则传递给应用程序。
在应用程序释放内存时,内核可以直接检查地址,来判断是否能够创建一组伙伴,并合并为一个更大的内存块放回到伙伴列表中,这刚好是内存块分裂的逆过程。这提高了较大内存块可用的可能性。
在系统长期运行时,服务器运行几个星期乃至几个月是很正常的,许多桌面系统也趋向于长期开机运行,那么会发生称为碎片的内存管理问题。频繁的分配和释放页帧可能导致一种情况:系统中有若干页帧是空闲的,但却散布在物理地址空间的各处。换句话说,系统中缺乏连续页帧组成的较大的内存块,而从性能上考虑,却又很需要使用较大的连续内存块。通过伙伴系统可以在某种程度上减少这种效应,但无法完全消除。如果在大块的连续内存中间刚好有一个页帧分配出去,很显然这两块空闲的内存是无法合并的。在内核版本2.6.24开发期间,增加了一些有效措施来防止内存碎片,我会在第3章更详细地讨论相关的底层实现机制。
2. slab缓存
内核本身经常需要比完整页帧小得多的内存块。由于内核无法使用标准库的函数,因而必须在伙伴系统基础上自行定义额外的内存管理层,将伙伴系统提供的页划分为更小的部分。该方法不仅可以分配内存,还为频繁使用的小对象实现了一个一般性的缓存--slab缓存。它可以用两种方法分配内存。
(1) 对频繁使用的对象,内核定义了只包含了所需类型对象实例的缓存。每次需要某种对象时,可以从对应的缓存快速分配(使用后释放到缓存)。slab缓存自动维护与伙伴系统的交互,在缓存用尽时会请求新的页帧。
(2) 对通常情况下小内存块的分配,内核针对不同大小的对象定义了一组slab缓存,可以像用户空间编程一样,用相同的函数访问这些缓存。不同之处是这些函数都增加了前缀k,表明是与内核相关联的:kmalloc和kfree。
虽然slab分配器在各种工作负荷下的性能都很好,但在真正规模庞大的超级计算机上使用时,出现了一些可伸缩性问题。另一方面,对真正微小的嵌入式系统来说,slab分配器的开销可能又太大了。内核提供了slab分配器的两种备选方案,可用于在相应的场景下替换slab分配器并提供更好的性能。对内核的其他部分而言,这3种方案的接口相同,因而不必关注内核中实际编译进来的底层分配器是哪一个。由于slab分配仍然是内核的标准方法,因此我不会详细讨论备选方案。图1-9综述了伙伴系统、slab分配器以及内核其他方面之间的关联。
3. 页面交换和页面回收
页面交换通过利用磁盘空间作为扩展内存,从而增大了可用的内存。在内核需要更多内存时,不经常使用的页可以写入硬盘。如果再需要访问相关数据,内核会将相应的页切换回内存。通过缺页异常机制,这种切换操作对应用程序是透明的。换出的页可以通过特别的页表项标识。在进程试图访问此类页帧时,CPU则启动一个可以被内核截取的缺页异常。此时内核可以将硬盘上的数据切换到内存中。接下来用户进程可以恢复运行。由于进程无法感知到缺页异常,所以页的换入和换出对进程是完全不可见的。
页面回收用于将内存映射被修改的内容与底层的块设备同步,为此有时也简称为数据回写。数据刷出后,内核即可将页帧用于其他用途(类似于页面交换)。内核的数据结构包含了与此相关的所有信息,当再次需要该数据时,可根据相关信息从硬盘找到相应的数据并加载。
潜在图神经网络学习笔记(Latent Graph Neural Networks for Human Skeleton-based Action Recognition) 在本文中,我们从一个新的角度来解决这个问题,通过将非结构化的骨架数据映射到潜在空间,如图2所示,这里称为潜在特征空间或嵌入空间,其中一组项嵌入在一个流形中[ 1 ],并且在潜在空间中彼此更相似的项被放置在彼此更接近的位置。潜在空间中的位置可以被认为是由一组潜在变量定义的,这些潜在变量来源于对象的相似性。将骨架数据嵌入到流形中,消除了远近邻居之间的冗余依赖关系,以解决加权问题。得到具有多尺度聚合特征的稀疏图矩阵结构,以更好地理解骨骼关节的直接加权信息。 阅读详情

相关推荐

避坑指南:ANSYS流固耦合计算中System Coupling数据传递设置与常见报错解决

本文深入解析ANSYS Workbench中System Coupling模块在双向流固耦合(FSI)计算中的应用,详细讲解数据传递机制、典型报错解决方案及高阶调试技巧。通过实际案例展示如何优化耦合步长、处理大变形问题,并提升并行计算效率,帮助工程师有效规避常见技术陷阱。

weixin_29213525的博客 730

操作系统:详解物理内存与虚拟内存,用户空间与内核态空间

针对这个操作:我们的用户在写读数据时,会去向内核态申请,想要读取内核的数据,而内核数据要去等待驱动程序从硬件上读取数据,当从磁盘上加载到数据之后,内核会将数据写入到内核的缓冲区中,然后再将数据拷贝到用户态的buffer中,然后再返回给应用程序,整体而言,速度慢,就是这个原因,为了加速,我们希望read也好,还是wait for data也最好都不要等待,或者时间尽量的短。反之,当一个进程需要访问物理内存中没有被装入的页时,操作系统就会将这些页从磁盘上读取到物理内存中,供该进程进行访问和使用。

qurious7的博客 4389

手把手教你用SIMCOM A7670C_FASL模组实现双路MQTT连接阿里云(附完整源码)

本文详细介绍了如何使用SIMCOM A7670C_FASL 4G模组实现双路MQTT连接阿里云,包括硬件配置、开发环境搭建、双路MQTT架构设计及实现细节。通过完整的源码示例和实战指南,帮助开发者快速掌握物联网设备开发中的多路MQTT连接技术,提升工业级应用的开发效率。

weixin_33696822的博客 227

物理内存和虚拟内存

当内核代码不再需要通过 get_free_pages() 分配的物理页面块时,它会调用 free_pages(unsigned long addr, unsigned int order) 函数,其中 addr 参数是指向要释放的物理页面块的起始物理地址,而 order 参数是与分配时使用的 order 参数相同,用于指示要释放的页面数量。综上,虚拟内存是一种操作系统的关键特性,它允许程序访问比物理内存更大的地址空间,并提供了一种灵活的内存管理机制,以提高系统的性能、稳定性和多任务处理能力。

szqy00的博客 7176

iOS中.obj、.usdz、.dae和.scn格式之间的转化(思路清晰版)

作者最近在写项目的过程中遇到了一些3d模型格式问题,故写下这篇文章记录一下解决问题的过程。

yueliangmua的博客 5586

similarity network fusion for aggregating data types on a genomic scale

基因组规模上的聚合数据类型的相似性网络融合 摘要:         近期的技术已经使收集不同类型的全基因组数据十分划算,结合这些数据去创建一个给定的疾病或生物过程的一个全面视图的计算方法是有必要的。相似网络融合(SNF:similarity network fusion)通过创建每一个可利用的数据类型的样本(如,患者)的网络可以解决这个问题。例如,创建一个给定一群患者疾病的全面视图,SNF计算

augustar学习笔记 7870

内核为频繁使用的数据结构分配物理内存采用的是_进程内存管理初探

随着cpu技术发展,现在大部分移动设备、PC、服务器都已经使用上64bit的CPU,但是关于Linux内核的虚拟内存管理,还停留在历史的用户态与内核态虚拟内存3:1的观念中,导致在解决一些内存问题时存在误解。例如现在主流的移动设备操作系统Android,经常遇到进程使用大量内存导致被lmk杀死,分配不到内存而触发OOM/ANR,或者分配内存慢导致卡顿,内核态使用哪个分配内存的函数更合理等问题,有些...

weixin_39588223的博客 352

Microchip Studio 7.0 从零开始:下载、安装到首个AVR工程实战

本文为AVR单片机开发新手提供了Microchip Studio 7.0的完整入门指南。从官方下载、避坑安装,到创建首个GCC C工程、编写LED闪烁代码,再到项目配置、仿真调试与程序烧录,手把手带你完成从零到一的实战过程,是掌握AVR开发环境的必备教程。

weixin_29200741的博客 523

操作系统内存管理——连续内存分配

操作系统内存管理——连续内存分配什么是内存管理物理内存分配物理内存分配方案1. 连续分配存储管理1.1 单一连续分配1.2 固定分区分配 什么是内存管理 前面我们已经详细学习了操作系统的进程调度模块,其中多次提到了进程的内存抽象,不妨来回顾一下。如图所示,我们把进程的内存抽象表示为下面的结构: stack存放程序的局部变量 heap可以用来动态申请空间 data存放全局变量、静态变量 text存放代码 那么,这个内存抽象该如何提供呢?需要哪些物理硬件?如下所示。 要知道,CPU 只能访问物理内存。如

qq_41848318的博客 3131

Ansys Zemax与Speos协同设计:HUD系统从光学优化到驾驶视觉验证全流程解析

本文详细解析了如何利用Ansys Zemax与Speos协同工作流,完成HUD系统从光学内核优化到驾驶视觉验证的全流程。通过Zemax进行精密光学设计与像差校正,再通过Speos进行HOA定量分析和虚拟驾驶舱仿真,实现了数据无损流转与验证闭环,有效解决了光学性能与视觉感知脱节的核心问题,显著提升HUD设计效率与可靠性。

git9versioner的博客 530

2025年GESP12月认证C++一级真题解析

摘要 本文包含13道C++编程选择题,每题2分,涉及语法、运算符、循环、条件判断等知识点。题目考察了变量命名规则、运算符优先级、赋值语句、循环控制、格式化输出等内容。部分题目解析与标答存在差异,例如第4题逗号表达式输出应为5但标答为4,第6题赋值运算结果应为4 4但标答为3 4等。这些题目适合用于检验基础编程能力,但需注意部分标答可能存在争议,建议结合具体编译环境验证。最后一题考察"漂亮数"判断,要求填写数字某位能被3整除的条件表达式。

lan_in的博客 754

linux内核篇-内存管理(虚拟内存和物理内存、进程虚拟内存布局、内存映射)

找到的是原来堆顶所在的vm_area_struct的下一个vm_area_struct,看当前的堆顶和下一个vm_area_struct之间还能不能分配一个完整的页(其实也就是堆和内存映射区之间还有多少剩余空间)如果不能,没办法只好直接退出返回,内存空间都被占满了。另外,内核也有内核栈的空间,前面说了,当系统调用进入内核态就需要内核栈,内核栈的特色就是thread_info是为了存储体系结构相关的信息(task_struct通用的),以及还有一块内存存放用户态的CPU上下文信息用于恢复现场的。

weixin_53344209的博客 3147

74、刀具磨损监测与寿命预测分析

本文综述了刀具磨损监测与寿命预测的研究现状,分析了力信号、功率信号、振动信号和声发射信号在刀具状态监测中的应用及其优缺点。介绍了当前常用的刀具寿命模型及故障诊断流程,并总结了基于不同信号的监测方法。文章指出,尽管已有多种方法在理论上取得进展,但在实际应用中仍面临挑战。未来研究方向包括采用更先进的神经网络、深入探索多信号融合技术以及有效利用工业大数据,以提升刀具状态识别的准确性与可靠性。

lstm7chronicler的博客 275

用malloc分配内存,操作系统会为程序分配物理内存,什么时候会分配?

虚拟内存与物理内存的分配时机 虚拟内存的分配: 当程序调用malloc函数请求一定大小的内存时,malloc会首先尝试在进程的虚拟地址空间中为该请求分配一块连续的虚拟内存区域。这个过程通常是通过系统调用如brk(对于小块内存)或mmap(对于大块内存)来完成的。 重要的是要理解,这个步骤只是分配了虚拟内存,并没有直接涉及物理内存的分配。虚拟内存空间在逻辑上是连续的,但实际上它与物理内存的映射关系是动态的,即按需建立。 物理内存的分配: 物理内存的分配发生在进程第一次尝试访问已分配的虚拟内存

m0_59680769的博客 1536

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

物理内存分配快速路径

伙伴系统有一个特点就是它所分配的物理内存页全部都是物理上连续的,并且只能分配 2 的整数幂个页,这里的整数幂在内核中称之为分配阶。

wwwlyj123321的博客 1448

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux物理内存分配(源码阅读2)

prepare_alloc_pages 主要的任务就是在快速内存分配开始之前,做一些准备初始化的工作,其中最核心的就是从指定 NUMA 节点中,根据 gfp_mask 掩码中的内存区域修饰符获取可以进行内存分配的所有内存区域 zone (包括其他备用 NUMA 节点中包含的内存区域)。当快速内存分配失败之后,情况就会变得非常复杂,内核将不得不做更多的工作,比如开启 kswapd 进程异步内存回收,更极端的情况则需要进行直接内存回收,或者直接内存整理以获取更多的空闲连续内存。使用掩码的时候做位运算即可。

iulovewufang的博客 1408

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

8. 进阶 - 物理内存分配

Q:为什么需要两级分配器?Buddy 单独工作:分配小对象时产生严重内部碎片(如分配 100B 需占用 4KB 页)。Slab 单独工作:无法获取物理连续内存(Slab 依赖 Buddy 提供连续页)。协同优势:Buddy 提供大块连续页 → Slab 细分为小对象 → 兼顾外部碎片控制与小对象高效分配。Q:kmalloc() 如何关联两者?kmalloc(size) 使用通用 Slab 缓存(如 kmalloc-4k, kmalloc-8k)。

qq_45527937的博客 1178

物理内存分配与管理

物理内存 物理内存分配设计有两个重要的评价维度,一方面,物理内存分配器需要追求更高的内存资源利用率,即尽可能减少资源浪费。这里先介绍内存碎片的概念, 内存脆片 : 内存碎片指的是无法被利用的内存,其直接导致内存资源利用率的下降。 如何减少内存碎片是内存分配器设计者最关心的一个问题。内存碎片又被分为内部碎片 ( external fragmentation ) 和外部碎片 ( internal fragmentation ) 一种解决方式是,将物理内存以固定大小( 能够满足最大分配请求 )划分为若干块,然后

weixin_52333983的博客 1061

linux物理内存的分配与回收,物理内存分配与回收

我们知道对于物理内存的分配与回收,是先通过内存页面的管理,首先在虚存空间中分配一个虚存区间,然后根据需要为此区间建立起相应的映射并分配对应的物理页面。由于linux操作系统是多任务、多用户的,所以会有很多用户程序的执行与结束,如此频繁的进行内存分配与释放,势必造成许多小块闲散空间的产生,如何能利用起来?linux采用了伙伴算法来解决问题。伙伴算法的主要思想是把所有闲散的页面分为10块用链表链接起来...

weixin_42539414的博客 1223

Linux内核对物理内存组织与分配

Linux物理内存管理采用分层结构:NUMA架构下引入node概念,每个node对应一个物理内存节点,由pglist_data结构表示。node进一步划分为多个zone(如DMA、NORMAL等),由zone结构描述。物理内存以page为单位管理,通过mem_map全局数组跟踪所有页框。Linux采用四种机制管理不同粒度的内存分配:伙伴系统处理大块连续内存(>32K),per-CPU页缓存优化小内存分配(≤32K),slab缓存管理小块对象(<4K),vmalloc机制提供虚拟连续的内存空间。这

qq_24993025的博客 1134

深入理解Linux 物理内存分配/释放过程(1)

在《深入理解Linux物理内存管理》《Linux 物理内存管理涉及的三大结构体之struct pglist》《Linux 物理内存管理涉及的三大结构体之struct zone》《Linux 物理内存管理涉及的三大结构体之struct page》中,给大家详细介绍了物理内存的三大模型:FLATMEM 平坦内存模型,DISCONTIGMEM 非连续内存模型和SPARSEMEM 稀疏内存模型。物理内存架构:一致性内存访问 UMA 架构和非一致性内存访问 NUMA 架构。

weixin_45337360的博客 1999

分配连续物理内存的原因

在分配内存时,系统会尽量给我们分配连续的物理内存,这样有什么好处呢?我知道的有如下2条: 1、DMA不使用页表机制,因此必须分配连续的物理内存。 2、使用连续物理内存可以提高系统整体性能。 上面第1条很容易理解,我主要说明下第2条:     在分页机制打开的情况下,系统访问内存的典型流程为:   1、根据提供的线性地址访问系统TLB,看是否能够命中(hit)。 2、若访

江南雨 4304

物理内存分配

4)低端内存区域水线= min_free_pages * zone->managed_pages/lowmem_pages 即把min_free_pages按比例分配到每个低端内存区域;根据物理内存功能不同,将 NUMA 节点内的物理内存划分为:ZONE_DMA,ZONE_DMA32,ZONE_NORMAL,ZONE_HIGHMEM 这几个物理内存区域。ALLOC_HIGH gfp_t掩码设置__GFP_HIGH时才有作用,表示当前内存分配请求是高优先级的,不允许失败,可以从紧急预留内存中分配。

2444

物理内存探测和memblock分配器初始化和分配

linux内存管理,总的来说,分为3个阶段,分别是: memblock/bootmem分配器初始化 Buddy 系统初始化 Slab/slub分配器初始化 为什么要分为3个阶段呢?由于系统在初始化最初阶段,buddy系统和slab分配器都还未初始化完成,这时候内核分配内存,需要一种方式来分配物理内存,linux系统最初提供bootmem分配器分配内存,后续提供了memblock分配器...

qqqqqq999999的专栏 1394

内存管理-伙伴系统 SLAB分配器 空闲链表 为什么要分配连续物理内存页

作为原书《现代操作系统》的补充 伙伴系统 与分页/分段算法的关系 我们已经了解了分页算法、虚拟页表、页置换算法。这时候又了解到伙伴系统,那它与分页、分段算法有什么关系呢?是平级关系吗? SLAB分配器 有SLAB、SLUB、SLOB三种分配器,统称SLAB分配器。 linux slub实现 kmem_cache 根据书中描述,SLAB会为每个大小维护一个内存资源池(大小通常为2n2^n2n字节)。每个内存资源池会维护多个slab,而每个slab都由一个/多个连续的物理页组成,从伙伴系统申请而来。维护了cu

duoyasong5907的博客 889

Linux内存管理--物理内存分配

First Fit分配器不会造成严重的内存碎片,但其效率较低,由于内存经常通过线性地址进行search,而First Fit中的小块内存经常在物理内存的开始处,为了分配大块内存而不得不扫描前面大量的内存。2) 初始化bootmem_data_t的中参数,并分配表示页分配状态的bitmap,其大小为: (end_pfn-start_pfn+7)/8。• min_low_pfn: 系统中可获得的最小的PFN,装载kernel image结束之后的第一页,在mm/bootmem.c中定义。

m0_74282605的博客 164
上一篇: linux编译信息重定向
下一篇: __builtin_constant_p(x)
tmkeepgood
博客等级 码龄19年 11粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值