(嵌入式八股)第1章 C语言(五)(后续C相关持续补充)

1.41 内存碎片的概述与解决方法

内存碎片是指在内存管理过程中,由于内存空间分配和释放的不规则性,产生的零散、不连续的内存区域。内存碎片分为两种类型:外部碎片内部碎片

  • 外部碎片:外部碎片指的是在内存中未被分配出去的空闲内存区域,这些区域虽然还可以用于分配,但由于太小,无法满足新进程对内存的申请需求。例如,如果内存中有多个小空闲区域,它们无法组合成一个足够大的区域供进程使用时,就会出现外部碎片。
  • 内部碎片:内部碎片是指已经分配给进程的内存空间中,部分内存没有被实际使用的情况。比如,一个进程请求的内存大小大于实际需求,内存管理系统可能会分配一个更大的块,这样多余的部分就会产生内部碎片。内部碎片通常发生在固定大小的内存分配方式下。
  • 解决内存碎片的常用方法

    为了解决内存碎片问题,通常会采用以下方法:

  • 段页式管理:段页式管理是虚拟内存的一种管理方式。它通过将物理内存划分为固定大小的页面(pages)并使用分页技术,使得内存的分配更加灵活。每个进程可以分配多个不连续的页面,而操作系统通过页表将虚拟地址映射到物理地址。这种方法减少了外部碎片,因为虚拟内存中的页是固定大小的,可以灵活地管理和分配。
  • 使用内存池:内存池是通过预先分配一定量的内存,创建一个内存块池来管理内存分配和回收。内存池可以减少频繁的内存分配和释放,避免由于内存分配时的零散分配而产生碎片。每当进程需要内存时,从内存池中分配内存块,释放时也归还给内存池,从而减少碎片化的发生。
  • C语言代码示例:内存池管理

    下面是一个简单的内存池管理示例,展示如何使用内存池来减少内存碎片。

  • 内存池结构体:定义了一个 MemoryPool 结构,包含一个字符数组 pool 用来模拟内存池,和一个 free_blocks 用来记录当前可用的内存块数量。
  • init_pool():初始化内存池,设置可用的内存块数量。
  • allocate_block():从内存池中分配一个内存块。每次分配一个内存块,free_blocks 数量会减少,直到没有足够的内存块可用为止。
  • free_block():释放一个已分配的内存块,free_blocks 数量会增加,表示该内存块已归还到内存池。
  • 在此示例中,内存池初始化时创建了一个总大小为 1024 字节的内存池,每个内存块大小为 64 字节,因此可以创建 16 个内存块。
  • 内存块通过 allocate_block 函数分配,每次分配时都会减少一个可用内存块的数量。当释放一个内存块时,它会重新归还到内存池中,增加一个可用内存块。
  • 这种内存池的使用可以避免操作系统频繁的内存分配和回收,从而减少碎片化的发生。
  • 总结

    1. 外部碎片是由于内存中存在不连续的小空闲区域,无法满足大块内存请求。

    剩余60%内容,订阅专栏后可继续查看/也可单篇购买

    作者简介:仅用几个月时间0基础天坑急转嵌入式开发,逆袭成功拿下华为、vivo、小米等15个offer,面试经验100+,收藏20+面经,分享求职历程与心得。 专栏内容:这是一份覆盖嵌入式求职过程中99%问题指南,详细讲解了嵌入式开发的学习路径、项目经验分享、简历优化技巧、面试心得及实习经验,从技术面,HR面,AI面,主管面,谈薪一站式服务,助你突破技术瓶颈、打破信息差,争取更多大厂offer。

    全部评论
    勘误1.41内存池管理代码line 1156:return mp->pool + POOL_SIZE - (mp->free_blocks+1) * BLOCK_SIZE;本菜鸡拙见
    点赞 回复 分享
    发布于 2025-03-20 23:45 重庆
    1.43说的是外部碎片吗?
    点赞 回复 分享
    发布于 2025-03-17 15:09 北京
    坐等分享秋招总结经验
    点赞 回复 分享
    发布于 2025-02-25 15:51 浙江
    外碎片怎么解决
    点赞 回复 分享
    发布于 2025-02-24 18:49 浙江
    点赞 回复 分享
    发布于 2025-02-24 18:33 浙江

    相关推荐

    老粉都知道小猪猪我很久没更新了,因为秋招非常非常不顺利,emo了三个月了,接下来说一下我的情况吧本人是双非本 专业是完全不着计算机边的非科班,比较有优势的是有两段大厂实习,美团和字节。秋招面了50+场泡池子泡死的:滴滴 快手 去哪儿 小鹏汽车 不知名的一两个小厂其中字节13场 两次3面挂 两次2面挂 一次一面挂其中有2场面试题没写出来,其他的都是全a,但该挂还是挂,第三次三面才面进去字节,秋招加暑期总共面了22次字节,在字节的面评可以出成书了快手面了8场,2次实习的,通过了但没去,一次2面挂 最后一次到录用评估 至今无消息滴滴三面完 没几天挂了 所有技术面找不出2个问题是我回答不上来的,三面还来说我去过字节,应该不会考虑滴滴吧,直接给我干傻了去哪儿一天速通 至今无消息小鹏汽车hr 至今无消息美团2面挂 然后不捞我了,三个志愿全部结束,估计被卡学历了虾皮二面挂 这个是我菜,面试官太牛逼了拼多多二面挂 3道题也全写了 也没问题是回答不出来的 泡一周后挂腾讯面了5次 一次2面挂 三次一面挂,我宣布腾讯是世界上最难进的互联网公司然后还有一些零零散散的中小厂,但是数量比较少,约面大多数都是大厂。整体的战况非常惨烈,面试机会少,就算面过了也需要和各路神仙横向对比,很多次我都是那个被比下去的人,不过这也正常,毕竟谁会放着一个985的硕士不招,反而去招一个双非读化学的小子感觉现在互联网对学历的要求越来越高了,不仅仅要985还要硕士了,双非几乎没啥生存空间了,我感觉未来几年双非想要进大厂开发的难度应该直线上升了,唯一的打法还是从大二刷实习,然后苟个转正,不然要是去秋招大概率是炮灰。而且就我面字节这么多次,已经开始问很多ai的东西了,你一破本科生要是没实习没科研懂什么ai啊,纯纯白给了
    不知名牛友_:爸爸
    秋招你被哪家公司挂了?
    点赞 评论 收藏
    分享
    评论
    3
    8
    分享

    创作者周榜

    更多
    牛客网
    牛客网在线编程
    牛客网题解
    牛客企业服务