linux 内存分配机制的理解

    今天又看了一下linux 内核slab分配器的内容,脑中产生了一个疑问: linux系统内核使用了buddy算法处理内存页的管理,使用slab分配器对小容量内存的分配,那么一个应用程序会经常使用到如malloc这样的内存请求,它是怎么工作的呢?

    原先我认为可能和这个slab分配器机制相关,或者使用了slab。但又一想,slab分配器有两种机制:普通高速缓存和专用高速缓存,即前者是系统启动时建立的,且每个slab都管理固定大小的空间(2的幂次为单位的字节数);后者slab分配大小可由开发定制,系统提供了接口。

    如果用户内存请求使用第一种slab分配,申请空间随机不可能那么凑巧是2的幂次。岂不是浪费内存?这种可能性可以否定。采用第二种方式,slab分配定制在内核态调用,且系统调用不会调用它的接口,所以也可以否定。第二种应该是提供给内核态程序的。

    想到这里,意识里slab是这样一种机制,它为申请固定大小内存的结构,且批量的频繁使用提供了便利,是内核和底层行为。

    那么用户态的内存请求是怎么工作的呢?那就要研究malloc系统调用了。其实是请求内存时内核去分配内存,比如要分配一个虚拟地址空间,要产生缺页请求,获取物理内存,并映射进页表,返回的虚拟地址供程序调用。释放内存时则标记此段虚拟地址空间为未使用,在适当的时候释放整个页。

    kmalloc调用使用了slab分配机制,vmalloc调用则是和malloc相似的分配机制,通过内核页表来请求内存。在页表或slab分配表中查询不到空闲空间则请页异常中断处理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1 内存寻址 1.1 物理地址、虚拟地址以及线性地址 物理地址: 物理内存的内存单元地址 虚拟地址: 程序员看到的...
    疯狂小王子阅读 8,145评论 3 21
  • 第八章 内存管理 本章通过三部分内容描述内核给自己动态分配内存: ...
    rlkbk阅读 3,280评论 0 1
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 12,391评论 0 27
  • Linux 内存管理 1 页的概念 linux 内核中把物理页作为内存分配的最小单位,32位CPU 页的大小通常为...
    赤兔欢阅读 8,595评论 0 5
  • 进程与内存 进程的5种不同的数据区 代码段 代码段是用来存放可执行文件的操作指令,也就是说它是可执行程序在内存中的...
    lucus_guo阅读 3,342评论 0 4

友情链接更多精彩内容