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

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

PF_FORKNOEXEC
PF_VCPU
PF_EXITING
sched_info
cpus_allowed
nr_cpus_allowed
policy
dl
rt
se
sched_class
rt_priority
normal_prio
static_prio
prio
on_rq
flags
exit_state
state
sas_ss_flags
sas_ss_size
sas_ss_sp
pending
saved_sigmask
real_blocked
blocked
sighand
signal
group_leader
tgid
pid
进程调度
任务状态
信号处理
任务ID
任务列表
task_struct
任务管理
课堂练习
项目管理系统
进程数据结构

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

前面两节,我们讲了如何使用系统调用,创建进程和线程。你是不是觉得进程和线程管理,还挺复杂的呢?如此复杂的体系,在内核里面应该如何管理呢?
有的进程只有一个线程,有的进程有多个线程,它们都需要由内核分配 CPU 来干活。可是 CPU 总共就这么几个,应该怎么管理,怎么调度呢?你是老板,这个事儿得你来操心。
首先,我们得明确,公司的项目售前售后人员,接来了这么多的项目,这是个好事儿。这些项目都通过办事大厅立了项的,有的需要整个项目组一起开发,有的是一个项目组分成多个小组并行开发。无论哪种模式,到你这个老板这里,都需要有一个项目管理体系,进行统一排期、统一管理和统一协调。这样,你才能对公司的业务了如指掌。
那具体应该怎么做呢?还记得咱们平时开发的时候,用的项目管理软件 Jira 吧?它的办法对我们来讲,就很有参考意义。
我们这么来看,其实,无论是一个大的项目组一起完成一个大的功能(单体应用模式),还是把一个大的功能拆成小的功能并行开发(微服务模式),这些都是开发组根据客户的需求来定的,项目经理没办法决定,但是从项目经理的角度来看,这些都是任务,需要同样关注进度、协调资源等等。
同样在 Linux 里面,无论是进程,还是线程,到了内核里面,我们统一都叫任务(Task),由一个统一的结构 task_struct 进行管理。这个结构非常复杂,但你也不用怕,我们慢慢来解析。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文以项目管理系统为比喻,介绍了Linux内核中进程数据结构的管理方式。作者将进程和线程比作项目和小组,通过task_struct结构来管理任务。文章首先讨论了任务ID的管理,包括pid、tgid和group_leader字段的作用。然后详细讨论了任务状态的管理,包括不同状态的含义和相应的处理方式。进一步介绍了进程调度相关的字段,包括进程在运行队列上的状态、优先级、调度器类、调度实体等。通过生动的比喻和清晰的技术解释,读者可以初步了解Linux内核中任务的管理方式,以及进程和线程的区别和联系。整体而言,本文通过深入浅出的方式,帮助读者快速了解进程数据结构的管理方式,为进一步深入学习提供了良好的基础。

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

全部留言(52)

  • 最新
  • 精选
  • 第十人
    tgid和threadleader都是进程的主线程,那这两个参数不就重复了么?有其他的含义么?

    作者回复: 一个是id,一个是指针,只知道ID,不得一个个找么

    2019-04-22
    2
    19
  • 唐稳
    介绍的很详细,赞一个。 有个问题一直纠结,信号处理函数到底是在哪个线程中运行的?

    作者回复: 不在任何一个线程中,后面会详细解析信号处理的过程

    2019-05-01
    2
    16
  • ECHOLOG
    举一反三一下,因为线程和进程都是task_struct表示的,所以有僵尸进程,那就有僵尸线程

    作者回复: 对的pthread_join

    2019-08-19
    15
  • 勤劳的小胖子-libo
    任何一个进程,如果只有主线程,那 pid 是自己,tgid 是自己,group_leader 指向的还是自己。 但是有多个线程就不一样了,pid是这个子线程,tgid和group_leader都是指向主线程。 好奇,tgid与group_leader不就相同作用吗?在上面的二种情况下,为什么需要二个相同功能的域?

    作者回复: 一个是id,一个是地址,有地址就能直接找到了

    2019-05-11
    9
  • Egos
    看文章理解的task_struct 是Thread 的一个链表?

    作者回复: 进程和线程在一起的链表

    2019-04-22
    2
    9
  • 一笔一画
    老师,请教一下,之前看书上说用户进程和内核线程是多对多的模型?这个怎么理解,我们常用的发行版又是什么样的模型?

    作者回复: 操作系统的理论是有多种模型的,多对一,一对一,多对多,Linux是一对一。

    2019-04-23
    8
  • 中翅Lzc
    如果进程创建了其他多个线程,那么tpid就是主线程id,pid就是其他线程id了,两者肯定不相等啊

    作者回复: 对的

    2019-04-22
    7
  • Dracula
    老师好,有个疑惑所有的task_struct为什么用链表串联起来而不是用数组

    作者回复: 很多插入和删除

    2019-04-22
    6
  • fangxuan
    如果一个进程只有主线程,那么task_struct是一个还是两个?如果是一个还好,这个task_struct既代表进程也代表主线程;如果是两个,进程的pid,tgid都指向自己,那怎么知道主线程是谁?

    作者回复: 一个。

    2019-05-09
    5
  • jnh1983
    源码是:include/linux/sched.h 老师把代码归纳了一下,方便理解

    作者回复: 赞

    2020-05-27
    2
    4
收起评论
显示
设置
留言
52
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部