分布式系统中的死锁预防策略
死锁是一组进程被阻塞的情况,因为每个进程都持有一个资源并等待其他进程持有的资源。
发生死锁有四个必要条件:
- 互斥:至少有一个资源是不可共享的,一次只能被一个进程使用。
- 持有并等待:一个进程持有至少一个资源并等待另一个。
- 无抢占:在释放资源之前,不能从进程中获取资源。
- 循环等待:至少两个进程应该通过持有一个资源并等待链中下一个进程持有的资源来形成一个循环链。
所以上面的四个条件是发生死锁的必要条件,如果上面四个条件中的任何一个被阻止,我们就可以阻止死锁的发生。有两种方法可以防止分布式系统中的死锁。
- 订购请求
- 集体请求
订购请求
顾名思义,在这种死锁预防方法中,每种资源类型都被分配了一定的级别,以维护一个进程的资源请求策略。这称为资源分配策略。对于每个资源,分配一个全局级别编号以强制对所有资源类型进行排序。在请求资源时,进程必须确保它不会请求级别顺序低于其当前拥有的最高级别顺序资源的资源。它只能请求比进程持有的最高级别资源更高的资源。请参阅以下示例以获得更好的理解。假设从级别 1 到级别 10 有 10 种资源,其中 10 是最高级别的订单资源。如果一个进程当前拥有资源 5 和 8,它不能请求低于 8 的资源,它只能请求资源 9 和 10。同理,进程不能请求资源 7,同时持有资源 8。这种方法并不意味着请求应按顺序递增的顺序进行。在发送对资源 7 的请求之前,它必须释放持有的资源 8。释放 8 后,它可以获取 7。允许它是因为目前它不持有高于 7 的资源。
该方法确保未达到循环等待条件,并且如果死锁条件之一被拒绝,则将防止死锁。
缺点:
- 资源请求订单按照资源分配策略递增的订单级别的流程将利用所有资源并浪费资源。
- 例如:参考上面的例子,如果一个进程的资源请求顺序是从1到10,它将获取所有资源,这会降低资源利用率。
集体请求
此方法通过使用以下任何资源分配策略来防止保持和等待条件:
- 该资源分配策略确保一个进程在执行之前请求所有需要的资源。如果任何所需资源不可用,则不批准请求。示例:一个进程的执行需要 3 个资源,如果所有 3 个资源都可用,则批准请求并分配所有 3 个资源。但是,如果这 3 种资源中的任何一种不可用,则这 3 种资源都不会被分配,并且请求被拒绝。
- 在此资源分配策略中,进程必须确保在请求任何资源之前,它不应持有任何资源。也就是说,它应该在对新资源提出任何请求之前释放其所有当前资源。在请求任何资源时,进程不应持有任何资源。
- 在上述两种资源分配策略中,都无法达到死锁的保持和等待条件,从而防止了死锁。
缺点:
- 导致资源利用率低。
- Process Starvation 也是可能的,因为如果有一个资源需求很高的进程,它的请求接受将被延迟。