linux中的死锁

死锁:一般情况下,如果同一个线程先后两次调用lock,在第二次调用时,由于锁已经被占用,该线程 会挂起等待别的线程释放锁,然而锁正是被自己占用着的,该线程又被挂起而没有机会释放锁, 因此 就永远处于挂起等待状态了,这叫做死锁(Deadlock)。

另一种典型的死锁情形是这样:线 程A获 得了锁1,线程B获得了锁2,这时线程A调用lock试图获得锁2,结果是需要挂起等待线程 B释放 锁2,而这时线程B也调用lock试图获得锁1,结果是需要挂起等待线程A释放锁1,于是线 程A和B都 永远处于挂起状态了。

  1. 死锁产生的四个必要条件

    (1)互斥使用(资源独占) 
    一个资源每次只能给一个进程使用 。
    (2)不可强占(不可剥夺) 
    资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放 。
    (3)请求和保持(部分分配,占有申请) 
    一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配)。 
    (4)循环等待 
    存在一个进程等待队列 {P1 , P2 , … , Pn}, 其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路。

2.常见产生死锁的原因

(1) 因为系统资源不足。
   (2) 进程运行推进的顺序不合适。
   (3) 资源分配不当。

3.规避死锁的方法

(1)忽略该问题。

(2)检测死锁并且恢复。
 (3)仔细地对资源进行动态分配,以避免死锁。
 (4)通过破除死锁四个必要条件之一,来防止死锁产生。

时间: 2024-10-11 08:40:36

linux中的死锁的相关文章

Linux中线程的挂起与恢复(进程暂停)

http://www.linuxidc.com/Linux/2013-09/90156.htm 今天在网上查了一下Linux中对进程的挂起与恢复的实现,相关资料少的可怜,大部分都是粘贴复制.也没有完整详细的代码.故自己整理了一下 程序流程为:主线程创建子线程(当前子线程状态为stop停止状态),5秒后主线程唤醒子线程,10秒后主线程挂起子线程,15秒后主线程再次唤醒子线程,20秒后主线程执行完毕等待子线程退出. 代码如下:#include#include#include#include#incl

Linux中查看进程及杀死进程命令

Linux中想杀死fcitx进程,然后再重启它. [email protected]:/home/zhangbin# ps -e | grep 'fcitx' 3405 ?        00:00:00 fcitx <defunct> 3415 ?        00:00:02 fcitx   不显示标题 [email protected]:/home/zhangbin# ps -h Warning: bad ps syntax, perhaps a bogus '-'? See http

每天进步一点点——论fork()函数与Linux中的多线程编程

转载请说明出处:http://blog.csdn.net/cywosp/article/details/27316803 一.fork()函数 在操作系统的基本概念中进程是程序的一次运行,且是拥有资源的最小单位和调度单位(在引入线程的操作系统中,线程是最小的调度单位).在Linux系统中创建进程有两种方式:一是由操作系统创建,二是由父进程创建进程(通常为子进程).系统调用函数fork()是创建一个新进程的唯一方式,当然vfork()也能够创建进程,可是实际上其还是调用了fork()函数.fork

一个 Linux 上分析死锁的简单方法

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

Android adb命令,linux中各种命令

常用的ADB命令 1. 显示系统中全部Android平台: android list targets 2. 显示系统中全部AVD(模拟器): android list avd 3. 创建AVD(模拟器): android create avd --name 名称 --target 平台编号 4. 启动模拟器: emulator -avd 名称 -sdcard ~/名称.img (-skin 1280x800) 5. 删除AVD(模拟器): android delete avd --name 名称

Java面试问题,如何避免Java线程中的死锁?

如何避免Java中的死锁?是流行的Java面试问题之一,也是多线程的流行话题之一.尽管问题看起来很简单,但是一旦深入,大多数Java开发人员就会陷入困境. 面试问题以“什么是死锁?”当两个或多个线程正在等待彼此释放所需资源(锁定)并陷入无限时间的阻塞时,这种情况称为死锁,它只会在多任务或多线程的情况下发生. 如何检测Java中的死锁? 虽然这可能有很多答案,但我的版本是,如果我看到嵌套的同步块,或者从其他同步方法调用一个同步方法,或者试图在不同的对象上获得锁,那么如果开发人员不是非常小心,就很可

linux中常用时间和字符串之间相互转化

在Linux中经常会遇到时间和字符串相互转化的情形,有两个函数专门对应相应的转化. 1.时间转字符串函数strftime 函数原型:size_t strftime(char *s,size_t maxsize,char *format,conststruct tm *timeptr) strftime函数对timeptr指向的tm结构所代表的时间和日期进行格式编排,其结果放在字符串s中.该字符串的长度被设置为(最少)maxsize个字符.格式字符串format用来对写入字符串的字符进行控制,它包

详解 linux中的grub

grub是什么: grub是引导操作系统的程序,它会根据自己的配置文件,去引导内核,当内核被加载到内存以后, 内核会根据grub配置文件中的配置,找到根分区所使用的文件系统对应的驱动,通过根分区文件系统 对应的驱动,挂载根分区,从而达到启动操作系统的目的. 在了解grub以前,请先大体上了解一下centos5/6的启动过程,然后再理解grub就更容易了, 还记的我们以前总结过的centos5系统启动流程吗,如下图,此处我们重点讨论下图红框中的步骤. centos5/6中使用grub作为bootl

Linux中的crontab命令用法

Crontab 在linux中,crontab的用来设置定期执行指定的命令,我们可以用它来指定一些需要重复的事情,Linux系统的用户只需将想要定期要执行的命令序列加到crontab文件中,操作系统即会按用户配置的时间执行这些命令序列.向crontab文件里添加指令之前,需要检查下crontab服务是否已启动和是否开机自动启动: [查看状态] Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的 可以使用service crond status进行查看状态,下图是我在ce