• why
    2019-05-23
    - 物理内存组织方式
        - 每个物理页由 struct page 表示
        - 物理页连续, page 放入一个数组中, 称为平坦内存模型
        - 多个 CPU 通过总线访问内存, 称为 SMP 对称多处理器(采用平坦内存模型, 总线成为瓶颈)
        - 每个 CPU 都有本地内存, 访问内存不用总线, 称为 NUMA 非一致内存访问
        - 本地内存称为 NUMA 节点, 本地内存不足可以向其他节点申请
        - NUMA 采用非连续内存模型,页号不连续
        - 另外若内存支持热插拔,则采用稀疏内存模型
    - 节点
        - 用 pglist_data 表示 NUMA 节点,多个节点信息保存在 node_data 数组中
        - pglist_data 包括 id,page 数组,起始页号, 总页数, 可用页数
        - 节点分为多个区域 zone, 包括 DMA; 直接映射区; 高端内存区; 可移动区(避免内存碎片)
    - 区域 zone
        - 用 zone 表示; 包含第一个页页号; 区域总页数; 区域实际页数; 被伙伴系统管理的页数; 用 per_cpu_pageset 区分冷热页(热页, 被 CPU 缓存的页)
    - 页
        - 用 struct page 表示, 有多种使用模式, 因此 page 结构体多由 union 组成
        - 使用一整个页: 1) 直接和虚拟地址映射(匿名页); 2) 与文件关联再与虚拟地址映射(内存映射文件)
            - page 记录: 标记用于内存映射; 指向该页的页表数; 换出页的链表; 复合页, 用于合成大页;
        - 分配小块内存:
            - Linux 采用 slab allocator 技术; 申请一整页, 分为多个小块存储池, 用队列维护其状态(较复杂)
            - slub allocator 更简单
            - slob allocator 用于嵌入式
            - page 记录: 第一个 slab 对象; 空闲列表; 待释放列表
    - 页分配
        - 分配较大内存(页级别), 使用伙伴系统
        - Linux 把空闲页分组为 11 个页块链表, 链表管理大小不同的页块(页大小 2^i * 4KB)
        - 分配大页剩下的内存, 插入对应空闲链表
        - alloc_pages->alloc_pages_current 用 gfp 指定在哪个 zone 分配
    展开
    
     13
  • 有铭
    2019-05-20
    还是没理解那个“伙伴系统”为何会命名为伙伴系统,没感觉到有“伙伴”的感觉

    作者回复: 一整个会议室,划分为两个1/2,再划分为四个1/4,两个1/4就是伙伴呀

    
     4
  • 俩孩儿他爸
    2019-09-03
    老师,对于32bit的系统,如果物理内存大小小于896M,那物理内存区域还有ZONE_HIGHMEM吗?您的第26节课讲到内核处理匿名页的缺页中断处理时,会调用alloc_zeroed_user_highpage_movable去高端内存区域分配物理页,对于32bit系统,物理内存小于896M的情况,这时候伙伴系统去哪里分配物理页呢?对于64bit系统,没有高端内存区域,那上述函数去哪里分配高端内存的物理页呢?

    作者回复: 小于就没有了。如果小于没有ZONE_HIGHMEM的话,就会退而求其次,在直接映射区分配,如果分配不到,就说明没有内存了。64位就是直接映射区分配。

    
     2
  • 江山未
    2019-08-01
    一边读一边在脑海构想结构关系图,半天不得要领。看到最后这张图才恍然大悟。艾玛,以后先看最后这张图,少分配一点脑细胞了

    作者回复: 哈哈,以后先看最后的总结图。

    
     2
  • oldman
    2019-07-12
    老师,我这里有一个疑惑,内存的最大连续页是1024个页,也就是4MB的大小,我们知道在一般的应用程序中,数组都是一连串的内存,那我如果要申请一个大于4MB的数组呢,操作系统会怎么样来分配呢,期待老师解惑。

    作者回复: 这是物理内存呀。应用程序操作的是虚拟内存呀,虚拟内存大了去了。

    
     2
  • williamcai
    2019-09-22
    老师,所有节点的可用内存的容量等于伙伴系统可用空间之和吗
    
     1
  • Leon📷
    2019-05-22
    伙伴系统的意思就是劫富济贫

    作者回复: 也不是,回收内存的时候,还合并呢

    
     1
  • 淤白
    2020-01-31
    通过本篇文章,主要学习到的知识点:在当前的主流非连续内存模型 NUMA 中,将内存分成了三层(节点 -> 区域 -> 页),方便了对内存的管理;Linux 中的一页大小是 4 KB,其将空闲的页分组成了 11 个链表,当有分配内存的需求时,会从链表(大于等于分配需求,持有快最小的链表)中找出一个空闲的页块进行分配,如果没有找到空闲页块,会去更大页块的链表中进行查找,找到后进行分割等后续处理。
    
    
  • Geek_54edc1
    2019-12-11
    "ZONE_NORMAL 是直接映射区,就是上一节讲的,从物理内存到虚拟内存的内核区域,通过加上一个常量直接映射。" 这里讲的有问题,ZONE_NORMAL就是一个普通的可映射的物理内存区域,而不是直接映射区
    
    
  • 陈志恒
    2019-11-25
    关键词:物理内存的组织+分配机制。回忆文中的图
    
    
  • extraterrestrial!!
    2019-11-07
    请教个问题,每个numa节点有自己的内存,这是指物理上分开的内存,还是实际上就一个内存条,被多个核划分了? 如果是物理上的多个内存,那要怎么给分布在不同节点的内存统一编页号,以及这些内存要怎么分配物理地址?
    
    
  • 柳长青
    2019-11-06
    老师、提个问题:硬件的缓存是否就在内核态中
    
    
  • 冥王星
    2019-10-19
    这里的伙伴系统和tcmalloc的运行原理很像,请问tcmalloc是不是模仿并覆盖了这里的伙伴系统?另外,伙伴系统是实现在内核里面的,还是实现在glibc库里?
    
    
  • 俩孩儿他爸
    2019-08-28
    您好,之前看过一篇文章讲解Linux内存物理模型,里面说到了三种物理模型:平坦型、非连续型、稀疏性,看完本节后,发现基于zone的buddy系统和上面讲解的几种模型的关系,理不清了。不知道,三种物理模型是不是也是基于zone的伙伴系统呢?

    作者回复: 这三种模型的区别是page不是连续的,对于zone没有影响

    
    
  • Virtue
    2019-05-28
    学了进程管理和内存管理,在看前面内核初始化的内容,感觉理解又深刻了点。

    作者回复: 赞,常复习常新

    
    
  • MARK
    2019-05-25
    周六打卡,这周的课程让我感觉自己智商欠费😂

    作者回复: 一个是CPU,一个是内存,比较绕,多看几遍就好了

    
    
  • Sharry
    2019-05-23
    老师, 从这节课我看到 slab slob 和 slub... 这...是同一个吗?

    作者回复: 不是同一个

    
    
  • 冷月流光
    2019-05-22
    老师好,伙伴系统的页分配我好像理解了,但是它是怎么回收(回收后要合并吗?)还是没想明白,这个伙伴系统与netty的PoolChunk分配机制有什么异同?

    作者回复: 会合并的

    
    
  • bradleyzhou
    2019-05-21
    感觉伙伴系统的命名是说,每次请求内存时,要么是请求到别的伙伴分剩下的内存,要么是自己切好拿走一块,剩下的给将来的伙伴。

    作者回复: 伙伴系统是对半分割空间

    
    
  • Linuxer
    2019-05-21
    有些应用会要求关闭numa那么这里numanode就为1吗?这时候是所有CPU共用一个pglist?

    作者回复: 关闭就smp了

    
    
我们在线,来聊聊吧