计算机原理-为什么会产生内存碎片

计算机原理探险系列(六)-- 看图认识内存分配 之前的几篇文章里面,我们相应介绍了计算机内部的进程,磁盘,cpu,网络等相关知识点,今天主要来一起探讨下关于计算机的内存分配问题。 有限的物理内存 计算机在运行的时候,其所拥有的内存空间其实是有限的。在早期的Dos操作系统中,通常就是4mb的内存,那时候的应用软件还不怎么流行,基本4mb的内存空间就足够程序运作了。不过到了后期阶段,随着各种硬件设备的不断完善,往往可能会存在内存空间小于程序的大小。(例如:内存空间4mb,程序大小16mb) 解决思路 设计一个虚拟存储器,将需要用到指定程序加载到内存中进行计算 阅读详情

新博客地址(shankusu.me)

要想回答这个问题,就得刨根问底,内存到底是怎样分配的?

在内核态的角度来看,进程需要分配内存的方式有两种:brk和mmap这两个系统调用。

  1. brk是数据段的最高地址指针_edata往高地址增长;

  2. mmap是建立了页到用户进程的虚拟空间映射,在进程的虚拟地址空间中,堆和栈之间的大空间中找一块空闲的地址。

这两种方式分配到的都是虚拟内存,并还没有分配真正的物理地址。会在第一次访问的时候,内核判断有没有物理地址,如果没有回发生缺页中断,然后分配物理地址,建立虚拟地址和物理地址之间的映射关系。

但在用户态申请动态内存,是不会直接调用这两个系统调用接口。一般情况下是通过C库的malloc/free来申请和释放。而C库的实现也正是基于这两个系统调用接口,进行上层的封装和管理。

当内核发生缺页中断的时候,到底会做哪些事情呢?

首先进程会从用户态陷入到内核态运行,会执行以下步骤:

  1. 检查需要访问的虚拟地址是否合法;

  2. 查找,分配物理页;

  3. 填充物理页的内容;

  4. 建立映射关系(虚拟地址->物理地址);

重新执行发生缺页中断的那条指令。

如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。

注意:

用ps -o majflt,minflt -C program命令查看。

majflt代表major fault,中文名叫主错误,minflt代表minor fault,中文名叫次错误。

这两个数值表示一个进程自启动以来所发生的缺页中断的次数。

下面我们用实例来解释下内存申请的原理

情况一、malloc小于128k的内存,使用brk分配内存,将_edata往高地址推(只分配虚拟空间,不对应物理内存(因此没有初始化),第一次读/写数据时,引起内核缺页中断,内核才分配对应的物理内存,然后虚拟地址空间建立映射关系),如下图:

1、进程启动的时候,其(虚拟)内存空间的初始布局如第一幅图所示。其中,mmap内存映射文件是在堆和栈的中间(例如libc-2.2.93.so,其它数据文件等),为了简单起见,省略了内存映射文件。_edata指针(glibc里面定义)指向数据段的最高地址。 

2、进程调用A=malloc(30K)以后,内存空间如第二幅图:malloc函数会调用brk系统调用,将_edata指针往高地址推30K,就完成虚拟内存分配。你可能会问:只要把_edata+30K就完成内存分配了?

事实是这样的,_edata+30K只是完成虚拟地址的分配,A这块内存现在还是没有物理页与之对应的,等到进程第一次读写A这块内存的时候,发生缺页中断,这个时候,内核才分配A这块内存对应的物理页。也就是说,如果用malloc分配了A这块内容,然后从来不访问它,那么,A对应的物理页是不会被分配的。 


3、进程调用B=malloc(40K)以后,内存空间如第三幅图。

情况二、malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0),如下图:

4、进程调用C=malloc(200K)以后,内存空间第一幅图:默认情况下,malloc函数分配内存,如果请求内存大于128K(可由M_MMAP_THRESHOLD选项调节),那就不是去推_edata指针了,而是利用mmap系统调用,从堆和栈的中间分配一块虚拟内存。

这样子做主要是因为:brk分配的内存需要等到高地址内存释放以后才能释放(例如,在B释放之前,A是不可能释放的,这就是内存碎片产生的原因,什么时候紧缩看下面),而mmap分配的内存可以单独释放。

当然,还有其它的好处,也有坏处,再具体下去,有兴趣的同学可以去看glibc里面malloc的代码了。 


5、进程调用D=malloc(100K)以后,内存空间如图5;


6、进程调用free(C)以后,C对应的虚拟内存和物理内存一起释放。

7、进程调用free(B)以后,如第一幅图所示:B对应的虚拟内存和物理内存都没有释放,因为只有一个_edata指针,如果往回推,那么D这块内存怎么办呢?

当然,B这块内存,是可以重用的,如果这个时候再来一个40K的请求,那么malloc很可能就把B这块内存返回回去了。 


8、进程调用free(D)以后,如第二幅图所示:B和D连接起来,变成一块140K的空闲内存。

9、默认情况下:当最高地址空间的空闲内存超过128K(可由M_TRIM_THRESHOLD选项调节)时,执行内存紧缩操作(trim)。在上一个步骤free的时候,发现最高地址空闲内存超过128K,于是内存紧缩,变成第三幅图所示。

如果这个时候我们想要申请一块50K的内存E,就会出现下图的情况。

有没有发现,并没有从中间40K的内存分配,因为不满足我们申请50K大小的要求,而是向下偏移指针_edata分配50K,到这里就能发现就产生了内存碎片,这块碎片正是那40K。

系统运行的越久,出现上述这样的情况越多,整个系统的小内存就会很多,导致的结果是:查看系统的剩余内存比较可观,但申请大块内存会返回失败。

操作系统领域内存碎片的创新解决思路 本文旨在全面探讨操作系统内存碎片问题的创新解决方案。我们将覆盖从基础概念到前沿技术的完整知识体系,帮助读者理解内存碎片的本质及其对系统性能的影响,并掌握多种实用的解决策略。文章首先介绍内存碎片的基本概念,然后分析传统解决方案的局限性,接着深入探讨多种创新思路,最后通过实际案例展示这些技术的应用效果。内存碎片:内存中分散的、无法被有效利用的小块空闲区域外部碎片:已分配内存块之间无法满足新请求的小块空闲内存内部碎片:分配给进程但未被实际使用的内存部分内存碎片。 阅读详情

相关推荐

内存管理与优化:内存碎片整理工具实战指南

内存碎片是指内存空间中出现的未被充分利用的小片段,它们虽然存在但无法被有效地利用。根据碎片的性质,可分为内部碎片(内部未被充分利用)和外部碎片(分配单元之间未被充分利用的空间)。随着时间的推移,如果不进行适当的整理,这些碎片会越来越多,不仅影响内存的利用率,还可能导致应用程序无法获得连续的大块内存空间,从而引发性能下降。

weixin_34392511的博客 1210

内存碎片产生原因及解决办法

内存碎片产生原因及解决办法

liuyuanbin9001 4483

ZYNQ出现问题及解决办法汇总(一直更新)

问题目录使用软件及开发板版本一,vitis在build project时卡住。二,Could not find FPGA device on the board for connection 'Local'三,FPGA configuration failed:DONE PIN is not high四,Could not find ARM device on the board for connection 'Local' 使用软件及开发板版本 开发板:MZ7XA-7020 软件:vitis2020.2(

qq_45057368的博客 1万+

内存碎片产生原因及解决方法

内存管理

songtaoyulu的博客 2090

Proxmox VE(PVE)与UPS联动配置:实现智能断电保护方案

本文详细介绍了为Proxmox VE (PVE)服务器配置UPS智能断电保护的完整方案。通过安装和配置apcupsd软件,实现PVE与UPS的联动,可在市电中断、电池电量不足时自动触发安全关机流程,有效保护虚拟机数据与服务连续性。文章涵盖了硬件选择、软件配置、策略设定及实战测试指南,并扩展了网络共享UPS的高级应用。

python9snake的博客 509

大漠多线程增强版:解决窗口消失、坐标错乱与识别卡死

多线程环境下窗口自动化面临的核心挑战,本质是GDI资源非线程安全、HWND生命周期失控及图像引擎状态污染三大底层问题。Windows GUI编程中,跨线程共享hDC、缓存失效的窗口句柄、OpenCV静态Mat等设计缺陷,导致FindPic失败、GetCursorPos异常、坐标跳变等典型故障。本方案通过线程局部存储(TLS)重构资源生命周期、WinEventHook+心跳探测构建实时窗口状态链、ABI对齐的多语言内存契约,实现稳定低延迟的并发UI识别与控制。适用于游戏多开监控、电商RPA、后台UI状态采集等

weixin_30561177的博客 477

【Linux】内存碎片产生原因及如何避免内存碎片

内存碎片是指已经分配的内存块之间出现未被利用的空间,这种空间会导致内存利用率降低,从而影响系统的性能和稳定性。综上所述,避免内存碎片需要注意内存分配的方式、内存对齐以及内存泄。

zclinux的博客 3983

深入解析PVT corner:从wcl到ml的芯片设计关键考量

本文深入解析了芯片设计中的PVT corner概念,重点探讨了从传统WC到先进工艺下WCL、ML等关键工艺角。文章详细阐述了温度反转效应如何使低温WCL成为最严苛的时序场景,并提供了基于先进工艺的实战签核策略与多角多模分析流程,确保芯片在极端工艺、电压、温度下的稳健性。

tree8的博客 527

动画发展简史与技术原理——游戏世界里的“时光魔法”

摘要 本文系统梳理了游戏动画技术的发展历程与核心技术原理。从早期像素游戏的逐帧换图技术,到3D时代的骨骼动画与蒙皮权重,再到现代动捕、物理引擎与AI驱动的混合动画,游戏动画经历了从简单到复杂的演进。文章详细解析了各阶段的技术实现方式,包括骨骼动画的权重计算、动捕的数据处理流程、物理动画的实时反馈机制等核心原理,并通过《超级玛丽》《古墓丽影》等经典案例进行实证分析。研究表明,动画技术的进步不仅提升了游戏表现力,更拓展了艺术创作空间,未来AI与实时云技术将推动动画进入新纪元。全文揭示了游戏动画作为技术与艺术融合

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1800

【Xilinx】如何在petalinux下编译vcu-gst-app以及独立编译vcu-gst-app

Xilinx从2018.1开始,提供了一套基于zcu106的vcu参考设计。里面提供了一套基于GStreamer的程序,即vcu-gst-app。如何脱离petalinux直接编译呢,这里以为例,其他版本也是类似的操作。

王师傅 3040

Java与OSG的梦幻联动:深入编译OpenSceneGraph的Java JNI桥梁,开启3D视觉盛宴的奇幻之旅

🔥关注墨瑾轩,带你探索编程的奥秘!🚀🔥超萌技术攻略,轻松晋级编程高手🚀🔥技术宝库已备好,就等你来挖掘🚀🔥订阅墨瑾轩,智趣学习不孤单🚀🔥即刻启航,编程之旅更有趣🚀在编译OpenSceneGraph (OSG) 的Java版本时,首先需要了解OSG本身是一个主要用于3D图形和视觉仿真的开源库,它主要支持C++。然而,OSG 也支持通过JNI(Java Native Interface)与Java集成,这允许Java程序调用OSG的C++库。

java专栏 870

内存碎片---内部碎片&外部碎片

内部碎片的产生:因为所有的内存分配必须起始于可被 4、8 或 16 整除(视处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的内存块分配给客户。假设当某个客户请求一个43字节的内存块时,因为没有适合大小的内存,所以它可能会获得 44字节、48字节等稍大一点的字节,因此由所需大小四舍五入而产生的多余空间就叫内部碎片。外部碎片的产生:频繁的分配与回收物理页面会导...

Unique-You的博客 1万+

YOLOv13改进策略【注意力机制篇】| ICASSP 2023 EMA 高效多尺度注意力,跨空间学习提高远距离建模依赖

ICASSP 2023 EMA 高效多尺度注意力在 YOLOv13 的接入实战:跨空间学习提升远距离依赖建模,含原理图解、完整代码、yaml 配置与实测参数量对比(ultralytics 8.3.63)。

qq_53329130的博客 935

内存中,外部碎片与内部碎片,解决办法

是由于大量信息由于先后写入、置换、删除而形成的空间碎片。为了便于理解,我们将信息比作货物,将存储空间比作仓库来举例子。假设,我们有编号为1、2、3、4、5、6的6间仓库库房,前天送来了一大宗货,依次装入了1、2、3、4、5号仓库,昨天又因故将4号库房的货物运走了,那么数值上说我们还有两间空仓库的空间,但是如果这时候送来两间仓库容量的货物但要求必须连续存放的话,我们实际上是装不下的。这时的4、6号仓库,就成为一种空间的碎片。由于这样的原因形成的空间碎片,我们称之为外部碎片。

qq_43142509的博客 5948

SAPGUI 与 ADT 的时代分野:在多云架构下,谁还能代表现代 SAP 开发

摘要(149字) SAP开发工具正经历代际更迭:SAPGUI基于专有协议(NI/DIAG)的厚客户端架构难以适配多云环境,而ADT(ABAP Development Tools)通过HTTP(S)协议和Eclipse生态成为ABAP Cloud/RAP开发的唯一入口。关键差异体现在:ADT支持CDS、行为定义等云原生对象建模,天然对齐BTP的零信任网络;集成ATC、Git等DevOps工具链;而SAPGUI无法创建RAP核心对象,在跨平台、自动化方面存在硬限制。官方文档明确将ADT作为Clean Core战

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 392

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

动态内存管理中的暗雷:内存碎片产生原理与4步清除法

掌握动态内存管理难题,深入解析内存的碎片成因与高效清理策略。适用于嵌入式系统与高频服务场景,揭秘4步清除法核心流程,提升内存利用率与程序稳定性。方法实用可靠,值得收藏。

ProceShoal的博客 990

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

计算机知识---操作系统内存碎片:内部碎片 vs 外部碎片的原理、影响与解决方案

内存碎片分为内部碎片(分配但未使用的内存)和外部碎片(空闲但无法分配的小块)。内部碎片常见于固定分区和分页系统,而外部碎片多由动态分区分配导致

小李独爱秋的博客 2522

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

操作系统内存管理之 内部碎片vs外部碎片

“碎片的内存”描述一个系统中所有不可用的空闲内存。这些资源之所以仍然未被使用,是因为负责分配内存的分配器使这些内存无法使用。这一问题通常都会发生,原因在于空闲内存以小而不连续方式出现在不同的位置。由于分 配方法决定内存碎片是否是一个问题,因此内存分配器在保证空闲资源可用性方面扮演着重要的角色。 internal fragmentation:when memory allocated

辉仔 の专栏 3万+

操作系统内存碎片

内存碎片无法被利用的内存,分为外部碎片和内部碎片。分段机制会导致外部碎片,分页机制会导致内部碎片。

Roger_Spencer的博客 1124

深度解析 C 语言内存碎片:产生原因、影响与内存分配优化方案

内存碎片是 C 语言动态内存管理的核心挑战,主要由外部和内部碎片引起,导致性能下降和内存浪费。通过优化方案如内存池、伙伴系统和代码实践,可显著缓解问题。开发者应结合程序特性选择策略,并借助工具监控碎片。优化后,内存利用率可提升 30% 以上,确保程序稳定高效运行。

2501_93876551的博客 434

Linux内存碎片深度剖析:原理、处理与分析全指南

内存碎片(Memory Fragmentation)是指内存的使用效率降低的现象,它分为两种形式:内部碎片(Internal Fragmentation)和外部碎片(External Fragmentation)。内部碎片发生在内存块被分配出去后,剩余的未使用空间无法被其他请求利用。外部碎片则是指多次内存分配和释放后,内存中留下许多小的、不连续的空闲区域,这些区域太小,无法满足新的内存请求,尽管总的空闲内存量可能足够。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1943

什么是磁盘碎片

实际上,磁盘碎片应该称为文件碎片,因为文件会分别保存到整个磁盘的不同位置,而不是连续保存在磁盘的连续群集中。   当应用程序所需的物理内存不足时,通常操作系统会在硬盘上生成临时交换文件。此临时交换文件占用的磁盘空间用于形成虚拟内存。虚拟内存的管理程序将经常在硬盘上读写并产生大量碎片。这是硬盘碎片化的主要原因。除此之外,系统中的临时文件会导致很多碎片。当IE浏览器浏览信息或用户直接设置它们时生成...

wsmzyzdw的博客 6133

如何解决内存碎片

内存碎片的产生:         内存分配有静态分配和动态分配两种        静态分配在程序编译链接时分配的大小和使用寿命就已经确定,而应用上要求操作系统可以提供给进程运行时申请和释放任意大小内存的功能,这就是内存的动态分配。         因此动态分配将不可避免会产生内存碎片的问题,那么什么是内存碎片?内存碎片即“碎片的内存”描述一个系统中所有不可用的空闲内存,这些碎片之所以不能被使

痞子龙3D编程 8834

数据结构考研:电脑磁盘碎片的定义、产生原理和清理原因(文件碎片/机械硬盘/固态硬盘/硬盘清理/计算机/软件工程/王道论坛)

一、背景 博主最近在浏览王道论坛的数据结构书籍,其中提到数据的存储结构有4种,其中之一就是顺序存储,顺序存储可以实现随机存取,但只能使用物理地址上相邻的一整块存储单元,因此可能产生较多的外部碎片。 说到碎片,经常使用计算机的我们一定不陌生,我们总是会在各种电脑资讯网站看到类似的磁盘碎片清理的文章,例如知乎上的都说装了SSD固态硬盘,就不需要磁盘碎片整理,这是为什么呢? 今天博主查阅相关资料后,对磁...

快乐李同学的博客 3831

计算机操作系统 外碎片和内碎片

碎片 碎片是指内存中无法利用的存储空间,碎片分为内部碎片和外部碎片,内部碎片是指分配给作业的存储空间中未被利用的部分,外部碎片是指系统中无法利用的小存储块。 分页存储管理系统 在分页存储管理系统中,作业地址空间划分成若干大小相等的页,相应地将内存的存储空间分成与页大小相等的块,在为作业分配存储空间时,总是以块为单位来分配,可以将作业中的某一页放到内存的某一空闲块中。在分页存储管理中,要求将作业放在...

weixin_47005624的博客 2703
上一篇: 我是如何通过系统架构设计师考试的(2017年软考)-转载
下一篇: 计算机原理-gdb到底是怎么实现的?
shankusu2017
博客等级 码龄15年 155粉丝 155原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值