【深入workerman的信号机制】研究下PCNTL扩展源码
【1】深入workerman信号机制
这个话题是本人《深入PHP内核源码》视频教程里的一个插录环节,剖析扩展源码的细节移步B站。
【2】研究背景
workerman内核实现有依赖PCNTL扩展,这是因为涉及到信号编程,其中局部依赖了pcntl_signal()和 pcntl_signal_dispatch() 这两个函数,至今社区对这个话题的讨论热度依旧不减,但是这种机制有个缺陷:性能倒不低,主要是需要用户空间不断的轮询,所以PHP7.1+高版本提供了新的机制:即异步处理信号的函数pcntl_async_signals(), 我们感兴趣的是这三个函数在底层到底是怎么工作的? 为了揭开其背后的的工作真相,所以很有必要研究一下其对应的C源码实现,这有助于我们进行科学的信号编程,也有助于理解workerman的相关实现细节。
【3】分析手段
- 先一行一行的剖析其C源码实现。
- 本人对源码进行了微小改动,仅用于基础调试。
- 最后再用GDB跟踪调试一遍。
【4】得出结论
- pcntl_signal:只是安装了(PHP上层空间)信号处理器,仅此而已。
注意:当且仅当接收到信号时(由PHP内核空间的信号处理器)将信号拦截入队。
- pcntl_signal_dispatch:
(PHP上层空间)信号处理器不会自动执行,必须手动调用本函数以处理待决信号。
- 异步处理信号机制:完全是由PHP内核来监管的,触发时机发生在执行栈切换瞬间。
- 该扩展一定程度上解决了(非可靠)信号丢失的问题,至少目前研究的版本并没有彻底解决。
个评论
年代过于久远,无法发表评论
大佬辛苦了,受教了。