如果一個進程持有一些自旋鎖或信號量並意外退出(例如,被linux殺死),linux會正確釋放這些鎖嗎? 如果linux不做這項工作,爲什麼?當殺死進程時,linux是否釋放了自旋鎖/信號量?
回答
這取決於你正在談論的鎖的類型。
如果您正在討論任何類型的內核內部鎖,它們將在適當時候發佈(因爲您的系統很快就會崩潰)。通常,這些類型的鎖不是由進程本身所擁有,而是由內部的內核工作流程擁有,並且通常在進程返回到用戶空間後不會保持鎖定狀態。
但是請注意,如果內核是已經死鎖了,當你發出kill的時候,機會是不會被殺死的。進程查殺是作爲信號處理路徑的一部分執行的,該路徑是從內核到用戶空間的返回轉換代碼調用的。如果進程正在等待內核螺旋鎖,那麼您將永遠不會返回代碼,因此進程不會退出。
此外,如果進程因內核OOPS而被終止,則所有投注都關閉 - 內核已處於不一致的狀態,並且OOPS退出代碼不會盡力清理內核中的任何鎖線程可能一直在等待。
如果您正在討論任何類型的用戶空間自旋鎖或信號量(包括IPC信號量的sem_*
系列),否則它們不會被釋放,因爲沒有信號量的鎖擁有概念。
如果你在談論的flock
家庭文件鎖定,或fcntl(F_SETLK, ...)
諮詢鎖的,他們將被自動時綁定到該進程的文件任何同時關閉文件釋放。因此,在大多數情況下使用flock
是個不錯的主意,但是,如果進程被終止,它將被釋放。
如果你正在談論一個進程本地pthread_mutex
,它是沒有意義的,因爲互斥將隨着進程停止存在。
如果你在談論的共享內存段(在其中pthread_mutexattr_setpshared
已經使用,使它可共享)的共享pthread_mutex
,它會自動釋放,只有當它也被標記爲一個強大的互斥體,以pthread_mutexattr_setrobust
- 但在重新使用之前必須標註一致;有關詳細信息,請參閱pthread_mutex_consistent
聯機幫助頁。
非常感謝。我在談論內核內部鎖,因爲我們想解除系統鎖定錯誤。並且這些類型的鎖在發生某些錯誤時會發生衝突,特別是自旋鎖(非常具有破壞性!!) – silverbullettt 2012-03-25 14:47:18
@silverbullet,如果您有內核死鎖,您實際上無法殺死涉及的進程 - 殺死進程需要退出內核轉換,因爲SIGKILL信號在內核到用戶空間的退出代碼路徑中處理。由於這個過程陷入僵局,它甚至不會那麼做。 – bdonlan 2012-03-25 21:14:43
是的,信號只會在內核到用戶空間的退出代碼路徑中處理,所以我們打算採取非常規的意思 - Linux內核提供了一個force_sig(),如果這個函數可以按照我們的期望工作(發送一個發信號給一個進程並喚醒它),比我們解決它。 – silverbullettt 2012-03-26 00:48:15
- 1. Linux信號量:自旋鎖或信號?
- 2. 即使許可證被釋放,信號量類是否可以進入死鎖?
- 3. 當父進程被「kill -9」殺死時,子進程是否也會被殺死?
- 4. 殺死進程後釋放COM端口
- 5. Linux中的自動殺死進程
- 6. 殺死Linux進程剛跑
- 7. 在linux中殺死和信號問題
- 8. 在釋放線程時出現死鎖
- 9. 殺死進程殺死其他進程
- 10. IDirect3DDevice9釋放死鎖
- 11. windows批量殺死進程
- 12. apache是否會殺死我的進程?
- 13. 殺死Mercurial(hg)進程是否安全?
- 14. VB.NET自動進程殺死?
- 15. 如何殺死Linux中沒有被殺死的進程
- 16. 信號燈死鎖
- 17. 殺死進程
- 18. 殺死進程
- 19. 殺死進程
- 20. 當主進程突然死亡時,我該如何殺死linux spawnProcess?
- 21. 在linux中殺死一個進程
- 22. 在Linux中殺死殭屍進程
- 23. Linux殺死進程kill -9 PID
- 24. 在Linux上檢查殺死進程
- 25. linux腳本殺死java進程
- 26. Linux - 如何殺死Kibana進程
- 27. 信號並殺死ç
- 28. 當應用程序死亡時殺死外部進程
- 29. 從信號處理程序中殺死子進程
- 30. 當系統重新啓動時,信號量是否會被刪除(或釋放)?
如果您對Linux架構感興趣,因爲它涉及同步機制,您可能需要查看futex系統調用的工作方式(「man 7 futex」,「man 2 futex」)。 phtread_mutex和sem_wait都是在阻塞情況下用futex實現的。 – 2012-03-25 04:12:02