http://www.highotel.com

                                                                  【江苏好运快三】php文件锁死锁怎么办-PHP问题

                                                                  什么是死锁

                                                                  学过操作系统的通同学,都了解多线程的概念。在多线程中访问公共资源,需要对资源加锁。访问结束后,释放锁。如果没有释放锁,那么下一个线程来获取资源的]时,候就会永远都无法获取资源的锁,于是这个线程死锁了。那么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 saf)e)。经过之前的分析,我们初步怀疑死锁是由于PHP-CGI进程接收到了一个信号,然后在signal handle中执行了非signal safe的函数。主流程在中断前,正在执行glibc中的时间函数。在函数获取的锁没释放前,进入中断流程。而中断过程中又访问了glibc中的时间函数。于是导致了死锁。

                                                                  PHP-CGI的执行流程,如下图所示:

                                                                  文件锁-2.jpg

                                                                  解决办法:

                                                                  去掉或简化qalarm注册到shutdown中的钩子(函数。避免不安全的函数调用。

                                                                  [

                                                                  以上内容仅供参考!

                                                                  推荐教程:PHP视频教程

                                                                  以上就是php文件锁死锁怎么办的详细内容,更多请关注php中文网其它相关文章!

                                                                1. 微信
                                                                2. 分享php中文网最新课程二维码相关标签:php 文件锁 死锁
                                                                3. 郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

                                                                  上一篇:忘记苹果iPhone/iPad锁屏密码怎么办?外媒支招
                                                                  下一篇:没有了