写点什么

5.10 版本 linux 内核的使用 slub 的 kmem_cache_init 函数解析

作者:linux大本营
  • 2023-04-26
    湖南
  • 本文字数:673 字

    阅读完需:约 2 分钟

在 5.10 版本的内核中,如果使用 SLUB 内存分配器,kmem_cache_init 函数会调用 kmem_cache_init_late 函数进行具体实现。


kmem_cache_init_late 函数的定义如下(在 mm/slub.c 文件中):


static void __init kmem_cache_init_late(void)
复制代码


该函数的作用是初始化 SLUB 分配器中所有的缓存。


具体实现如下:


  1. 调用 kmem_cache_shrink 函数进行内存回收,释放空闲的内存块。


kmem_cache_shrink();
复制代码


该函数会遍历每个缓存的所有 CPU 本地缓存,把其中的未使用的内存块放回到全局池中,以减少内存占用。


  1. 调用 kmem_cache_create 函数为每个 slab 缓存创建相应的 kmem_cache 结构体。


for_each_memcg_cache(memcg, s) {    struct kmem_cache *c = kmem_cache_create(s, flags);    if (IS_ERR(c))        goto err_destroy_caches;}
复制代码


该函数会在相应的内存控制组(memcg)中创建 slab 缓存的 kmem_cache 结构体。其中,memcg 是每个内存控制组的指针,s 是该内存控制组中的缓存信息指针。通过遍历所有的缓存信息,调用 kmem_cache_create 函数为每个 slab 缓存创建相应的 kmem_cache 结构体。


  1. 调用 init_per_cpu_pageset 函数初始化每个 CPU 的缓存池。


init_per_cpu_pageset();
复制代码


该函数会在每个 CPU 上初始化相应的缓存池,提高内存分配效率。


  1. 最后,调用 deactivate_slab 函数把空闲的 slab 缓存从全局链表中移除,减少管理开销。


deactivate_slab();
复制代码


该函数会把没有被使用的 slab 缓存从全局链表中移除,同时释放相应的内存块。


以上就是 5.10 版本 Linux 内核中使用 SLUB 分配器的 kmem_cache_init 函数的具体实现过程。


相关技术视频教程:c/c++ linux服务器开发/后台架构师免费学习地址

c/c++后端技术交流群:579733396

用户头像

还未添加个人签名 2020-11-26 加入

C/C++linux服务器开发群 812855908

评论

发布
暂无评论
5.10版本linux内核的使用slub的kmem_cache_init函数解析_内存管理_linux大本营_InfoQ写作社区