死锁

(1)死锁:一组进程中的每个进程都在等待某个事件,而只有这组进程中的其他被阻塞的进程才可以触发该事件,这时就称这组进程发生死锁。死锁是永久性的。
(2)可重用资源:不会因为使用而被耗尽和消耗的资源。如I/O通道或一块内存
(3)可消耗资源:当被一个进程获取时就消耗了的资源。如缓冲区中的消息

(4)死锁产生的条件:
<1>互斥。一次只有一个进程可以使用的资源,其他进程不能访问已分配给其他进程的资源;
<2>阻塞且拥有。当某个进程因为请求访问某个资源被阻塞时,不释放自己本身持有的资源;
<3>不可抢占。当某个进程持有资源时,别的进程不能抢占该资源;
<4>循环等待。若干进程之间形成一种头尾相接的环形等待资源关系。

(5)死锁预防
死锁预防通过破环任一个产生死锁的条件,从而预防死锁的产生。不能通过破坏条件1,预防产生死锁。条件1是死锁的基础,如果需要对资源进行互斥访问,操作系统必须支持互斥。
<1>破坏条件2,要求进程一次性请求完它所需要的资源,并且阻塞其他进程,直到所有请求都同时满足。缺点:效率低。进程可能要阻塞很长事件,等待进程获取完它所需要的资源;分配给一个进程的资源,它可能很长时间不用,在此期间内,别的进程也不能获取。
<2>破坏条件3,如果占有其他资源的进程请求申请资源失败时,释放其占有的资源;如果当前进程申请访问的资源被其他进程占用时,操作系统可以抢占该资源,要求它释放。
<3>破坏条件4,定义资源的有序分配顺序,不产生循环等待。

(6)死锁避免
死锁避免允许死锁产生的条件,通过分析新的资源请求,确定它是否会产生死锁,只有在不可能产生死锁时才同意该请求。
<1>如果一个进程的请求会导致死锁,则不启动该进程;
<2>如果一个进程请求加载的资源会导致死锁,则不分配该资源。

(7)Linux内核并发机制
<1>原子操作
Linux提供了一组操作,以保证对变量的原子操作,以避免简单的竟态条件。定义了一个特殊的数据结构automic_t。

<2>自旋锁
同一时刻只有一个进程能够获得自旋锁,其他试图获得自旋锁的进程将一一直尝试获得锁(即自旋),直到获得该锁。自旋锁实质上是内存上的一个整数,任何线程进入临界区之前都必须检查该整数,如果该值是0,则线程设置该值为1,然后进入临界区,出临界区后,将该值设置为0。如果该值非0,则该进程继续检查该值,直到它为0。

自旋锁的缺点:在锁外面的线程以忙等待的方式持续执行,因此,自旋锁在获得锁需要的等待事件较短时会很高效。

<3>信号量
计数信号量 信号量值>1
二元信号量 信号量值=0/1
读者-写者信号量 读者使用的是计数信号量,写者使用的是二元信号量

(8)互斥锁
互斥锁用于确保在同一时间只有一个线程访问被互斥锁保护的资源。加互斥锁与解互斥锁的线程必须是同一个线程。如果mutex_enter不能获得锁,则当前线程阻塞。默认的阻塞策略是自旋锁(一个被阻塞的线程在忙等循环中轮询锁的状态)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值