趣谈Linux操作系统
刘超
网易杭州研究院云计算技术部首席架构师
立即订阅
19393 人已学习
课程目录
已完结 72 讲
0/4登录后,你可以任选4讲全文学习。
入门准备篇 (3讲)
开篇词 | 为什么要学习Linux操作系统?
免费
01 | 入学测验:你究竟对Linux操作系统了解多少?
02 | 学习路径:爬过这六个陡坡,你就能对Linux了如指掌
核心原理篇:第一部分 Linux操作系统综述 (3讲)
03 | 你可以把Linux内核当成一家软件外包公司的老板
04 | 快速上手几个Linux命令:每家公司都有自己的黑话
05 | 学会几个系统调用:咱们公司能接哪些类型的项目?
核心原理篇:第二部分 系统初始化 (4讲)
06 | x86架构:有了开放的架构,才能打造开放的营商环境
07 | 从BIOS到bootloader:创业伊始,有活儿老板自己上
08 | 内核初始化:生意做大了就得成立公司
09 | 系统调用:公司成立好了就要开始接项目
核心原理篇:第三部分 进程管理 (10讲)
10 | 进程:公司接这么多项目,如何管?
11 | 线程:如何让复杂的项目并行执行?
12 | 进程数据结构(上):项目多了就需要项目管理系统
13 | 进程数据结构(中):项目多了就需要项目管理系统
14 | 进程数据结构(下):项目多了就需要项目管理系统
15 | 调度(上):如何制定项目管理流程?
16 | 调度(中):主动调度是如何发生的?
17 | 调度(下):抢占式调度是如何发生的?
18 | 进程的创建:如何发起一个新项目?
19 | 线程的创建:如何执行一个新子项目?
核心原理篇:第四部分 内存管理 (7讲)
20 | 内存管理(上):为客户保密,规划进程内存空间布局
21 | 内存管理(下):为客户保密,项目组独享会议室封闭开发
22 | 进程空间管理:项目组还可以自行布置会议室
23 | 物理内存管理(上):会议室管理员如何分配会议室?
24 | 物理内存管理(下):会议室管理员如何分配会议室?
25 | 用户态内存映射:如何找到正确的会议室?
26 | 内核态内存映射:如何找到正确的会议室?
核心原理篇:第五部分 文件系统 (4讲)
27 | 文件系统:项目成果要归档,我们就需要档案库
28 | 硬盘文件系统:如何最合理地组织档案库的文档?
29 | 虚拟文件系统:文件多了就需要档案管理系统
30 | 文件缓存:常用文档应该放在触手可得的地方
核心原理篇:第六部分 输入输出系统 (5讲)
31 | 输入与输出:如何建立售前售后生态体系?
32 | 字符设备(上):如何建立直销模式?
33 | 字符设备(下):如何建立直销模式?
34 | 块设备(上):如何建立代理商销售模式?
35 | 块设备(下):如何建立代理商销售模式?
核心原理篇:第七部分 进程间通信 (7讲)
36 | 进程间通信:遇到大项目需要项目组之间的合作才行
37 | 信号(上):项目组A完成了,如何及时通知项目组B?
38 | 信号(下):项目组A完成了,如何及时通知项目组B?
39 | 管道:项目组A完成了,如何交接给项目组B?
40 | IPC(上):不同项目组之间抢资源,如何协调?
41 | IPC(中):不同项目组之间抢资源,如何协调?
42 | IPC(下):不同项目组之间抢资源,如何协调?
核心原理篇:第八部分 网络系统 (7讲)
43 预习 | Socket通信之网络协议基本原理
43 | Socket通信:遇上特大项目,要学会和其他公司合作
44 | Socket内核数据结构:如何成立特大项目合作部?
45 | 发送网络包(上):如何表达我们想让合作伙伴做什么?
46 | 发送网络包(下):如何表达我们想让合作伙伴做什么?
47 | 接收网络包(上):如何搞明白合作伙伴让我们做什么?
48 | 接收网络包(下):如何搞明白合作伙伴让我们做什么?
核心原理篇:第九部分 虚拟化 (7讲)
49 | 虚拟机:如何成立子公司,让公司变集团?
50 | 计算虚拟化之CPU(上):如何复用集团的人力资源?
51 | 计算虚拟化之CPU(下):如何复用集团的人力资源?
52 | 计算虚拟化之内存:如何建立独立的办公室?
53 | 存储虚拟化(上):如何建立自己保管的单独档案库?
54 | 存储虚拟化(下):如何建立自己保管的单独档案库?
55 | 网络虚拟化:如何成立独立的合作部?
核心原理篇:第十部分 容器化 (4讲)
56 | 容器:大公司为保持创新,鼓励内部创业
57 | Namespace技术:内部创业公司应该独立运营
58 | CGroup技术:内部创业公司应该独立核算成本
59 | 数据中心操作系统:上市敲钟
实战串讲篇 (9讲)
60 | 搭建操作系统实验环境(上):授人以鱼不如授人以渔
61 | 搭建操作系统实验环境(下):授人以鱼不如授人以渔
62 | 知识串讲:用一个创业故事串起操作系统原理(一)
63 | 知识串讲:用一个创业故事串起操作系统原理(二)
64 | 知识串讲:用一个创业故事串起操作系统原理(三)
65 | 知识串讲:用一个创业故事串起操作系统原理(四)
66 | 知识串讲:用一个创业故事串起操作系统原理(五)
67 | 期末测试:这些操作系统问题,你真的掌握了吗?
结束语 | 永远别轻视任何技术,也永远别轻视自己
免费
专栏加餐 (2讲)
学习攻略(一):学好操作系统,需要掌握哪些前置知识?
“趣谈Linux操作系统”食用指南
免费
趣谈Linux操作系统
登录|注册

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

刘超 2019-05-20
前一节,我们讲了如何从项目经理的角度看内存,看到的是虚拟地址空间,这些虚拟的地址,总是要映射到物理的页面。这一节,我们来看,物理的页面是如何管理的。

物理内存的组织方式

前面咱们讲虚拟内存,涉及物理内存的映射的时候,我们总是把内存想象成它是由连续的一页一页的块组成的。我们可以从 0 开始对物理页编号,这样每个物理页都会有个页号。
由于物理地址是连续的,页也是连续的,每个页大小也是一样的。因而对于任何一个地址,只要直接除一下每页的大小,很容易直接算出在哪一页。每个页有一个结构 struct page 表示,这个结构也是放在一个数组里面,这样根据页号,很容易通过下标找到相应的 struct page 结构。
如果是这样,整个物理内存的布局就非常简单、易管理,这就是最经典的平坦内存模型(Flat Memory Model)。
我们讲 x86 的工作模式的时候,讲过 CPU 是通过总线去访问内存的,这就是最经典的内存使用方式。
在这种模式下,CPU 也会有多个,在总线的一侧。所有的内存条组成一大片内存,在总线的另一侧,所有的 CPU 访问内存都要过总线,而且距离都是一样的,这种模式称为 SMP(Symmetric multiprocessing),即对称多处理器。当然,它也有一个显著的缺点,就是总线会成为瓶颈,因为数据都要走它。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《趣谈Linux操作系统》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(21)

  • why
    - 物理内存组织方式
        - 每个物理页由 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 分配
    2019-05-23
    12
  • 有铭
    还是没理解那个“伙伴系统”为何会命名为伙伴系统,没感觉到有“伙伴”的感觉

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

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

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

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

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

    2019-08-01
    2
  • williamcai
    老师,所有节点的可用内存的容量等于伙伴系统可用空间之和吗
    2019-09-22
    1
  • oldman
    老师,我这里有一个疑惑,内存的最大连续页是1024个页,也就是4MB的大小,我们知道在一般的应用程序中,数组都是一连串的内存,那我如果要申请一个大于4MB的数组呢,操作系统会怎么样来分配呢,期待老师解惑。

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

    2019-07-12
    1
  • Leon📷
    伙伴系统的意思就是劫富济贫

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

    2019-05-22
    1
  • Geek_54edc1
    "ZONE_NORMAL 是直接映射区,就是上一节讲的,从物理内存到虚拟内存的内核区域,通过加上一个常量直接映射。" 这里讲的有问题,ZONE_NORMAL就是一个普通的可映射的物理内存区域,而不是直接映射区
    2019-12-11
  • 陈志恒
    关键词:物理内存的组织+分配机制。回忆文中的图
    2019-11-25
  • extraterrestrial!!
    请教个问题,每个numa节点有自己的内存,这是指物理上分开的内存,还是实际上就一个内存条,被多个核划分了? 如果是物理上的多个内存,那要怎么给分布在不同节点的内存统一编页号,以及这些内存要怎么分配物理地址?
    2019-11-07
  • 柳长青
    老师、提个问题:硬件的缓存是否就在内核态中
    2019-11-06
  • 冥王星
    这里的伙伴系统和tcmalloc的运行原理很像,请问tcmalloc是不是模仿并覆盖了这里的伙伴系统?另外,伙伴系统是实现在内核里面的,还是实现在glibc库里?
    2019-10-19
  • 俩孩儿他爸
    您好,之前看过一篇文章讲解Linux内存物理模型,里面说到了三种物理模型:平坦型、非连续型、稀疏性,看完本节后,发现基于zone的buddy系统和上面讲解的几种模型的关系,理不清了。不知道,三种物理模型是不是也是基于zone的伙伴系统呢?

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

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

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

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

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

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

    作者回复: 不是同一个

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

    作者回复: 会合并的

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

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

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

    作者回复: 关闭就smp了

    2019-05-21
  • Linuxer
    每个页块的第一个页的物理地址是该页块大小的整数倍。怎么理解

    作者回复: 大小为16个页框的块,其起始地址是16*2^12的倍数.

    2019-05-21
收起评论
21
返回
顶部