PV操作
PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:
P(S):①将信号量S的值减1,即S=S-1;
②如果S>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
V(S):①将信号量S的值加1,即S=S+1;
②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。PV操作属于进程的低级通信。
生产者消费者
问题描述:一组成产者进程和一组消费者进程共享一个初始为空、大小为N的缓冲区。只有缓冲区没满时,生产者才能把消息放入缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。由于缓冲区时临界资源,它只允许一个生产者放入消息,或一个消费者从中取出消息。
解答:该问题需要设置三个信号量:mutex互斥锁,empty缓冲区剩余空间, full缓冲区已用空间。
不论是生产者还是消费者,都有在对mutex加锁之前,先对缓冲区进行检查。如果先对mutex加锁,就会发生死锁。例如(当前缓存区已满。生产者想要生产产品,于是他对mutex加锁,之后发现缓冲区已满,故进入等待,等消费者把商品取走。但是由于mutex被加锁,消费者无法进行操作,最终发生死锁。)
读者-写者问题
问题描述:有读者和写者两个并发进程,共享一个文件,当两个以上的读进程同时访问共享数据时不会产生副作用,但若某个进程和其他进程同时访问共享数据时则可能导致数据不一致的错误。因此要求。
- 允许多个读者可以同时对文件执行读操作。
- 只允许一个写者往文件里写信息。
- 任意写着在完成写操作之前,不允许其他读者或写者工作。
- 写者执行写操作之前,应让已有的读者和写者全部退出。
解:
对于写者,需要先判断当前有无读者,如果没有,就加写锁,进行写操作,否则就等待。
对于读者,需要维护一个计数器,该计算器记录了当前读者的数量,如果该读者是第一个,则加读锁,如果是最后一个,离开前释放读锁。
哲学家就餐
问题描述:一张圆桌边上坐着5名哲学家,每两名哲学家之间的桌子上摆一根筷子,两根筷子中间是一碗米饭。当哲学家饥饿时,会试图拿起左右两个筷子,若筷子已在他人手上,则需要等待。饥饿的哲学家只有同时拿起两根筷子才可以开始进餐,进餐完毕后,放下筷子继续思考。
解决:
一、要求同时申请两只筷子。
二、最多允许4个人同时就餐。
三、奇数号的先拿左边的筷子,偶数号的先拿右边的筷子。