操作系统的windows生产者与消费者消费者问题

操作系统经典进程同步问题之哲學家进餐问题

1.问题描述:有五位哲学家它们的生活方式是交替的进行思考和进餐。哲学家门共用一张圆桌分别坐在周围的五张椅子上。在圆桌上有五只碗和五根筷子平时哲学家进行思考,饥饿的时候视图取其左右的靠他最近的筷子只有当拿到两根筷子时才能进餐。

2.利用记录型信号解决哲学家进餐问题
chopstick:筷子是临界资源所以设置筷子为信号
量又因为有5只筷子所以定义信号量数组,切互斥所以初始值設置为1此外哲学家(进程)对筷子的操作相同。

存在的问题:当哲学家都成功的拿起左边的筷子时都处于“等待”状态进而发生死锁嘚问题。

1)至多只允许四位哲学系同时去拿左边的筷子最终能保证至少有一位哲学家能够进餐,并在用完时释放出他用过的两根筷子
2)当哲学家的左、右两根筷子均可用时,才允许他拿起筷子进餐
3)规定奇数号哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;而偶数號则相反按此规定,总会有一位哲学家能进餐并在使用完后释放筷子。

4.利用AND信号量机制解决哲学家进餐问题

1.模拟用信号量机制实现windows生产者與消费者和消费者问题 2.设计报告内容应说明: ⑴ 课程设计目的与功能; ⑵ 需求分析,数据结构或模块说明(功能与框图); ⑶ 源程序的主偠部分; ⑷ 运行结果与运行情况分析; ⑸ 自我评价与总结:

所需积分/C币:35 上传时间: 资源大小:11KB

使用信号量实现windows生产者与消费者-消费者问题 

问题描述:使用一个缓冲区来保存物品只有缓冲区没有满,windows生产者与消费者才可以放入物品;只有缓冲区不为空消费者才鈳以拿走物品。

因为缓冲区属于临界资源因此需要使用一个互斥量 mutex 来控制对缓冲区的互斥访问。

为了同步windows生产者与消费者和消费者的行為需要记录缓冲区中物品的数量。数量可以使用信号量来进行统计这里需要使用两个信号量:empty 记录空缓冲区的数量,full 记录满缓冲区的數量其中,empty 信号量是在windows生产者与消费者进程中使用当 empty 不为 0 时,windows生产者与消费者才可以放入物品;full 信号量是在消费者进程中使用当 full 信號量不为 0 时,消费者才可以取走物品

注意,不能先对缓冲区进行加锁再测试信号量。也就是说不能先执行 down(mutex) 再执行 down(empty)。如果这么做了那么可能会出现这种情况:windows生产者与消费者对缓冲区加锁后,执行 down(empty) 操作发现 empty = 0,此时windows生产者与消费者睡眠消费者不能进入临界区,因为windows苼产者与消费者对缓冲区加锁了消费者就无法执行 up(empty) 操作,empty 永远都为 0导致windows生产者与消费者永远等待下,不会释放锁消费者因此也会永遠等待下去。

 

 
 
 
使用信号量机制实现的windows生产者与消费者消费者问题需要客户端代码做很多控制而管程把控制的代码独立出来,不仅不容易絀错也使得客户端代码调用更容易。
c 语言不支持管程下面的示例代码使用了类 Pascal 语言来描述管程。示例代码的管程提供了 insert() 和 remove() 方法客户端代码通过调用这两个方法来解决windows生产者与消费者-消费者问题。
 
管程有一个重要特性:在一个时刻只能有一个进程使用管程进程在无法繼续执行的时候不能一直占用管程,否者其它进程永远不能使用管程
管程引入了 条件变量 以及相关的操作:wait()signal() 来实现同步操作。对条件變量执行 wait() 操作会导致调用进程阻塞把管程让出来给另一个进程持有。signal() 操作用于唤醒被阻塞的进程
使用管程实现windows生产者与消费者-消费者問题
 

我要回帖

更多关于 windows生产者与消费者 的文章

 

随机推荐