-10 +

Process management

Process tree in Linux

进程和线程的实现是通过通用数据结构 task_struct(include/linux/sched.h), 进程中的第一个线程被叫做 task 组 leader,其他线程通过 thread_node 节点来连接。 通过 task_struct 来引用,也就是 task_struct 是 task 组 leader。 子进程通过 parent 指针来引用父进程,通过 sibling 来链接其他节点。 父进程通过 children 来链接子节点。

task_struct 对象中的关系如下图:

task_struct 一些重要的属性:

Lifetime of a process

下图是一个进程的生命周期和相应的探针点:

Unix 进程生成分为两个阶段:

当调用 exit() 系统调用,子进程将结束。 但是,进程也可以会被 killed,当 kernel 出现不正确的条件(引发 kernel oops) 或者机器错误。 如果父进程像等待子进程结束,这个可以调用 wait() 系统调用(或者 waitid()), wait() 调用将收到进程的退出码,随后关联的 task_struct 将被销毁。 如果父进程不像等待子进程,子进程退出后,这个将被作为僵尸进程。 父进程可能会收到 kernel 发送的 SIGCHLD 信号。

参考

关于我

85 后程序员, 比较熟悉 Java,JVM,Golang 相关技术栈, 关注 Liunx kernel,目前痴迷于分布式系统的设计和实践。 研究包括但不限于 Docker Kubernetes eBPF 等相关技术。

Blog

Code

Life

Archive