在操作系统中有许多不同类型的资源,需要采用互斥方法去访问临界资源,而通常采用互斥的方法就是加锁。
锁一般分为:互斥量、自旋锁、读写锁、文件锁。
死锁的概念:
指在多道系统中,一个进程组中的每一个进程均无限的等待被该进程组中另一个进程占有并且永远不会释放的资源,这种现象称为死锁。
产生死锁的四个必要条件(四个条件四者缺一不可):
- 互斥条件。某段时间内,一个资源一次只能被一个进程访问。
- 请求和保持条件。进程A已经拥有至少一个资源,此时又去申请其他资源,而该资源又正在被其他进程使用,此时请求进程阻塞,但对自己已经获得的资源保持占有不释放。
- 不可抢占资源。进程已获得的资源在未使用完之前不能被抢占,只能在自己使用完时由自己释放。
- 循环等待序列。存在一个循环等待序列P0,P1,P2……Pn。P0请求正在被进程P1占有的资源,P1请求正在被P2占有的资源……Pn正在请求被进程P0占有的资源。
避免死锁
那么如何避免死锁呢,下面说几种常见的死锁避免算法:
1. 忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。
2. 检查死锁并恢复。检查死锁可以用下面这种算法来检测:
- 采用一种基于矩阵的算法,有四个条件,一是现有总资源向量E,可用资源向量A,当前资源分配矩阵C,进程未来的资源请求矩阵R。
- 此算法分三步
- 一,寻找一个进程,满足R <= A;
- 二,若存在这样的进程,将其标记,认为其可运行完毕,然后A = A + C(此进程所分配的资源)。
- 三,上述俩步要不断进行,直到若不存在这样的进程,或者所用进程都被标记,则该算法结束。
算法结束,若存在没有被标记的进程,则系统中存在死锁。
恢复死锁一般分为俩步:
一是终止进程,目的是释放资源。
- 二是抢占资源,被抢占资源的进程要利用回滚恢复,一般回滚到一个安全状态。通常是完全回滚,即终止进程并重启进程。
3.避免死锁。仔细的对资源进行动态分配,以避免死锁。即按照顺序加锁。
4. 防止死锁产生。通过破除死锁四个必要条件之一,来防止死锁产生。
以上就是关于死锁的部分内容。