exec* 函数如何管理多线程进程?

问题描述 投票:0回答:1

在 POSIX 标准中,在线程中调用

exec*
会导致整个进程被新进程替换,从而导致进程的所有线程终止。

但是

exec*
如何终止所有线程呢?我在网上搜索了“如何杀死Python中的所有线程”。但我得到的所有答案都需要首先拥有线程句柄(简单地说,如果我没有引用线程,我就无法杀死它)。

而且,在多核CPU中,一个进程的不同线程可以同时运行在不同的物理核心上。那时,在一个核心上,如果内核正在执行

exec*
,此时在另一个核心上执行的线程会发生什么?它会简单地尝试执行下一条指令,但由于它的进程映像被内核覆盖,它会收到 SIGILL 吗?在这种情况下,如果线程正在处理该信号并且没有退出,会发生什么?

相反,如果内核杀死所有其他线程作为预防措施,然后它发现由于某些错误(找不到可执行文件等)而无法启动新进程,那么它必须恢复进程的原始状态并返回设置了 errno。它如何重新创建被杀死的线程?

multithreading multiprocessing kernel exec
1个回答
0
投票

exec* 如何终止所有线程?我在网上搜索了“如何杀死Python中的所有线程”。但我得到的所有答案都需要首先拥有线程句柄(简单地说,如果我没有引用线程,我就无法杀死它)。

操作系统知道它管理的所有线程的身份。如果存在任何“绿色”线程(完全由程序自己的代码管理的线程),那么这些线程将与程序状态的所有其余部分一起被删除。

在多核CPU中,一个进程的不同线程可以同时运行在不同的物理核心上。当时,在一个核心上,如果内核正在执行 exec* 此时在另一个核心上执行的线程会发生什么?

线程将被中断——就像它在时间片结束时被中断一样,只不过这次中断永远不会返回。

如果内核杀死所有其他线程作为预防措施,后来发现由于某些错误(找不到可执行文件等)而无法启动新进程,那么它必须恢复进程的原始状态并返回并设置 errno 。它如何重新创建被杀死的线程?

事实并非如此。 execve

 手册页说,

in (rare) cases (typically caused by
resource exhaustion), failure may occur past the point of no
return: the original executable image has been torn down, but the
new image could not be completely built.  In such cases, the
kernel kills the process with a SIGSEGV (SIGKILL until Linux
3.17) signal.
© www.soinside.com 2019 - 2024. All rights reserved.