趣谈 Linux 操作系统
刘超
前网易杭州研究院云计算技术部首席架构师
85458 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 72 讲
趣谈 Linux 操作系统
15
15
1.0x
00:00/00:00
登录|注册

24 | 物理内存管理(下):会议室管理员如何分配会议室?

小块分配
大内存块
Slub Allocator
伙伴系统
物理页面
调整swappiness
启用和关闭
检查情况
换入换出
内存区域
swap分区
kswapd
NUMA节点
物理内存管理

该思维导图由 AI 生成,仅供参考

前一节,前面我们解析了整页的分配机制。如果遇到小的对象,物理内存是如何分配的呢?这一节,我们一起来看一看。

小内存的分配

前面我们讲过,如果遇到小的对象,会使用 slub 分配器进行分配。那我们就先来解析它的工作原理。
还记得咱们创建进程的时候,会调用 dup_task_struct,它想要试图复制一个 task_struct 对象,需要先调用 alloc_task_struct_node,分配一个 task_struct 对象。
从这段代码可以看出,它调用了 kmem_cache_alloc_node 函数,在 task_struct 的缓存区域 task_struct_cachep 分配了一块内存。
static struct kmem_cache *task_struct_cachep;
task_struct_cachep = kmem_cache_create("task_struct",
arch_task_struct_size, align,
SLAB_PANIC|SLAB_NOTRACK|SLAB_ACCOUNT, NULL);
static inline struct task_struct *alloc_task_struct_node(int node)
{
return kmem_cache_alloc_node(task_struct_cachep, GFP_KERNEL, node);
}
static inline void free_task_struct(struct task_struct *tsk)
{
kmem_cache_free(task_struct_cachep, tsk);
}
在系统初始化的时候,task_struct_cachep 会被 kmem_cache_create 函数创建。这个函数也比较容易看懂,专门用于分配 task_struct 对象的缓存。这个缓存区的名字就叫 task_struct。缓存区中每一块的大小正好等于 task_struct 的大小,也即 arch_task_struct_size。
有了这个缓存区,每次创建 task_struct 的时候,我们不用到内存里面去分配,先在缓存里面看看有没有直接可用的,这就是 kmem_cache_alloc_node 的作用。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了物理内存管理中小对象的分配方式,通过比喻的方式生动形象地解释了物理内存管理中小对象的分配机制。文章首先介绍了slub分配器的工作原理,以及在系统初始化时创建的task_struct缓存区域。随后详细解释了缓存对象的分配和释放过程,包括快速通道和普通通道的概念,以及kmem_cache_cpu和kmem_cache_node在分配过程中的作用。文章还对缓存对象的存放和分配过程进行了详细的代码解析,让读者能够深入理解物理内存管理中小对象的分配机制。通过本文的阅读,读者将能够更加深入地了解物理内存管理的技术特点,为他们在实际应用中解决问题提供了有益的参考。 文章还介绍了页面换出的过程,包括触发页面换出的情况以及内核线程kswapd的作用。通过对kswapd的代码解析,读者可以了解到页面换出是以内存节点为单位进行的,以及页面换出的具体实现过程。此外,文章还介绍了内存页的LRU列表和不同类型内存页的处理方式,为读者提供了对页面换出机制的深入理解。 总的来说,本文通过对物理内存管理中小对象的分配方式和页面换出机制的详细解析,为读者呈现了物理内存管理的技术特点和实现细节,为他们在理解和应用物理内存管理方面提供了有益的知识参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈 Linux 操作系统》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(43)

  • 最新
  • 精选
  • W.jyao
    真心看不懂了,😔😔😔

    作者回复: 多看几遍就好了

    2019-05-22
    4
    22
  • 鲍勃
    果然和你的网络课程一样,越到后面越hold不住😂

    作者回复: 其实哪门课都一样哈

    2019-05-22
    16
  • 超超
    2. 如何修改swappiness参数? --临时性修改: [root@rhce ~]# sysctl vm.swappiness=10 vm.swappiness = 10 [root@rhce ~]# cat /proc/sys/vm/swappiness 10 这里我们的修改已经生效,但是如果我们重启了系统,又会变成60. --永久修改: 在/etc/sysctl.conf 文件里添加如下参数: vm.swappiness=10 或者: [root@rhce ~]# echo 'vm.swappiness=10' >>/etc/sysctl.conf 保存,重启,就生效了。

    作者回复: 如此认真,典范啊

    2019-07-17
    15
  • 欠债太多
    看到现在,代码越来越多,关于代码的阅读需要么?怎么去做呢

    作者回复: 重点关注流程,不关注细节

    2019-05-22
    2
    14
  • 活的潇洒
    花了4个多小时终于把笔记做完 分享给大家: https://www.cnblogs.com/luoahong/p/10907734.html

    作者回复: 赞

    2019-05-22
    11
  • 超超
    3. 如何查看swap分区 swapon -s cat /proc/swaps free vmstat 以上4类命令都可以查看swap分区的大小和使用情况

    作者回复: 赞

    2019-07-17
    9
  • 刘強
    这几节看起来吃力了,需要理解的外围知识很多!

    作者回复: 加油,多看几遍

    2019-05-22
    9
  • guojiun
    https://events.static.linuxfound.org/sites/events/files/slides/slaballocators.pdf 這裡有清楚的視意圖,對照著看會更清楚!

    作者回复: 赞

    2019-05-22
    8
  • sundy
    真的应该少粘代码 多讲原理、多抽象,不然很难将您讲的东西串联起来,连基本原理都不了解硬生生的讲代码实在是让人困惑

    作者回复: 其实是有一个整体思路的,被代码打断了,可以讲代码总结一个段落大意,然后再穿起来看,是不是好一些

    2020-06-03
    6
  • 超超
    参考文章:https://mp.weixin.qq.com/s/6JVpke8bDKI9lvh_l6QF-w

    作者回复: 赞

    2019-07-17
    4
收起评论
显示
设置
留言
43
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部