【深入workerman的信號機制】研究下PCNTL擴展源碼
【1】深入workerman信號機制
這個話題是本人《深入PHP內(nèi)核源碼》視頻教程里的一個插錄環(huán)節(jié),剖析擴展源碼的細節(jié)移步B站。
【2】研究背景
workerman內(nèi)核實現(xiàn)有依賴PCNTL擴展,這是因為涉及到信號編程,其中局部依賴了pcntl_signal()和 pcntl_signal_dispatch() 這兩個函數(shù),至今社區(qū)對這個話題的討論熱度依舊不減,但是這種機制有個缺陷:性能倒不低,主要是需要用戶空間不斷的輪詢,所以PHP7.1+高版本提供了新的機制:即異步處理信號的函數(shù)pcntl_async_signals(), 我們感興趣的是這三個函數(shù)在底層到底是怎么工作的? 為了揭開其背后的的工作真相,所以很有必要研究一下其對應的C源碼實現(xiàn),這有助于我們進行科學的信號編程,也有助于理解workerman的相關實現(xiàn)細節(jié)。
【3】分析手段
- 先一行一行的剖析其C源碼實現(xiàn)。
- 本人對源碼進行了微小改動,僅用于基礎調(diào)試。
- 最后再用GDB跟蹤調(diào)試一遍。
【4】得出結論
- pcntl_signal:只是安裝了(PHP上層空間)信號處理器,僅此而已。
注意:當且僅當接收到信號時(由PHP內(nèi)核空間的信號處理器)將信號攔截入隊。
- pcntl_signal_dispatch:
(PHP上層空間)信號處理器不會自動執(zhí)行,必須手動調(diào)用本函數(shù)以處理待決信號。
- 異步處理信號機制:完全是由PHP內(nèi)核來監(jiān)管的,觸發(fā)時機發(fā)生在執(zhí)行棧切換瞬間。
- 該擴展一定程度上解決了(非可靠)信號丟失的問題,至少目前研究的版本并沒有徹底解決。
個評論
年代過于久遠,無法發(fā)表評論
大佬辛苦了,受教了。