2012-03-19 45 views
3

如果一個進程持有一些自旋鎖或信號量並意外退出(例如,被linux殺死),linux會正確釋放這些鎖嗎? 如果linux不做這項工作,爲什麼?當殺死進程時,linux是否釋放了自旋鎖/信號量?

+1

如果您對Linux架構感興趣,因爲它涉及同步機制,您可能需要查看futex系統調用的工作方式(「man 7 futex」,「man 2 futex」)。 phtread_mutex和sem_wait都是在阻塞情況下用futex實現的。 – 2012-03-25 04:12:02

回答

8

這取決於你正在談論的鎖的類型。

如果您正在討論任何類型的內核內部鎖,它們將在適當時候發佈(因爲您的系統很快就會崩潰)。通常,這些類型的鎖不是由進程本身所擁有,而是由內部的內核工作流程擁有,並且通常在進程返回到用戶空間後不會保持鎖定狀態。

但是請注意,如果內核是已經死鎖了,當你發出kill的時候,機會是不會被殺死的。進程查殺是作爲信號處理路徑的一部分執行的,該路徑是從內核到用戶空間的返回轉換代碼調用的。如果進程正在等待內核螺旋鎖,那麼您將永遠不會返回代碼,因此進程不會退出。

此外,如果進程因內核OOPS而被終止,則所有投注都關閉 - 內核已處於不一致的狀態,並且OOPS退出代碼不會盡力清理內核中的任何鎖線程可能一直在等待。

如果您正在討論任何類型的用戶空間自旋鎖或信號量(包括IPC信號量的sem_*系列),否則它們不會被釋放,因爲沒有信號量的鎖擁有概念。

如果你在談論的flock家庭文件鎖定,或fcntl(F_SETLK, ...)諮詢鎖的,他們將被自動時綁定到該進程的文件任何同時關閉文件釋放。因此,在大多數情況下使用flock是個不錯的主意,但是,如果進程被終止,它將被釋放。

如果你正在談論一個進程本地pthread_mutex,它是沒有意義的,因爲互斥將隨着進程停止存在。

如果你在談論的共享內存段(在其中pthread_mutexattr_setpshared已經使用,使它可共享)的共享pthread_mutex,它會自動釋放,只有當它也被標記爲一個強大的互斥體,以pthread_mutexattr_setrobust - 但在重新使用之前必須標註一致;有關詳細信息,請參閱pthread_mutex_consistent聯機幫助頁。

+0

非常感謝。我在談論內核內部鎖,因爲我們想解除系統鎖定錯誤。並且這些類型的鎖在發生某些錯誤時會發生衝突,特別是自旋鎖(非常具有破壞性!!) – silverbullettt 2012-03-25 14:47:18

+0

@silverbullet,如果您有內核死鎖,您實際上無法殺死涉及的進程 - 殺死進程需要退出內核轉換,因爲SIGKILL信號在內核到用戶空間的退出代碼路徑中處理。由於這個過程陷入僵局,它甚至不會那麼做。 – bdonlan 2012-03-25 21:14:43

+0

是的,信號只會在內核到用戶空間的退出代碼路徑中處理,所以我們打算採取非常規的意思 - Linux內核提供了一個force_sig(),如果這個函數可以按照我們的期望工作(發送一個發信號給一個進程並喚醒它),比我們解決它。 – silverbullettt 2012-03-26 00:48:15