linux在杀死进程时是否释放自旋锁/信号量?

linux在杀死进程时是否释放自旋锁/信号量?,linux,semaphore,spinlock,kill-process,process-exit,Linux,Semaphore,Spinlock,Kill Process,Process Exit,如果进程持有一些自旋锁或信号量,并且意外退出(例如被linux杀死),linux会正确释放这些锁吗? 如果linux不能做到这一点,为什么?这取决于您所说的锁的类型 如果您谈论的是任何类型的内核内部锁,它们将被适当地释放(否则您的系统将很快崩溃)。通常,这些类型的锁不属于进程本身,而是属于某些内部内核工作流,并且通常在进程返回到用户空间后不会保持锁定 但是,请注意,如果在发出kill命令时内核已经死锁,那么进程很可能不会被终止。进程终止作为信号处理路径的一部分执行,该路径从内核到用户空间返回转换

如果进程持有一些自旋锁或信号量,并且意外退出(例如被linux杀死),linux会正确释放这些锁吗?
如果linux不能做到这一点,为什么?

这取决于您所说的锁的类型

如果您谈论的是任何类型的内核内部锁,它们将被适当地释放(否则您的系统将很快崩溃)。通常,这些类型的锁不属于进程本身,而是属于某些内部内核工作流,并且通常在进程返回到用户空间后不会保持锁定

但是,请注意,如果在发出kill命令时内核已经死锁,那么进程很可能不会被终止。进程终止作为信号处理路径的一部分执行,该路径从内核到用户空间返回转换代码调用。如果进程正在等待内核自旋锁,您将永远无法进入返回代码,因此进程将不会退出

此外,如果进程因为内核OOPS而被终止,那么所有的赌注都是无效的——内核已经处于不一致的状态,并且OOPS退出代码不会试图清除内核线程当时可能持有的任何锁

如果您谈论的是任何类型的用户空间自旋锁或信号量(包括IPC信号量家族),则不会发布,因为没有关于信号量的锁所有权的概念

如果您谈论的是文件锁或建议锁的家族,那么当在该过程中绑定到文件的任何文件描述符关闭时,它们将自动释放。正因为如此,
flock
在大多数情况下使用是一个坏主意,但是如果进程被终止,它将被释放

如果您谈论的是一个本地进程,这是没有意义的,因为互斥锁将随着进程一起消失


如果您谈论的是共享内存段中的共享
pthread_mutex
(用于使其可共享的内存段),则只有当它也被标记为健壮的互斥体时,才会自动释放,带有-但必须在重新使用之前将其标记为一致;有关详细信息,请参阅手册页。

如果您对Linux体系结构感兴趣,因为它与同步机制有关,您可能希望了解futex系统调用的工作原理(“man 7 futex”、“man 2 futex”)。PHTURED_互斥和sem_wait在阻塞情况下都是用futex实现的。非常感谢。我说的是内核内部锁,因为我们想减轻系统锁定错误。当发生错误时,这些锁会产生影响,尤其是自旋锁(非常具有破坏性)@silverbullet,如果出现内核死锁,则实际上无法杀死所涉及的进程-杀死进程需要退出内核转换,因为SIGKILL信号是在内核到用户空间的退出代码路径中处理的。由于进程处于死锁状态,它甚至不会走那么远。是的,信号将仅在内核到用户空间的退出代码路径中处理,因此我们计划采用非传统的方法——Linux内核提供一个force_sig(),如果该函数能够按照我们的预期工作(向进程发送信号并唤醒它),“银弹,不,那不行。线程(或进程)退出总是在内核线程绑定到线程的情况下发生,这正是为了确保所有锁都被释放,并且它所操作的任何数据结构都处于干净状态
force_sig
仅绕过用户空间信号忽略;它还必须经过所有其他正常处理。这里唯一真正的解决方案是首先修复导致问题的死锁。如果我向进程发送SIGKILL,然后使用wake\u up\u process()立即唤醒它,它能工作吗?