写点什么

跟着卷卷龙一起学 Camera-- 内存池浅析 02

作者:卷卷龙
  • 2022 年 9 月 25 日
    广东
  • 本文字数:603 字

    阅读完需:约 2 分钟


来看下 malloc 使用时的缺点,在通过 mmap 方式申请释放内存的时候,都要通过操作系统调用,系统会切到内核态,再切回到用户态。运行态的切换会耗费不少时间。而且在第一次访问 mmap 分配的虚拟地址的时候都是,虚拟地址都是处于缺页状态,会触发缺页中断。所以,频繁的通过 mmap 分配内存的话,这两样操作都会对 CPU 产生较大的消耗。为了改进 mmap()这两个问题,malloc 在通过 brk()系统调用在堆空间申请内存的时候,由于堆空间是连续的,所以直接预分配更大的内存来作为内存池,当内存释放的时候,就缓存在内存池中。等下次在申请内存的时候,就直接从内存池取出对应的内存块就行了。这样就减少了系统调用、缺页中断的次数,降低了 CPU 的消耗。从图中可以看到,一块连续内存中,释放了后面的 buffer,如果新申请的内存大小大于 30K,就要向 OS 申请,增大了实际使用内存空间,增加了内存碎片。这里其实就引入了池的概念。我们来看下具体内存池技术。


malloc 是标准库的一部分,位于标准库这一层;而内存池是应用程序的一部分。Malloc 的定位是通用性的,通用性的内存分配器设计实现往往比较复杂。但是内存池技术就不一样了,内存池技术是专门服务于某个特殊场景,以此优化程序性能。所以内存池技术的通用性是很差的,它只保证特殊场景下的内存分配性能,同时还能避免内存碎片,防止内存泄漏。简单来说,内存池技术一次性获取到大块内存,然后在其之上自己管理内存的申请和释放,这样就绕过了标准库以及操作系统。


发布于: 刚刚阅读数: 2
用户头像

卷卷龙

关注

还未添加个人签名 2022.07.26 加入

还未添加个人简介

评论

发布
暂无评论
跟着卷卷龙一起学Camera--内存池浅析02_ISP_卷卷龙_InfoQ写作社区