下内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发!如果您有其他想要了解的,欢迎私信联系我~
僵尸进程
父进程未回收子进程资源 当一个子进程终止时,会向其父进程发送一个 SIGCHLD 信号,向父进程通知其退出状态。如果父进程没有调用 wait() 或 waitpid() 来读取子进程的退出状态并回收资源,子进程就会成为僵尸进程 父进程先于子进程结束 当一个子进程还未终止时,其父进程先于该子进程结束,则该子进程会变为孤儿进程,进而产生僵尸进程 比较特殊的是,孤儿进程可以被系统的 init 进程(进程号为 1)接管,init 进程可以清理这些孤儿进程产生的僵尸进程
进程状态
在 Linux 系统中,进程(Process)和线程(Thread)均由 task_struct{} 结构表示。
task_struct{} 结构实质上表示任务(Task),是 Linux 系统中调度的基本单位,通常为了简明将其统称为进程。
Linux 进程从创建(Fork)到终止(Exit)的状态转换过程如下图。
运行状态 (Running State) 运行状态通常表明进程可能处于以下两种情况 进程正在运行中(已经获取到 CPU 资源) 进程位于运行队列中(已经就绪,随时可以运行) 通过 ps ef 命令查看时,处于该状态的进程具有 “R” 标识 休眠状态 (Sleeping State) 休眠状态通常表明进程正在等待特定资源(如磁盘 I/O),可以细分为 2 种子状态 TASK_INTERRUPTIBLE:该状态可以中断。通过 ps ef 命令查看时,处于该状态的进程具有 “S” 标识 TASK_UNINTERRUPTIBLE:该状态无法中断。通过 ps ef 命令查看时,处于该状态的进程具有 “D” 标识
EXIT_DEAD:此状态表示进程真正退出的时间 EXIT_ZOMBIE:此状态就在 EXIT_DEAD 之前发生,这就是通常所说的 zombie 进程
书籍推荐