0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

内存分段是如何产生内存碎片的

麦辣鸡腿堡 来源:程序猿阿星 作者:程序猿阿星 2023-10-09 16:28 次阅读

内存分段

程序包含若干个逻辑分段,如可由代码段、数据段、栈段、堆段组成,每个分段都有不同的属性,所以内存以分段的形式把这些段分离出来进行管理

在内存分段方式下,虚拟地址和物理地址是如何映射的?

分段管理下的虚拟地址由两部分组成,段号和段内偏移量

图片

通过段号映射段表的项

从项中获取到段基地址

段基地址+段内偏移量=使用的物理内存

通过上述知道了,使用段号去映射段表的项,使用项中的段基地址与偏移量计算出物理内存地址,但实际上,分段方式会把程序的虚拟地址分为4段,每个段在段表中有一个项,在这一项找到段的基地址,再加上偏移量计算出物理内存地址

分段的方式,很好的解决了,程序本身不需要关心具体物理内存地址的问题,但是它仍有不足之处:

内存碎片的问题

内存交换的效率低的问题

接下来对这两个问题进行分析

分段方式是如何产生内存碎片的?

在说内存碎片之前,还是先弄明白,什么是内存碎片?,8个人去外面吃饭,因为饭点原因,人比较多,剩下的都是4人小餐桌,这些4人小餐桌就是我们所说的内存碎片,此时会有小伙伴说,把2个4人小餐桌拼凑在一起就解决了这个问题,非常简单,我们把这种方式称为内存碎片整理(涉及到内存交换)。

回到正题,我们来看一例子,假设物理内存只有1GB (1024MB),用户电脑上运行了多个程序:

浏览器占用128MB

音乐软件占用256MB

游戏占用了512MB

这个时候我们关闭浏览器,剩余物理内存1024MB -(256MB+512MB)=256MB。但是这剩余的256MB物理内存不是连续的,被分为了两段128MB,导致没有空间再打开一个200MB的程序,如下图所示

图片

这里的内存碎片问题共有两点:

外部内存碎片,就是多个不连续的小物理内存空间,导致新的程序无法被装载

内部内存碎片,程序所有的内存都被装载进了物理内存,但是程序有部分的内存,可能不经常使用,造成内存的浪费

解决外部内存碎片的方法就是使用内存碎片整理

内存碎片整理通过内存交换的方式来实现,我们可以把音乐软件占用的256MB加载到硬盘上面去,再从硬盘读取回来,但是读取回来的位置不再是原来的位置,而是紧跟已经占用的游戏512MB后面,这样两个128MB的空闲物理内存就合并成了一个256MB的连续物理内存,于是新的200MB新程序就能被装载进来

内存交换空间,在 Linux 系统里,是我们常看到的 Swap 空间,这块空间是从硬盘划分出来的,用于内存与硬盘的空间交换。

分段方式为什么内存交换效率低?首先分段管理容易造成内存碎片,导致内存交换的频率较高,因为硬盘的访问速度比内存慢太多了,然后每次交换的时候,把一大段连续的内存写入到硬盘,再又从硬盘读取出来,如果交换的是一个占内存空间很大的程序,这样整个机器都会显得卡顿,过程也很慢的,所以说分段方式内存交换效率低。

为了解决内存分段管理造成的内存碎片与内存交换效率低的问题,就出现了内存分页。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 硬盘
    +关注

    关注

    3

    文章

    1233

    浏览量

    56304
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72764
  • 操作系统
    +关注

    关注

    37

    文章

    6284

    浏览量

    121876
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79541
收藏 人收藏

    评论

    相关推荐

    linux内存相关知识科普

    linux 内存组织结构和页面布局,内存碎片产生原因和优化算法。
    发表于 08-08 10:57 312次阅读

    C语言malloc申请内存时的碎片问题

    解决问题:malloc在申请内存的时候,内存碎片问题会导致原本内存大小足够,却申请大内存失败。
    发表于 08-06 16:58 1009次阅读
    C语言malloc申请<b class='flag-5'>内存</b>时的<b class='flag-5'>碎片</b>问题

    嵌入式系统中内存碎片产生过程说明

    在嵌入式系统中,内存是十分有限而且是十分珍贵的,用一块内存就少了一块内存,而在分配中随着内存不断被分配和释放,整个系统内存区域会
    发表于 09-21 12:22 270次阅读
    嵌入式系统中<b class='flag-5'>内存</b><b class='flag-5'>碎片</b><b class='flag-5'>产生</b>过程说明

    Linux内核内存规整总结

    1.前言 伙伴系统作为内核最基础的物理页内存分配器,具有高效、实现逻辑简介等优点,其原理页也尽可能降低内存外部碎片产生,但依然无法杜绝碎片
    的头像 发表于 11-11 11:17 934次阅读
    Linux内核<b class='flag-5'>内存</b>规整总结

    请问mymalloc会产生内存碎片吗?

    malloc申请内存在释放后,会产生内存碎片,所以UCOSIII内有专门的内存申请。原子哥视频(UCOSIII视频19讲)最后的时候说可以用
    发表于 10-16 04:35

    如何避免内存碎片产生

    内存碎片产生(从内部碎片和外部碎片方面讲述)编程题:第一题:解析头文件,简单来说就是大写字母小写之母通过一些特定的规则进行转换,具体题目要
    发表于 12-21 07:50

    基于线段树的内存管理方法

    现有的内存管理的工作多集中在内存分配的效率上,实时性较好,但易产生内存碎片。为此,提出基于线段树的高效
    发表于 12-27 14:06 2次下载
    基于线段树的<b class='flag-5'>内存</b>管理方法

    如何避免Linux的物理内存碎片

    Linux buddyy系统是linux kernel比较稳定的一个模块,但是并不是说它没有缺陷,Linux内存管理系统自诞生之日,就一直存在物理内存碎片化的问题:在系统启动并且运行很长一段时间
    的头像 发表于 05-01 16:43 5242次阅读
    如何避免Linux的物理<b class='flag-5'>内存</b><b class='flag-5'>碎片</b>化

    你知道linux kernel内存碎片防治技术?

    Linux kernel组织管理物理内存的方式是buddy system(伙伴系统),而物理内存碎片正式buddy system的弱点之一,为了预防以及解决碎片问题,kernel采取了
    发表于 05-10 10:59 822次阅读

    OPPO内存碎片化引擎的作业

    OPPO宣传的内存碎片化引擎是个什么东西?它有何作用?针对上述问题,ColorOS官方微博特地发文科普,我们一起来看看。
    的头像 发表于 03-15 16:20 3440次阅读

    FreeRTOS内存碎片是怎么来的

    内存碎片 在看 FreeRTOS的内存分配方法之前我们先来看一下什么叫做内存碎片,看名字就知道是小块的、
    的头像 发表于 07-30 10:29 553次阅读
    FreeRTOS<b class='flag-5'>内存</b><b class='flag-5'>碎片</b>是怎么来的

    什么是内存碎片Linux

    什么是内存碎片内存碎片在Linux很早的时候就已经出现了,了解早期内存碎片
    的头像 发表于 10-08 10:12 369次阅读
    什么是<b class='flag-5'>内存</b><b class='flag-5'>碎片</b>Linux

    如何解决内存碎片内存交换效率慢的问题

    内存分页 分段的好处是能产生连续的内存空间,但是会出现大量内存碎片
    的头像 发表于 10-09 16:57 546次阅读
    如何解决<b class='flag-5'>内存</b><b class='flag-5'>碎片</b>与<b class='flag-5'>内存</b>交换效率慢的问题

    内存泄漏会产生哪些后果

    ,只释放了p1,没有释放p2,产生内存泄漏。 内存泄漏会产生哪些后果? 随着程序运行时间越来越久,内存有分配没有释放,会使得进程堆中的
    的头像 发表于 11-10 15:06 393次阅读
    <b class='flag-5'>内存</b>泄漏会<b class='flag-5'>产生</b>哪些后果

    内存池的使用场景

    为什么要用内存池 为什么要用内存池?首先,在7 * 24h的服务器中如果不使用内存池,而使用malloc和free,那么就非常容易产生内存
    的头像 发表于 11-10 17:19 342次阅读
    <b class='flag-5'>内存</b>池的使用场景