佛山专业网站制作,高端网站开发,线上推广营销策划,vr成品网站源码一、死锁的定义
是指两个或两个以上的进程在执行过程中#xff0c;由于竞争资源或者由于彼此通信而造、成的一种阻塞的现象#xff0c;若无外力作用#xff0c;它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁#xff0c;这些永远在互相等待的进程称为死锁…一、死锁的定义
是指两个或两个以上的进程在执行过程中由于竞争资源或者由于彼此通信而造、成的一种阻塞的现象若无外力作用它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁这些永远在互相等待的进程称为死锁进程。 二、死锁产生的原因
1因为系统资源不足。
2进程运行推进的顺序不合适。
3资源分配不当等。
如果系统资源充足进程的资源请求都能够得到满足死锁出现的可能性就很低否则
就会因争夺有限的资源而陷入死锁。其次进程运行推进顺序与速度不同也可能产生死锁。
三、死锁产生的条件
1互斥条件一个资源每次只能被一个进程使用。
2请求与保持条件一个进程因请求资源而阻塞时对已获得的资源保持不放。
3不剥夺条件:进程已获得的资源在末使用完之前不能强行剥夺。
4循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
四、如何避免死锁 在有些情况下死锁是可以避免的。三种用于避免死锁的技术
加锁顺序
当多个线程需要相同的一些锁但是按照不同的顺序加锁死锁就很容易发生。
如果能确保所有的线程都是按照相同的顺序获得锁那么死锁就不会发生。看下面这个例子
Thread 1: lock A lock B Thread 2: wait for A lock C (when A locked) Thread 3: wait for A wait for B wait for C
如果一个线程比如线程3需要一些锁那么它必须按照确定的顺序获取锁。它只有获得了从顺序上排在前面的锁之后才能获取后面的锁。
例如线程2和线程3只有在获取了锁A之后才能尝试获取锁C(译者注获取锁A是获取锁C的必要条件)。因为线程1已经拥有了锁A所以线程2和3需要一直等到锁A被释放。然后在它们尝试对B或C加锁之前必须成功地对A加了锁。
按照顺序加锁是一种有效的死锁预防机制。但是这种方式需要你事先知道所有可能会用到的锁(译者注并对这些锁做适当的排序)但总有些时候是无法预知的。 加锁时限
另外一个可以避免死锁的方法是在尝试获取锁的时候加一个超时时间这也就意味着在尝试获取锁的过程中若超过了这个时限该线程则放弃对该锁请求。若一个线程没有在给定的时限内成功获得所有需要的锁则会进行回退并释放所有已经获得的锁然后等待一段随机的时间再重试。这段随机的等待时间让其它线程有机会尝试获取相同的这些锁并且让该应用在没有获得锁的时候可以继续运行(译者注加锁超时后可以先继续运行干点其它事情再回头来重复之前加锁的逻辑)。
以下是一个例子展示了两个线程以不同的顺序尝试获取相同的两个锁在发生超时后回退并重试的场景 Thread 1 locks A
Thread 2 locks B Thread 1 attempts to lock B but is blocked
Thread 2 attempts to lock A but is blocked Thread 1s lock attempt on B times out
Thread 1 backs up and releases A as well
Thread 1 waits randomly (e.g. 257 millis) before retrying. Thread 2s lock attempt on A times out
Thread 2 backs up and releases B as well
Thread 2 waits randomly (e.g. 43 millis) before retrying.
在上面的例子中线程2比线程1早200毫秒进行重试加锁因此它可以先成功地获取到两个锁。这时线程1尝试获取锁A并且处于等待状态。当线程2结束时线程1也可以顺利的获得这两个锁除非线程2或者其它线程在线程1成功获得两个锁之前又获得其中的一些锁。
需要注意的是由于存在锁的超时所以我们不能认为这种场景就一定是出现了死锁。也可能是因为获得了锁的线程导致其它线程超时需要很长的时间去完成它的任务。
此外如果有非常多的线程同一时间去竞争同一批资源就算有超时和回退机制还是可能会导致这些线程重复地尝试但却始终得不到锁。如果只有两个线程并且重试的超时时间设定为0到500毫秒之间这种现象可能不会发生但是如果是10个或20个线程情况就不同了。因为这些线程等待相等的重试时间的概率就高的多或者非常接近以至于会出现问题。 (译者注超时和重试机制是为了避免在同一时间出现的竞争但是当线程很多时其中两个或多个线程的超时时间一样或者接近的可能性就会很大因此就算出现竞争而导致超时后由于超时时间一样它们又会同时开始重试导致新一轮的竞争带来了新的问题。)