进程同步与信号量
进程同步是指在多进程环境下,为了保证程序的正确性,协调多个进程按一定顺序执行。信号量是实现进程同步的重要工具,它本质上是一个特殊变量,通过对其进行 wait
(P 操作)和 signal
(V 操作)来控制进程的执行顺序和资源访问。
代码示例解读
- 信号量定义与初始化
semaphores s=0; //主要用于传递消息
这里定义了一个信号量 s
,并将其初始值设为 0
。初始值为 0
的信号量通常用于进程间的同步通信,起到传递消息的作用,即一个进程通过改变信号量的值来向另一个进程发送 “信号” 。
2. 进程 P1
P1()
{C1;signal(s);...
}
- 进程
P1
首先执行代码段C1
。 - 当
C1
执行完毕后,调用signal(s)
操作。signal
操作会将信号量s
的值加1
,此时s
的值从0
变为1
。这相当于P1
向其他进程发送了一个消息,表明C1
已经执行完成。
- 进程 P2
P2()
{...wait(s);C2;
}
- 进程
P2
在执行过程中,会先执行一些其他操作(代码中的...
部分 ) 。 - 然后执行
wait(s)
操作。wait
操作会将信号量s
的值减1
。由于s
初始值为0
,所以当P2
执行到wait(s)
时,s
的值变为-1
,此时P2
会被阻塞,进入等待状态。直到P1
执行完C1
并调用signal(s)
,使s
的值变为1
,P2
执行wait(s)
时s
的值变为0
,P2
才会被唤醒并继续执行后续的代码段C2
。
图示说明
图中展示了 C1
和 C2
的先后执行关系,箭头表示执行顺序,即 C1
先执行,然后 C2
才能执行。通过信号量 s
以及 wait
和 signal
操作,确保了进程 P1
中的 C1
先于进程 P2
中的 C2
运行,实现了两个进程之间的同步。
总结
这个例子通过信号量机制,巧妙地控制了两个进程中不同代码段的执行顺序,保证了 C1
比 C2
先运行,是利用信号量实现进程同步的一个典型应用。