位置: 编程技术 - 正文

在Linux平台下分析死锁问题的方法(linux必不可少的分区)

编辑:rootadmin

推荐整理分享在Linux平台下分析死锁问题的方法(linux必不可少的分区),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:linux系统如何分区详解,在linux中,在linux中,在linux中,linux用什么分区,linux分为,linux必不可少的分区,linux必不可少的分区,内容如对您有帮助,希望把文章链接给更多的朋友!

死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程(线程)在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。

一种交叉持锁死锁的情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被其它线程占用并堵塞了的资源。例如,如果线程 1 锁住了记录 A 并等待记录 B,而线程 2 锁住了记录 B 并等待记录 A,这样两个线程就发生了死锁现象。在计算机系统中 , 如果系统的资源分配策略不当,更常见的可能是程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象。

产生死锁的四个必要条件

(1) 互斥条件:一个资源每次只能被一个进程(线程)使用。

(2) 请求与保持条件:一个进程(线程)因请求资源而阻塞时,对已获得的资源保持不放。

(3) 不剥夺条件 : 此进程(线程)已获得的资源,在末使用完之前,不能强行剥夺。

(4) 循环等待条件 : 多个进程(线程)之间形成一种头尾相接的循环等待资源关系。

图 1. 交叉持锁的死锁示意图:

注释:在执行 func2 和 func4 之后,子线程 1 获得了锁 A,正试图获得锁 B,但是子线程 2 此时获得了锁 B,正试图获得锁 A,所以子线程 1 和子线程 2 将没有办法得到锁 A 和锁 B,因为它们各自被对方占有,永远不会释放,所以发生了死锁的现象。

使用 pstack 和 gdb 工具对死锁程序进行分析

pstack 在 Linux 平台上的简单介绍

pstack 是 Linux(比如 Red Hat Linux 系统、Ubuntu Linux 系统等)下一个很有用的工具,它的功能是打印输出此进程的堆栈信息。可以输出所有线程的调用关系栈。

gdb 在 Linux 平台上的简单介绍

GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具。Linux 系统中包含了 GNU 调试程序 gdb,它是一个用来调试 C 和 C++ 程序的调试器。可以使程序开发者在程序运行时观察程序的内部结构和内存的使用情况 .

gdb 所提供的一些主要功能如下所示:

1 运行程序,设置能影响程序运行的参数和环境 ;

2 控制程序在指定的条件下停止运行;

3 当程序停止时,可以检查程序的状态;

在Linux平台下分析死锁问题的方法(linux必不可少的分区)

4 当程序 crash 时,可以检查 core 文件;

5 可以修改程序的错误,并重新运行程序;

6 可以动态监视程序中变量的值;

7 可以单步执行代码,观察程序的运行状态。

gdb 程序调试的对象是可执行文件或者进程,而不是程序的源代码文件。然而,并不是所有的可执行文件都可以用 gdb 调试。如果要让产生的可执行文件可以用来调试,需在执行 g++(gcc)指令编译程序时,加上 -g 参数,指定程序在编译时包含调试信息。调试信息包含程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb 利用这些信息使源代码和机器码相关联。gdb 的基本命令较多,不做详细介绍,大家如果需要进一步了解,请参见 gdb 手册。

清单 1. 测试程序

清单 2. 编译测试程序

清单 3. 查找测试程序的进程号

清单 4. 对死锁进程第一次执行 pstack(pstack –进程号)的输出结果

清单 5. 对死锁进程第二次执行 pstack(pstack –进程号)的输出结果

连续多次查看这个进程的函数调用关系堆栈进行分析:当进程吊死时,多次使用 pstack 查看进程的函数调用堆栈,死锁线程将一直处于等锁的状态,对比多次的函数调用堆栈输出结果,确定哪两个线程(或者几个线程)一直没有变化且一直处于等锁的状态(可能存在两个线程 一直没有变化)。

输出分析:

根据上面的输出对比可以发现,线程 1 和线程 2 由第一次 pstack 输出的处在 sleep 函数变化为第二次 pstack 输出的处在 memset 函数。但是线程 4 和线程 5 一直处在等锁状态(pthread_mutex_lock),在连续两次的 pstack 信息输出中没有变化,所以我们可以推测线程 4 和线程 5 发生了死锁。

Gdb into thread输出:

清单 6. 然后通过 gdb attach 到死锁进程

清单 7. 切换到线程 5 的输出

清单 8. 线程 4 和线程 5 的输出

从上面可以发现,线程 4 正试图获得锁 mutex1,但是锁 mutex1 已经被 LWP 为 的线程得到(__owner = ),线程 5 正试图获得锁 mutex2,但是锁 mutex2 已经被 LWP 为 的 得到(__owner = ),从 pstack 的输出可以发现,LWP 与线程 5 是对应的,LWP 与线程 4 是对应的。所以我们可以得出, 线程 4 和线程 5 发生了交叉持锁的死锁现象。查看线程的源代码发现,线程 4 和线程 5 同时使用 mutex1 和 mutex2,且申请顺序不合理。

总结

本文简单介绍了一种在 Linux 平台下分析死锁问题的方法,对一些死锁问题的分析有一定作用。希望对大家有帮助。理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源 , 在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予以分配。因此,对资源的分配要给予合理的规划,使用有序资源分配法和银行家算法等是避免死锁的有效方法。

linux下普通文件和目录文件区别详解 文件权限一般可认为是,一共十位:0:表示该文件的文件类型。Windows里面是使用了一种文件关联的技术,通过扩展名来关联相应的应用程序,

Linux用户alias文件配置方法 修改~/.bashrc文件,以配置用户自己定义的alias$vi~/.bashrc显示#.bash_profile#Getthealiasesandfunctionsif[-f~/.bashrc];then.~/.bashrcfi#UserspecificenvironmentandstartupprogramsPATH=$P

linux命令eval的用法讲解 1.evalcommand-line其中command-line是在终端上键入的一条普通命令行。然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次。如:pipe=|evalls

标签: linux必不可少的分区

本文链接地址:https://www.jiuchutong.com/biancheng/361984.html 转载请保留说明!

上一篇:redhat linux swap分区扩展的三种方法详解(linux-swap)

下一篇:linux下普通文件和目录文件区别详解(linux ./文件)

  • 企业购进固定资产时增值税如何处理
  • 汇算清缴补缴企业所得税怎么做账
  • 厂房地面硬化
  • 怎么增加资产减少负债
  • 不得开具增值税专票情形包括
  • 税金及附加没有什么税
  • 保本销售量的计算公式用安全边际率
  • 房产税和土地使用税会计分录
  • 购买折让
  • 增值税销项税额在借方还是贷方
  • 贷款 保险费
  • 确认一个会计项目应符合的基本标准有
  • 免税的投资收益需要调整利润表吗
  • 运输企业营改增
  • 什么时候需要计算环境熵变
  • 为什么发票查验不出
  • 怎么知道是不是强制执行
  • 基金会可以投资企业吗
  • 销售折扣计入增值税销售额的
  • 建筑业劳务分包怎样算税
  • 政府补贴专项资金如何入账
  • 水电费计提和冲销
  • 农贸市场收取管理费
  • 支付宝手续费怎么关闭
  • 金税三期核心征管系统行政处罚
  • 企业买进基金用什么账户
  • 如何保护excel表格不被打开
  • 企业发生待摊费怎么处理
  • 固定资产折旧计提时间
  • php问卷调查系统课程设计
  • 生产企业出口退税计算
  • 抵扣了的进项税可以冲销么
  • scrtkfg.exe - scrtkfg是什么进程 有什么用
  • 自产产品用于业务招待,成本10万,售价20万
  • PHP:curl_multi_close()的用法_cURL函数
  • 存货包括生产成本,在资产负债表中表示
  • 税务登记 申报
  • linux阅读pdf
  • phpfilter
  • 股份支付的确认和计量原则
  • Ichetucknee河的海牛,佛罗里达州 (© Jennifer Adler/Alamy)
  • phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
  • 未交社保可以要求单位赔偿吗
  • 个体户生产经营所得减免政策
  • 债务重组收入要交税吗
  • 土地转让注意事项有哪些
  • 小规模纳税人税额怎么算
  • 目标检测算法有哪些
  • 图像深度算法
  • php调用网址
  • 账实不符的后果和对策
  • 什么是企业贷款余额
  • 对增值税发票开具方面是有啥要求?
  • 本月增值税申报截止日
  • 印花税不足一元免征吗
  • 工程预付款发票开什么明细项目
  • 账务处理程序是指什么
  • 交通费用报销明细表
  • 农产品加计扣除怎么计算
  • 收到增值税发票后该如何处理啊?
  • 制造费用是借还是贷
  • 收到同业清算互联前置如何入账
  • 收付实现制下主营业务成本怎么算
  • MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 的原因分解决办法
  • sqlserver索引的作用
  • 三种实现方法实现的特点
  • mysql 1290怎么解决
  • sql数据库怎样批量添加数据
  • mysql 远程连接不上
  • linux终端基础命令
  • centos 怎么用
  • 安全账户管理器或本地安全机构服务器
  • win10画图功能
  • win10系统wifi信号断断续续
  • js中创建函数的方法
  • glslpe
  • activity启动流程图解
  • 国家税务总局遴选拟录取名单
  • 车船税填表说明
  • 个体工商户两处所得,如何减半个税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设