目录
1.生产者消费者问题
2.读者写者问题
3.哲学家进餐问题
1.生产者消费者问题
一组生产者进程和一组消费者进程共享一个初始为空,大小为n的缓冲区
只有缓冲区没满时,生产者才能把消息放入缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。(两对同步关系)
缓冲区是一个临界资源,它只允许一个生产者放入消息,或者一个消费者从中取出消息。(互斥关系)
2.读者写者问题
有读者和写者两组并发进程,共享一个文件,当两个或以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。
因此,需要满足:
1.允许多个读者可以同时对文件进行读操作
2.只允许一个写者往文件中写信息
3.任一写者在完成写操作之前不允许其他读者或写者工作
4.写者执行写操作前,应让已有的读者和写者全部退出
(1)关系分析:写者和读者互斥,写者和写者互斥,读者和读者不存在互斥关系。
(2)整理思路:写者和任一进程都是互斥的,读者和读者同步,和写者互斥,因此需要设置计数器,用它来判断当前是否有读者读文件,当有读者读文件时,写者无法写文件,读者一直占用文件,当没有读者时,写者才可以写文件。同时,读者对计数器的访问也应该是互斥的。
(3)信号量的设置:首先设置信号量count为计数器,用来记录当前读者的数量,初值为0,设置mutex 为互斥信号量,用来保护更新count变量的互斥,设置互斥信号量rw,用来保证读者和写者的互斥访问
上述算法,读进程是优先的,即当存在读进程时,写操作将被延迟,且只要有一个读进程活跃,随后而来的读进程都将被允许访问,这样可能会导致写进程长时间等待,且存在写进程“饿死”的情况。
3.哲学家进餐问题
一张圆桌边上坐着5名哲学家,每两名哲学家之间的桌子上摆一根筷子,两根筷子中间是一碗米饭,哲学家进行思考和进餐,在思考时,并不影响他人,只有当饥饿时,才会试图拿起左右两根筷子,若筷子已在他人手上,则需要等待,饥饿的哲学家只能同时拿到两根筷子才能进餐,进餐完毕,放下筷子继续思考。
(1)关系分析:5名哲学家与左右邻居对其中间筷子的访问是互斥关系。
(2)整理思路:本题有5个进程,如何让一名哲学家拿到左右两根筷子而不造成死锁或饥饿现象。即同时拿起两根筷子,或对每名哲学家制定拿筷子的规则。
(3)信号量的设置:定义互斥信号量数组:chopstick[5]={1,1,1,1,1},用于对5个筷子的互斥访问,哲学家按序号0~4,哲学家i左边筷子的编号为i,哲学家右边筷子的编号为(i+1)%5。
该算法存在以下问题,当5名哲学家都想要进餐并且分别拿起左边筷子时,筷子都被拿光,等到他们再想去拿右边筷子时,就全被阻塞,因此出现了死锁。