当它杀死一个进程时,Linux释放spinlock /信号量?

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

这取决于你正在谈论的锁的类型。

如果你正在讨论任何类型的内核内部锁,它们将会在适当的时候被释放(否则你的系统很快就会崩溃)。 一般来说,这些类型的锁不是由进程本身所拥有,而是由内部的内核工作流所拥有,通常在进程返回到用户空间后不会保持锁定状态。

但是,请注意,如果在发出kill时内核已经死锁,那么进程将不会被终止。 进程查杀作为信号处理路径的一部分执行,从内核到用户空间的返回转换代码被调用。 如果进程正在等待内核螺旋锁,那么您将永远不会将其传递给返回代码,因此进程将不会退出。

此外,如果进程因为内核OOPS而被终止,那么所有的投注都关闭 – 内核已经处于不一致的状态,OOPS退出代码不会尽力清理内核线程可能已经发生的任何锁在当时举行。

如果你正在讨论任何类型的用户空间自旋锁或信号量(包括IPC信号量的sem_*系列),否则不会被释放,因为没有信号量的锁拥有的概念。

如果您正在讨论fcntl(F_SETLK, ...)文件锁定或fcntl(F_SETLK, ...)建议锁定,那么当绑定到该进程中的文件的任何文件描述符关闭时,它们将自动释放。 正因为如此,在大多数情况下使用flock是一个不好的主意,但是,如果这个过程被杀死的话,它会被释放。

如果你正在谈论一个进程本地的pthread_mutex ,那么这个进程是互斥的,因为互斥将不再存在。

如果您正在讨论共享内存段(其中pthread_mutexattr_setpshared已被用于使其可共享)中的共享pthread_mutexattr_setpshared ,则只有在它也被标记为可靠互斥的情况下才会自动释放pthread_mutexattr_setrobust – 但它必须是重复使用前标记一致; 有关详细信息,请参阅pthread_mutex_consistent联机帮助页。