文章目录
- PV操作实现互斥
- PV操作实现同步
- 高级通信
PV操作实现互斥
PV操作实现互斥。先明确临界资源是什么,然后确定信号量的初值。实现互斥时,一般是执行P操作,进入临界区,出临界区执行V操作。
以统计车流量为例。临界资源是记录统计值的COUNT,一次只运行一个进程修改这个共享变量。信号量mutex的初值是1。
观察者观察到有车通过时,对mutex执行P操作,mutex变为0,此时不允许其他进程进入临界区。观察者让COUNT值加一,完成操作后,离开临界区,执行V操作,mutex变为1。
报告者执行P操作,mutex变为0,此时不允许其他进程进入临界区。报告者打印出COUNT,然后将COUNT值置为0。报告者离开临界区,执行V操作,mutex变为1。
PV操作实现同步
PV操作实现同步。首先明确有哪些进程关心的消息,确定消息的初始值。
以单缓冲区的生产者消费者系统为例,生产者关心缓冲区当前是否空闲,用S1表示,初值设为1,表示空闲状态。消费者关心缓冲区有没有产品,用S2表示,初值设为0,表示无产品。
生产者生产一个产品,对S1执行P操作,S1的数值变为0,生产者将产品送入缓冲区。然后对S2执行V操作,S2的数值变为1,表示缓冲区现在有产品啦。
消费者对S2执行P操作,S2的数值变为0,消费者从缓冲区取出一个产品。然后对S1执行V操作,S1的数值变为1,表明缓冲区处于空闲状态。
高级通信
PV是低级的通信操作,编程难度大,效率低。因此,人们开发了高级的通信方式,降低编程难度,提高通信效率。高级通信包含共享存储模式、消息传递模式、管道通信。
- 共享存储模式:通信的进程共享某些数据结构/存储区,实现进程间的通信。
- 消息传递模式:使用通信命令Send, Receive实现通信。分为3种,直接将消息发送给进程,将消息投放到邮箱,发送消息时用Tag标记是否要等接收到消息再继续进行。
- 管道通信:连接一个读进程和一个写进程,可以大量传输数据。