Viv*_*rma 2 c linux operating-system kernel
内核中的谁负责杀死进程.
如果出现"kill"并且进程处于阻塞状态该怎么办?是否等待直到进程运行状态才能清理自己.
如果有人可以在内核方面回答更多问题,比如生成kill命令的SIGINT,那么内核会调用所有内容,直到最后清除TCB(任务控制块)为止.
我认为你在谈论SIGKILL,所以我只会将讨论局限于那个信号.
当进程在另一个进程上引发SIGKILL时,SIGKILL将作为挂起信号添加到受害进程,并清除任何挂起的SIGSTOP,SIGTSTP,SIGTTOU或SIGTTIN信号.如果受害者停止或处于可中断的睡眠状态,则受害者被唤醒(可运行).
当受害者进程下一次尝试从内核模式进入用户模式时,将检查待处理信号.这是找到挂起的SIGKILL的地方,内核调用do_exit()而不是返回用户模式.
从内核模式到用户模式的转换将是下一次安排进程的时间(除非它处于不间断的睡眠状态 - 这是臭名昭着的D状态).如果它处于不可饶恕的睡眠状态,则该过程将不会尝试返回用户模式,直到它被唤醒.
使用SIGKILL以外的信号杀死它只会导致发送信号.这可以被屏蔽或忽略,但假设它不是(或在它未被屏蔽之后),则它会中断程序的正常运行.
如果正在进行IPC类型的系统调用(例如,从套接字读取,选择(),poll(),sleep()等),那么它将被中断并在errno中使用EINTR失败.正确编写的应用程序将在处理信号后重新发出呼叫.
然后,该进程立即执行对信号处理程序的调用,该处理程序可以返回以允许处理继续,或者它可以调用longjmp(在C中),或者它可以退出进程,这通常是默认的.
SIGKILL完全不同,以上都不会发生.相反,它只是退出系统调用(如果允许进程读取它,可能会将EINTR保留在errno中),然后导致任务立即退出而无法处理它.
但是我认为其中任何一个都要等待"D""不间断睡眠"状态才能完成.这通常类似于阻塞盘读取,页面错误需求加载等.
归档时间: |
|
查看次数: |
1422 次 |
最近记录: |