Linux 终止进程--从allproc列表到zombieproc列表的转换

Linux 终止进程--从allproc列表到zombieproc列表的转换,linux,unix,operating-system,freebsd,Linux,Unix,Operating System,Freebsd,进程是如何终止的?假设一个进程有三个线程a、B和C。现在,当我们向进程发送SIG_KILL信号时。到目前为止一切正常,现在每个进程的结构中都有exit status字段!因此,当一个进程被发送一个终止信号时,我的理解是它被发送到所有线程。线程在陷入内核时也会被杀死。如果它正在内核中读取,那么它将在退出内核时退出。如果线程处于睡眠状态,那么当它醒来时就会退出。我的理解是正确的还是我误解了/遗漏了什么 如果我的理解是正确的,什么时候一个进程被放入僵尸列表?当所有线程退出时,还是在收到终止信号时 假设

进程是如何终止的?假设一个进程有三个线程a、B和C。现在,当我们向进程发送SIG_KILL信号时。到目前为止一切正常,现在每个进程的结构中都有exit status字段!因此,当一个进程被发送一个终止信号时,我的理解是它被发送到所有线程。线程在陷入内核时也会被杀死。如果它正在内核中读取,那么它将在退出内核时退出。如果线程处于睡眠状态,那么当它醒来时就会退出。我的理解是正确的还是我误解了/遗漏了什么

如果我的理解是正确的,什么时候一个进程被放入僵尸列表?当所有线程退出时,还是在收到终止信号时

假设一个进程有三个线程a、B和C

嗯。我假设是现代Linux,内核支持线程(Linux2.6+glibc>2.3)

然后进程(或线程组)由3个线程组成(或者,有3个线程具有不同的
tid
s和相同的
tgid
=PID)

现在,当我们向进程发送SIG_KILL信号时

因此,在这里使用
tgid
(PID)。嗯

现在每个进程的结构中都有退出状态字段

什么?是的,但终止和退出线程组有一个特殊的代码,可以将正确的退出代码发送给服务员。对于杀戮,退出状态为从信号获取;对于退出(syscall sys\u group\u exit),它是syscall的参数

因此,当一个进程被发送一个终止信号时,。。。它被发送到所有线程

没有

基本上可以有两种信号:

  • 进程范围-它将被交付到进程中的任何线程
  • 线程(无法正确命名)-由
    tid
    传递到某个线程,而不是另一个线程
  • 所以,SIGKILL是进程范围的,它将杀死整个进程。它被传送到某个线程

    当内核传递此信号时,它将调用
    do\u group\u exit()
    函数(从调用),以终止线程组(进程中)中的所有线程

    有一个
    zap_other_threads()
    函数来迭代所有线程并杀死它们(通过重新发送线程来杀死它们)

    进程何时放入僵尸列表

    do_exit()
    内核函数调用之后。它有一个
    tsk->state=TASK\u DEAD末尾的行

    当所有线程退出时,还是在收到终止信号时

    任务将其状态设置为task_DEAD的时刻是在接收到SIGKILL之后。此时,此信号已重新传递给进程的所有线程。找不到线程的实际退出时间,但所有线程都有一个挂起致命信号的标志,因此它们将在任何重新调整时被杀死


    更新:必须终止进程的所有线程(必须接收终止信号并进行清理),因为它们在第一个线程中积累了一些记帐信息(这里首先提到的不是第一个启动的线程,而是获得原始进程范围SIGKILL的线程;或者是调用
    exit\u组
    syscall的线程)。第一个线程必须等待所有其他线程;并且只有在这之后它才会更改状态。

    在FreeBSD中,僵尸进程不能执行任何代码。因此,在这一点之前,所有需要濒死进程执行的操作都会被执行。如果在ps(1)中看到处于这种状态的进程(通常仅当它卡住时),它有一个通常的状态,如D、S、R或I,并附加了E(尝试退出)

    信号被传递到一个线程(特定线程或任何线程,取决于信号的生成方式)。终止进程的动作(各种信号的默认动作)具有进程全局效应。发生的事情之一是选择传递信号的线程(或称为_exit(2))的线程)请求所有其他线程退出


    线程在内核级别没有退出状态;通过pthread_join()可用的值是一个userland功能。

    我不完全理解这一点,但我添加了一些想法作为答案。如果有什么不清楚的地方,请发表评论。如果有一个词我必须描述这个答案,它将是“棒极了”@Karthick,我必须提到,这个答案并不完整。所以,如果你有更多关于linux内核的问题,请用“@osgx”评论邀请我。我很有兴趣深入研究linux内核代码,在这些问题之后,我知道的比以前更多。)