一个Linu上分析死锁的简单方法.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
一个Linu上分析死锁的简单方法.doc

一个Linux上分析死锁的简单方法 本义主要介绍一种在Linux上分析死锁问题的简平方法。主要介绍死锁的基本概 念,以及如何使川pstack和gdb对死锁问题进行分析。 简介 死锁(deallocks):是指W个或W个以上的进程(线程)在执行过程中,因争夺 资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此 吋称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程) 称为死锁进程(线程)。由于资源占用是互斥的,当某个进程提出申请资源后, 使符有关进程(线程)在无外力协助下,永远分配不到必需的资源而无法继续运 行,这就产生Y—种特殊现象死锁。 一种交叉持锁死锁的情形,此吋执行程序屮两个或多个线程发生永久堵塞(等 待),每个线程都在等待被其它线程占用并堵塞了的资源。例如,如果线程1锁 住了记录A并等待记录B,而线程2锁住;T记录B并等待记录A,这样两 个线程就发生了死锁现象。在计算机系统屮,如果系统的资源分配策略不当, 更常见的可能是程序员写的程序有错误等,则会导致进程因竞争资源不当而产生 死锁的现象。 产生死锁的四个必要条件 (1) 互斥条件:一个资源每次只能被一个进程(线程)使用。 (2) 请求与保持条件:一个进程(线程)因请求资源而阻塞时,对已获得的资 源保持不放。 (3) 不剥夺条件:此进程(线程)已获得的资源,在末使用完之前,不能强 行剥夺。 (4) 循环等待条件:多个进程(线程)之间形成一种头尾相接的循环等待资 源关系。 1.交叉持锁的死锁示意图: 子?超1 子4雄2 :在执行func2和func4之后,子线程1获得了锁A,正试图获得锁巳, 但是子线程2此时获得了锁B,正试图获得锁A,所以子线程1和子线程2 将没有办法得到锁A和锁B,因为它们各自被对方占有,永远不会释放,所以 发生了死锁的现象。 使用pstack和gdb工具对死锁程序进行分析 pstack在Linux平台上的简单介绍 pstack 是 Linux (比如 Red Hat Linux 系统、Ubuntu Linux 系统等)F—个很 宥用的工具,它的功能是打印输出此进程的堆栈信息。可以输出所宥线程的调用 关系栈。 gdb在Linux平台上的简单介绍 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。Linux 系统中包含了 GNU调试程序gdb,它是一个用來调试C和C++程序的调试 器。可以使程序幵发者在程序运行时观察程序的内部结构和内存的使用情况. gdb所提供的一些主耍功能如卜*所示: 1运行程序,设置能影响程序运行的参数和环境; 2控制程序在指定的条件下停止运行; 3当程序停止时,可以检查程序的状态; 4当程序crash时,可以检查core文件; 5可以修改程序的错误,并重新运行程序; 6可以动态监视程序屮变量的值; 7可以单步执行代码,观察程序的运行状态。 gdb程序调试的对象足可执行文件或者进程,而不是程序的源代码文件。然而, 并不是所有的可执行文件都可以用gdb调试。如果要让产生的可执行文件可以 用来调试,需在执行g++ (gcc)指令编译程序时,加上-g参数,指定程序在 编译时包含调试信息。调试信息包含程序里的每个变量的类型和在可执行文件里 的地址映射以及源代码的行号。gdb利用这些信息使源代码和机器码相关联。 gdb的基本命令较多,不做详细介绍,大家如果需要进一步了解,请参见gdb手 册。 清单1.测试程序 #include <unistd.h> #include <pthread.h> #include <string.h> pthreadjnutex_t mutexl = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t mutex3 = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t mutex4 = PTHREAD_MUTEX_INITIALIZER; static int sequencel =0; static int sequence2 = 0; int fund () { pthread_mutex_lock(&mutex1); ++sequence1; sleep(1); pthread_mutex_lock(&mutex2); ++sequence2; pthread_mutex_unlock(&mutex2); pthread_mutex_unlock(&mutex1); return sequencel; } int func2() pthread_mutex_lock(&mutex2);

文档评论(0)

ggkkppp + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档