php 檢視檔案鎖定狀態 php檔案鎖死鎖怎麼辦

2021-10-22 22:11:33 字數 1206 閱讀 2473

什麼是死鎖

學過作業系統的通同學,都了解多執行緒的概念。在多執行緒中訪問公共資源,需要對資源加鎖。訪問結束後,釋放鎖。如果沒有釋放鎖,那麼下乙個執行緒來獲取資源的時候就會永遠都無法獲取資源的鎖,於是這個執行緒死鎖了。那麼cgi是多執行緒的公共資源訪問導致的死鎖嗎? 答案是no。

1. cgi 是單執行緒程序,通過ps 就能看到。(程序狀態 sl的才是多執行緒程序)。

2. 即使是多執行緒的,死鎖發生在php的shutdown過程中呼叫glibc 中time 函式的位置,不是php模組造成的。而glibc 中的time相關函式是執行緒安全的,不會產生死鎖。

什麼導致的死鎖呢?

通過分析linux中死鎖產生的機制,發現除了多執行緒會產生死鎖外,訊號處理函式同樣會產生死鎖。那麼cgi是由於訊號處理導致的死鎖嗎?在這之前介紹乙個感念。

函式的可重入性與訊號安全

函式可重入是指,無論第幾次進入該函式,函式都能正常執行並返回結果。那麼執行緒安全函式是可重入的嗎?答案是no。 執行緒安全函式,在第一次訪問公共資源時,會獲取全域性鎖。如果函式沒有執行完成,鎖還沒釋放,此時程序被中斷。那麼在中斷處理函式中,再次訪問該函式,就會產生死鎖。

那麼什麼樣的函式才可以在中斷處理函式中訪問呢?

除了沒有使用全域性鎖的函式,還有一些signal safe的系統呼叫可以使用。呼叫任何其他的非signal safe的函式都會產生不可預知的後果(比如 死鎖)。詳見 man signal。在分析死鎖的原因前,我們先看看cgi執行的流程,分析其中有沒有產生死鎖的可能。

php-cgi的執行流程

glibc中的時間函式使用到了全域性鎖,保證函式的執行緒安全,但沒***訊號安全(signal safe)。經過之前的分析,我們初步懷疑死鎖是由於php-cgi程序接收到了乙個訊號,然後在signal handle中執行了非signal safe的函式。主流程在中斷前,正在執行glibc中的時間函式。在函式獲取的鎖沒釋放前,進入中斷流程。而中斷過程中又訪問了glibc中的時間函式。於是導致了死鎖。

php-cgi的執行流程,如下圖所示:

解決辦法:

去掉或簡化qalarm註冊到shutdown中的鉤子函式。避免不安全的函式呼叫。

以上內容僅供參考!

php鎖定檔案

一 概念 1.共享鎖和排他鎖 共享鎖 s鎖 如果事務t對資料a加上共享鎖後,則其他事務只能對a再加共享鎖,不能加排他鎖。獲准共享鎖的事務只能讀資料,不能修改資料。排他鎖 x鎖 如果事務t對資料a加上排他鎖後,則其他事務不能再對a加任任何型別的封鎖。獲准排他鎖的事務既能讀資料,又能修改資料。2.共享鎖...

php 檔案鎖定詳解flock

檔案鎖定 檔案鎖定分四種型別 取得共享鎖定 從檔案中讀取資料時使用 取得獨佔鎖定 向檔案中寫入資料時使用 釋放鎖定 無論共享或獨佔鎖,都用它釋放 附加鎖定 如果不希望flock 在鎖定時堵塞,則應在上述鎖定後加上改鎖 向檔案內寫檔案 param filename param message func...

MySQL鎖定狀態檢視命令

show processlist顯示哪些執行緒正在執行。您也可以使用mysqladmin processlist語句得到此資訊。如果您有super許可權,您可以看到所有執行緒。否則,您只能看到您自己的執行緒 也就是,與您正在使用的mysql賬戶相關的執行緒 如果有執行緒在update或者insert...