一、字节一面(操作系统)
什么是死锁?如何处理死锁问题?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通讯而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在相互等待的进程称为死锁进程。例如:进程A占用了资源R1并等待资源R2,而进程B占用了资源R2并等待资源R1,这样两个进程就会相互等待,形成死锁。
死锁只有同时满足以下四个条件才会发生:
1.互斥条件: 互斥条件是指多个线程不能同时使用一个资源。
2.持有并等待条件: 持有并等待条件是指,当线程A已经持有了资源1,又想申请资源2,而资源2已经被线程C持有了,所以线程A就会处于等待状态,但是线程A在等待资源2的同时不会释放自己已持有的资源1。
3.不可剥夺条件: 不可剥夺条件是指,当线程已经持有了资源,在自己使用完成之前不能被其他线程获取,线程B如果也想使用此资源,则只能在线程A使用完并释放后才能获取。
4.环路等待条件: 欢鹿等待条件是指,在死锁发生的时候,两个线程获取资源的顺序构成了环形链。
避免死锁问题就只需要破坏其中一个条件就可以,最常见的并且可执行的就是使用资源有序分配法,来破坏环路等待条件。
什么是资源有序分配法呢?线程A和线程B获取资源的顺序要一样,当线程A是先尝试获取资源A,然后尝试获取资源B的时候,线程B也是同样先尝试获取资源A,然后尝试获取资源B。也就是说,线程A和线程B总是以相同的顺序申请自己想要的资源。