(嵌入式八股)第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;本菜鸡拙见
    点赞 回复 分享
    发布于 03-20 23:45 重庆
    1.43说的是外部碎片吗?
    点赞 回复 分享
    发布于 03-17 15:09 北京
    坐等分享秋招总结经验
    点赞 回复 分享
    发布于 02-25 15:51 浙江
    外碎片怎么解决
    点赞 回复 分享
    发布于 02-24 18:49 浙江
    点赞 回复 分享
    发布于 02-24 18:33 浙江

    相关推荐

    投递米哈游等公司6个岗位
    点赞 评论 收藏
    分享
    评论
    3
    7
    分享

    创作者周榜

    更多
    牛客网
    牛客企业服务