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