什么是死锁

学过操作系统的通同学,都了解多线程的概念。在多线程中访问公共资源,需要对资源加锁。访问结束后,释放锁。如果没有释放锁,那么下一个线程来获取资源的时候就会永远都无法获取资源的锁,于是这个线程死锁了。那么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 查看文件锁定状态_php文件锁死锁怎么办相关推荐

  1. php 查看文件锁定状态_PHP flock 文件锁详细介绍

    flock (PHP 4, PHP 5) flock - 轻便的咨询文件锁定 说明 bool flock ( int $handle , int $operation [, int &$wou ...

  2. php 查看文件锁定状态_Photoshop脚本 查看当前图层的锁定状态

    本节将演示如何使用脚本,查看当前图层的锁定状态信息.首先创建一个空白的脚本文档,并保存在硬盘上某个位置. 首先创建一个空白的脚本文档,并保存在硬盘上某个位置. 接着输入脚本代码: //定义一个变量[l ...

  3. git status查看文件的状态

    提要 通过git status查看文件的状态时,出现了一些如下的提示: jidfj@DESKTOP-2DAKPIL MINGW64 /g/excise/zhushouProject/ZhuShou ( ...

  4. java如何解除文件锁定状态_如何使用Python解锁锁定的文件和文件夹(mac)

    在我的脚本的主要目的完成后,作为"清理",调用一个函数来递归查看每个文件夹并删除以预定的一组扩展名结尾的所有文件 . 我在测试期间,发现一些文件扩展名在要删除的列表中的文件实际上会 ...

  5. git status 查看文件更改状态

    文章目录 1. 前言 2. 新文件 3. 修改文件 4. 删除文件 5. 文件状态总结 6. git status -s 简短输出结果 1. 前言 status 命令用于查看工作区中文件的状态 git ...

  6. Photoshop脚本 查看当前图层的锁定状态

    源自:http://coolketang.com/tutorials/menu4lesson17.php 本节将演示如何使用脚本,查看当前图层的锁定状态信息.首先创建一个空白的脚本文档,并保存在硬盘上 ...

  7. 查看被锁用户状态(查看被锁定时间)

    1.查看被锁用户状态(查看被锁定时间) plsql 执行 select username,account_status,lock_date from dba_users; 2.查看日志,listene ...

  8. s-stat 查看文件或者文件系统的状态信息

    命令用法 stat [OPTION]... FILE... -L 查看链接文件 -f 查看文件系统信息,而非文件信息 -c --format=%a 支持使用格式化字符串输出结果,支持\n,\t等转义字 ...

  9. 网站锁定php文件命令,PHP文件锁定读写的一点注意_php

    都说文本方式容易出现文件锁定失效等乱七八糟的问题. 其实并不是失效, 而是写法有些不对. 被 lock_ex 后的文件 再以read模式 fopen 的话将读到空内容!!! 如果没有判断就把它作操作后 ...

最新文章

  1. 学习别跟我谈兴趣 No.88
  2. Git教程:最详细、最傻瓜、最浅显、真正手把手教!
  3. python爬虫能干什么-爬虫可以做的事情非常多,Python的爬虫你又了解多少?
  4. UOJ#386. 【UNR #3】鸽子固定器(链表)
  5. 数组中的键值对去重_javascript利用对象键值对中键的唯一性实现数组去重
  6. 关于NGINX下开启PHP-FPM 输出PHP错误日志的设置(已解决)
  7. mac mysql 账户密码忘记_MAC下MYSQL数据库密码忘记的解决办法
  8. 使用php第三方包mpdf将网页装换成pdf文件【2】
  9. [编程语言]C陷阱与缺陷
  10. Perl语言的常用符号
  11. java for语句_Java for循环语句
  12. ADSL共享上网方式大总结(图)
  13. R语言_缺失值NA的处理
  14. 怎么把音乐WAV格式转换为MP3格式
  15. table td 调整margin无效
  16. Intellij idea -1-解决报错:Error executing Maven. The specified user settings file does not exist: C:\Use
  17. 还 是 你 太 狠 心
  18. python token验证失败百分百解决_微信token验证失败的解决方法
  19. 用 JS 进行 Base64 编码、解码
  20. 华为任正非:管理的灰度

热门文章

  1. 查看python版本和安装路径
  2. 初识Mysql(part18)--我需要知道的4个关于联结的小知识点
  3. html5中底部对齐怎么写,如何将页脚(div)与页面底部对齐?
  4. 如何使用 jMeter Parallel Controller - 并行控制器以及一些常犯的错误
  5. TypeScript 里的 class field
  6. SAP Spartacus central Travis build的lint环节
  7. SAP Spartacus简介
  8. SAP Spartacus RouteGuard路由守卫之CmsPageGuard
  9. 如何开启SAP CRM基于WORD模板创建附件的功能
  10. 如何从SAP Fiori Launchpad里找到ABAP Development Tool的下载地址