生产者消费者问题、死锁问题

WEB前端 7 2018-10-12 17:14

生产者消费者问题

系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取走一个产品并使用。
1. 互斥访问:缓冲区是临界资源,必须保证进程对其互斥地访问。
2. 同步访问:只有缓冲区有产品之后才能被消费,同时,只有缓冲区有空间时才能继续生产

如何用信号量机制实现生产者、消费者进程的这些功能?
设置三个信号量:一个互斥信号量,两个同步信号量
(实现互斥的 P 操作必须放在实现同步的 P 操作之后,否则会造成死锁,退出区的两个 V 操作可以互换)

semaphore mutex = 1;
semaphore empty = n;
semaphore full = 0;
Producer () {
  while (1) {
    P(empty)
    P(mutex);
    生产
    V(mutex);
    V(full)
  }
}
Cunsumer () {
  while (1) {
    P(full)
    P(mutex)
    消费
    V(mutex)
    V(empty)
  }
}

死锁

什么是死锁?
各个进程互相等待对方手里的资源,导致各个进程都阻塞,无法向前推进的现象。(对不可剥夺资源的不合理分配,可能导致死锁)
死锁产生的四个必要条件?
1. 互斥条件
2. 不剥夺条件
3. 请求和保持条件
4. 循环等待条件

预防死锁

破坏死锁产生的四个必要条件中的一个或多个。
1. 破坏互斥:允许多个进程同时访问资源
2. 破坏不剥夺:操作系统强行剥夺
3. 破坏请求和保持:一次性分配所有资源(静态分配)
4. 破坏循环等待:

避免死锁

用某种方法防止系统进入不安全状态。(银行家算法)

死锁检测

为了对系统做死锁检测,必须满足:
1. 用某种数据结构来保存资源的请求和分配信息
2. 提供一种算法,利用上述信息来检测系统是否进入死锁状态

解除死锁的方法

1. 资源剥夺法。挂起(暂时放在外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。
2. 撤销进程法。强制撤销部分、甚至全部死锁进程。
3. 进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。

文章评论

2 关注 / 24 粉丝

我无话可说

广告已过期