• why
    2019-04-22
    - 内核中进程, 线程统一为任务, 由 taks_struct 表示
    - 通过链表串起 task_struct
    - task_struct 中包含: 任务ID; 任务状态; 信号处理相关字段; 调度相关字段; 亲缘关系; 权限相关; 运行统计; 内存管理; 文件与文件系统; 内核栈;
    - 任务 ID; 包含 pid, tgid 和 \*group_leader
        - pid(process id, 线程的id); tgid(thread group id, 所属进程[主线程]的id); group_leader 指向 tgid 的结构体
        - 通过对比 pid 和 tgid 可判断是进程还是线程
    - 信号处理, 包含阻塞暂不处理; 等待处理; 正在处理的信号
        - 信号处理函数默认使用用户态的函数栈, 也可以开辟新的栈专门用于信号处理, 由 sas_ss_xxx 指定
        - 通过 pending/shared_pending 区分进程和线程的信号
    - 任务状态; 包含 state; exit_state; flags
        - 准备运行状态 TASK_RUNNING
        - 睡眠状态:可中断; 不可中断; 可杀
            - 可中断 TASK_INTERRUPTIBLE, 收到信号要被唤醒
            - 不可中断 TASK_UNINTERRUPTIBLE, 收到信号不会被唤醒, 不能被kill, 只能重启
            - 可杀 TASK_KILLABLE, 可以响应致命信号, 由不可中断与 TASK_WAKEKILL 组合
        - 停止状态 TASK_STOPPED, 由信号 SIGSTOP, SIGTTIN, SIGTSTP 与 SIGTTOU 触发进入
        - 调试跟踪 TASK_TRACED, 被 debugger 等进程监视时进入
        - 结束状态(包含 exit_state)
            - EXIT_ZOMBIE, 父进程还没有 wait()
            - EXIT_DEAD, 最终状态
        - flags, 例如 PF_VCPU 表示运行在虚拟 CPU 上; PF_FORKNOEXEC \_do_fork 函数里设置, exec 函数中清除
    - 进程调度; 包含 是否在运行队列; 优先级; 调度策略; 可以使用那些 CPU 等信息.
    展开
    
     31
  • 唐稳
    2019-05-01
    介绍的很详细,赞一个。
    有个问题一直纠结,信号处理函数到底是在哪个线程中运行的?

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

     1
     7
  • Egos
    2019-04-22
    看文章理解的task_struct 是Thread 的一个链表?

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

     1
     6
  • 积微致知
    2019-04-23
    老师好,有个疑惑所有的task_struct为什么用链表串联起来而不是用数组?
    数组在物理空间上必须要连续,而链表物理空间上可以不连续。
     2
     4
  • 第十人
    2019-04-22
    tgid和threadleader都是进程的主线程,那这两个参数不就重复了么?有其他的含义么?

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

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

    作者回复: 对的

    
     3
  • ECHOLOG
    2019-08-19
    举一反三一下,因为线程和进程都是task_struct表示的,所以有僵尸进程,那就有僵尸线程

    作者回复: 对的pthread_join

    
     2
  • 勤劳的小胖子-libo
    2019-05-11
    任何一个进程,如果只有主线程,那 pid 是自己,tgid 是自己,group_leader 指向的还是自己。

    但是有多个线程就不一样了,pid是这个子线程,tgid和group_leader都是指向主线程。

    好奇,tgid与group_leader不就相同作用吗?在上面的二种情况下,为什么需要二个相同功能的域?

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

    
     2
  • 勤劳的小胖子-libo
    2019-05-11
    应该是一个值,一个是指针用于快速访问吧。。

    作者回复: 对

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

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

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

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

    
     1
  • jueyoq
    2019-10-24
    1. 进程的标示 pid/tgid/group_leader 是用来方便区分任务是线程还是进程,而区分二者的需求来自远多维度的展示任务与向进程或者线程发送信号
    2. 进程的状态设定同样来源于两个需求, 监控统计任务的执行过程,以及调度任务。而任务的状态来自于处理任务的一般思路,创建一个任务,准备处理任务,处理任务,任务被搁置,任务被解决,同时为了可以更加细粒度的监控进程引入debug的状态。
    
    
  • sinfool
    2019-10-09
    ‘通过pid==tgid来判断是线程还是进程'这句话实在是不懂。如果是单线程,pid==tgid,没有问题;如果是多线程,当前线程如果是主线程,pid不是也等于tgid么?这怎么说?
    
    
  • kdb_reboot
    2019-09-24
    再次阅读,本章可以参考lkd(process management) 一起看
    
    
  • 计算机班陈公子
    2019-09-11
    老师有个问题就是在进程状态变成zombie后,他在等父进程调用wait() 来回收自己的空间是么?所以在回收完他的空间后他就彻底进入了EXIT_DEAD状态是么?可是为什么top命令下的S 栏里面没有dead这个状态,而只有R,S,D,T,Z这五个?
    另外在进程收到SIGTERM或者SIGKILL这样terminate类的信号时,进程也是进入了EXIT_DEAD状态么?
    
    
  • jijun gao
    2019-09-08
    打个卡:task_struct结构中,pid是线程id。从pid的名字来看,是process id, 即进程id. 此处,可以理解为,线程是轻量级的进程。tgid是线程所属进程的主线程id
    
    
  • 天王
    2019-08-14
    进程的数据结构1 进程和线程,1.1有的进程只有一个线程,有的有1.2 多个线程,都需要内核分配CPU来干活。在内核里进程和线程统称任务,数据结构都是task_struct。1.3 linux的任务管理都做什么用,1.31首先要有个任务链表,struct list_head,把所有任务串起来1.32 都有一个任务id,pid全称processid,tgid全称task group id,之所以要有pid和tgid,一是任务展示,二是给任务发指令 是给进程发还是某一个线程发 有了pid和tgid,用两者是否相等,就能知道是线程还是进程2 信号处理 task_struct 里面也有涉及信号处理的字段 sigset_t blocked定义了信号阻塞暂不处理,sigpending pending 哪些信号尚等待处理,哪些信号正在通过sighand函数进行处理,信号处理函数默认使用用户态的函数栈 3 进程调度 优先级,调度类sched_class,调度策略,调度实体sched_entity,4任务状态 在task_struct类中,state属性 TASK_RUNNIng 表示处于即将运行的状态,时间片切换到这个进程,就会立刻运行,睡眠状态有3种,Task_interruptible,可中断的睡眠状态,浅睡眠状态,信号来的时候被唤醒,处理函数可以自己定义,task_uninterruputible,不可唤醒的睡眠状态,死等io操作,task_killabe收到致命信号可以被唤醒,task_track表示进程被其他进程监视,进程执行被调试进程所终止,一个进程结束要先进入exit_zomble状态,如果他的父进程还没有使用wait等系统调用获取终止信息,该进程就成了僵尸进程。exit_dead是进程的最终状态。调度还有一些标志以PF开头,pf_exiting表示正在退出,pf_vcpu表示运行在虚拟cpu上。
    展开
    
    
  • ...
    2019-08-12
    从定义的数值很容易看出来,flags 是通过 bitset 的方式设置的也就是说,当前是什么状态,哪一位就置一。 结合上下文发现是不是笔误,flags应该改成state

    作者回复: 你是对的,是state

    
    
  • kdb_reboot
    2019-07-22
    实在是不理解为什么那么多人问"为什么用链表而不是数组..."
    补充: 本节讲的内容在sched.h里面, 思考题完全可以搜一下这个"task->state"

    作者回复: 赞

    
    
  • garlic
    2019-06-29
    目前理解的, 任务状态主要在TASK_RUNNING, TASK_INTERRUPTIBLE, TASK_UNINTERRUPTIBLE, TASK_KILLABLE间互相转换, 其他一些状态TASK_PARKED,TASK_NEW为了解决相关问题引入的。 学习笔记https://garlicspace.com/2019/06/29/linux任务状态定义/

    作者回复: 赞

    
    
我们在线,来聊聊吧