Skip to the content.

资源死锁(resource deadlock)

鸵鸟算法

死锁检测和死锁恢复

死锁避免

进程 已分配资源 最大需求
A 3 9
B 2 4
C 2 7
进程 已分配资源 最大需求
A 4 9
B 2 4
C 2 7
进程 资源1 资源2 资源3 资源4
A 3 0 1 1
B 0 1 0 0
C 1 1 1 0
D 1 1 0 1
E 0 0 0 0
进程 资源1 资源2 资源3 资源4
A 1 1 0 0
B 0 1 1 2
C 3 1 0 0
D 0 0 1 0
E 2 1 1 0
C       R
3011    1100
0100    0112
1110    3100
1101    0010
0000    2110

死锁预防

通信死锁(communication deadlock)

活锁(livelock)

void process_A() {
  acquire_lock(&resource_1);
  while (!try_lock(&resource_2)) {  // 进程 A 尝试获取资源 2 失败
    release_lock(&resource_1);  // 先释放资源 1,一段时间后再尝试获取资源 2
    wait_fixed_time();  // 若 B 此时也在等待,则两者都让出了资源但对方都未获取
    acquire_lock(&resource_1);  // 两者各自拿回资源,则下次获取对方资源仍会失败
  }                             // 若此过程一直重复就是活锁
  use_both_resources();
  release_lock(&resource_2);
  release_lock(&resource_1);
}

void process_B() {
  acquire_lock(&resource_2);
  while (!try_lock(&resource_1)) {
    release_lock(&resource_2);
    wait_fixed_time();
    acquire_lock(&resource_2);
  }
  use_both_resources();
  release_lock(&resource_1);
  release_lock(&resource_2);
}