趣谈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操作系统
登录|注册

13 | 进程数据结构(中):项目多了就需要项目管理系统

刘超 2019-04-24
上一节我们讲了,task_struct 这个结构非常长。由此我们可以看出,Linux 内核的任务管理是非常复杂的。上一节,我们只是讲了一部分,今天我们接着来解析剩下的部分。

运行统计信息

作为项目经理,你肯定需要了解项目的运行情况。例如,有的员工很长时间都在做一个任务,这个时候你就需要特别关注一下;再如,有的员工的琐碎任务太多,这会大大影响他的工作效率。
那如何才能知道这些员工的工作情况呢?在进程的运行过程中,会有一些统计量,具体你可以看下面的列表。这里面有进程在用户态和内核态消耗的时间、上下文切换的次数等等。
u64 utime;//用户态消耗的CPU时间
u64 stime;//内核态消耗的CPU时间
unsigned long nvcsw;//自愿(voluntary)上下文切换计数
unsigned long nivcsw;//非自愿(involuntary)上下文切换计数
u64 start_time;//进程启动时间,不包含睡眠时间
u64 real_start_time;//进程启动时间,包含睡眠时间

进程亲缘关系

从我们之前讲的创建进程的过程,可以看出,任何一个进程都有父进程。所以,整个进程其实就是一棵进程树。而拥有同一父进程的所有进程都具有兄弟关系。
struct task_struct __rcu *real_parent; /* real parent process */
struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */
struct list_head children; /* list of my children */
struct list_head sibling; /* linkage in my parent's children list */
parent 指向其父进程。当它终止时,必须向它的父进程发送信号。
children 表示链表的头部。链表中的所有元素都是它的子进程。
sibling 用于把当前进程插入到兄弟链表中。
通常情况下,real_parent 和 parent 是一样的,但是也会有另外的情况存在。例如,bash 创建一个进程,那进程的 parent 和 real_parent 就都是 bash。如果在 bash 上使用 GDB 来 debug 一个进程,这个时候 GDB 是 parent,bash 是这个进程的 real_parent。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《趣谈Linux操作系统》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(25)

  • 石维康
    文中说“如果在 bash 上使用 GDB 来 debug 一个进程,这个时候 GDB 是 real_parent,bash 是这个进程的 parent。”
    根据copy_process里对PT_PTRACED标志位处理的流程来看,应该是 bash 是 real_parent,GDB 是这个进程的 parent 吧?

    作者回复: 谢谢,果真弄反了

    2019-04-24
    1
    27
  • 逍觉迷遥
    ①这节内容解决了关于上节task_struct为什么要用链表结构,是为了维护多个task之间的关系。一个task节点的parent指针指向其父进程task,children指针指向子进程所有task的头部,然后又靠 sibling指针来维护统一级兄弟task!
     
    ②setUid是一个权限的特殊标志位,带有这个标志位可以对文件执行等同root的权限!比如,Linux下修改密码的指令passwd,我们ls去查看时发现其权限就有s标志,这个就是之所以能修改密码的原因。如果去掉这个权限,再以普通用户身份去修改密码则会提示没有权限!这个例子和老师的玩游戏可以说是异曲同工,但它更具有普遍性,大家也更熟悉!

    ③capabilities听了感觉云里雾里还是一知半解,老师着重讲了概念,但还是不知道怎么用???希望老师结合实际使用例子讲一下就更好了!!!

    作者回复: capabilities在容器那一节会用到

    2019-04-24
    18
  • why
    - 运行统计信息, 包含用户/内核态运行时间; 上/下文切换次数; 启动时间等;
    - 进程亲缘关系
        - 拥有同一父进程的所有进程具有兄弟关系
        - 包含: 指向 parent; 指向 real_parent; 子进程双向链表头结点; 兄弟进程双向链表头结点
        - parent 指向的父进程接收进程结束信号
        - real_parent 和 parent 通常一样; 但在 bash 中用 GDB 调试程序时, GDB 是 real_parent, bash 是 parent
    - 进程权限, 包含 real_cred 指针(谁能操作我); cred 指针(我能操作谁)
        - cred 结构体中标明多组用户和用户组 id
        - uid/gid(哪个用户的进程启动我)
        - euid/egid(按照哪个用户审核权限, 操作消息队列, 共享内存等)
        - fsuid/fsgid(文件操作时审核)
        - 这三组 id 一般一样
        - 通过 chmod u+s program, 给程序设置 set-user-id 标识位, 运行时程序将进程 euid/fsuid 改为程序文件所有者 id
        - suid/sgid 可以用来保存 id, 进程可以通过 setuid 更改 uid
        - capability 机制, 以细粒度赋予普通用户部分高权限 (capability.h 列出了权限)
            - cap_permitted 表示进程的权限
            - cap_effective 实际起作用的权限, cap_permitted 范围可大于 cap_effective
            - cap_inheritable 若权限可被继承, 在 exec 执行时继承的权限集合, 并加入 cap_permitted 中(但非 root 用户不会保留 cap_inheritable 集合)
            - cap_bset 所有进程保留的权限(限制只用一次的功能)
            - cap_ambient exec 时, 并入 cap_permitted 和 cap_effective 中
    - 内存管理: mm_struct
    - 文件与文件系统: 打开的文件, 文件系统相关数据结构
    2019-04-24
    13
  • garlic
    进程的相关信息可以通过ps 获取, 依赖关系通过pstree获取,文件相关通过lsof, fuser,capabilities相关通过capsh,getcap获取, 学习笔记https://garlicspace.com/2019/07/03/获取进程信息相关命令/

    作者回复: 赞

    2019-07-03
    8
  • WL
    请问一下老师这句代码中的, __rcu是什么意思? 起到的作用是啥? 在网上好像没搜到.
    const struct cred __rcu *real_cred;

    作者回复: RCU(Read-Copy Update),是 Linux 中比较重要的一种同步机制。顾名思义就是“读,拷贝更新”,再直白点是“随意读,但更新数据的时候,需要先复制一份副本,在副本上完成修改,再一次性地替换旧数据”。这是 Linux 内核实现的一种针对“读多写少”的共享数据的同步机制。

    2019-04-30
    7
  • manatee
    通过/proc/pid/status可以看到进程的所属的各种id

    作者回复: 建议大家多看/proc/pid下的相关信息

    2019-04-24
    5
  • wumin
    作业能给出具体的命令吗?

    作者回复: 其实一搜就能搜索到的

    2019-05-21
    1
    4
  • 辉煌码农
    进程亲缘关系的图超赞
    2019-09-20
    1
  • 拯救地球好累
    请问下老师,调度相关信息和信号处理相关信息如何用命令行来查看
    2019-12-09
  • 陈志恒
    如果task的数据结构就是为了打印出来看我觉得还是比较容易的,关键还是要站在linux创造的角度,理解为什么要这样设计数据结构,这需要对整个linux系统进行整体的学习和分析,继续加油,多看两遍!
    2019-11-25
  • 柳长青
    老师,我的系统RHEL7,进入/proc/$pid里头,有很多文件包括:status,stat,attr....,但是具体是跟你表格中的内容怎么对映呢?你表格中的信息只在这个文件里面吗?
    2019-10-30
  • 天王
    进程的数据结构2,1 运行统计信息 task_struct里面有utime用户态消耗时间,stime内核态消耗时间,nvcsw自愿的上下文切换计数,nivcsw,非自愿的上下文切换计数,start_time进程启动时间,real_start_time真实的进程启动时间。2 进程的亲戚关系 real_parent和parent指向父进程,list_head children指向子进程,list_head sibling 指向兄弟进程 3 进程权限信息 3.1 用户和用户组权限 项目组权限,是指能访问哪些文件,访问文件夹,操作文件,被其他项目组访问,进程权限定义,struct cred _rcu *real_cred 谁能操作我,*cred 我能操作谁,cred 定义 大部分是用户和用户组所属的 第一个是uid和gid,real user/group id,谁启动的进程,就是谁的id,第二个是ueid和egid,effective有效的,这个进程操作消息队列,共享内存,信号量这些对象的时候是否有权限。第三个是fsuid和fsgid filesystem user/group id,对文件系统操作是否有权限,linux进程可以随时通过setuid设置用户id,改成创建进程的uid,就能操作了。创建进程的uid和gid会保存在一个地方,允许修改,那就是suid和sgid。3.2 capabilities 机制控制权限 用位图控制权限,3.21 cap_permitted,表示进程能使用的权限,cap_effective,是真正控制的权限,一个进程可以放弃一些权限 3.22 cap_inheritable 表示执行文件的可扩展属性设置了inheritable标志位时,调用exec执行该程序会继承调用者的inheritable集合,并将其加入permitted集合。只针对root用户 3.23 cap_bset capability bounding set ,系统中所有进程保留的权限,如果这个几个没有这个权限,所有进程都没有这个权限 3.24 cap_ambient非root用户使用exec执行程序的时候,cap_ambient会调价到cap_permitted和effective中,进程就有了这个程序的权限。4 内存管理数据结构mm_struct 5 文件系统数据结构 fs_struct和files_struct
    2019-08-15
  • 勤劳的小胖子-libo
    通过passwd来试验setUid很方便,谢谢一起学习的同志

    作者回复: 赞

    2019-05-12
  • LS
    由于 list_add(&subtask->sibling, &current->children); 文中的进程链表图是不是应该是 父进程的 children 指向的是 子进程的 sibling 而不是 子进程 task 结构体本身?

    作者回复: 指向task_struct,不过不用纠结呀,指向slibing也可以找到指向task_struct的指针,指向task_struct也可以找到指向sibling的指针

    2019-05-07
  • 青石
    请问老师,同一级的所有进程的sibling是指向同一块内存地址吗?

    作者回复: 不是啊,在一串链表上

    2019-04-25
  • tux
    时不时会用 htop和pidstat,进行辅助查看进程信息
    2019-04-25
  • kdb_reboot
    一个建议:最近几篇都在介绍概念,可否增加实际操作的案例

    作者回复: 一般前面是通过代码或者命令行进行实际操作,后面主要解析内核

    2019-04-25
  • 平少
    是使用strace -p 进程号 来获取进程的信息么
    2019-04-24
  • tiankonghewo
    学习了
    2019-04-24
  • sunsweet
    这么多双向循环链表
    2019-04-24
收起评论
25
返回
顶部