死锁
1)死锁是什么?
浅显理解:当两个进程或者线程,都需要对方占用的资源时,且资源无法释放,两个进程或线程都被阻塞,则产生了死锁。
规范定义:一个进程集合中每个进程都在等待只能由该进程集合中其他进程才能引发的事件,那么该进程集合就是死锁的。
2)什么是资源?
可以是硬件设备或者一组信息。资源可分为可抢占和不可抢占两类。资源事件顺序:
1.请求资源;
2.使用资源;
3.释放资源;
当资源不可用,进程将被迫等待(不一定是阻塞,和操作系统有关系)。
3)死锁四个条件
1.互斥条件;2.占有和等待;3.不可抢占;4.环路等待。
4)四个应对策略
1.忽略它:
鸵鸟算法。当阻塞发生频度远小于因其他原因导致系统重启频度,就没必要以牺牲性能和可用性的代价去防止死锁;
2.检测它并解决它:
检测:检测资源进程有向图是否有环,分配请求矩阵方法检测。
恢复:抢占恢复(取决于资源类型,比较难以实现);回滚恢复(可能会丢失进程的一些工作);杀死进程(进程的选择很重要)
3.仔细对资源进行分配,避免它:
资源轨迹图:

安全和不安全状态
银行家算法
4.破坏四个条件之一,预防它。
5)两阶段锁、信息锁、活锁、饥饿。
1.读写锁
为了满⾜当前能够允许多个读出,但只允许⼀个写⼊的需求,线程提供了读写锁来实现。
特点: 1、如果有其它线程读数据,则允许其它线程执行读操作,但不允许写操作
2、如果有其它线程写数据,则其它线程都不允许读、写操作
1. 如果某线程申请了读锁,其它线程可以再申请读锁,但不能申请写锁。
2. 如果某线程申请了写锁,其它线程不能申请读锁,也不能申请写锁。
2.条件变量
条件变量⽤来⾃动阻塞⼀个线程,直到某特殊情况发⽣为⽌。通常条件变量和互斥锁同时使⽤。对互斥锁而言,条件变量可以减少竞争。
如直接使⽤mutex,除了⽣产者、消费者之间要竞争互斥量以外,消费者之间也需要竞争互斥量; 但如果汇聚(链表)中没有数据,消费者之间竞争互斥锁是⽆意义的。 有了条件变量机制以后,只有⽣产者完成⽣产,才会引起消费者之间的竞争,提⾼了程序效率。
浙公网安备 33010602011771号