水善利万物而不争,处众人之所恶,故几于道💦
>利用信号量实现进程互斥
>利用信号量实现前驱关系
>利用记录型信号量实现同步
当信号量>=0
时,代表可供并发进程使用的资源数量当信号量<0
时,表示处于阻塞状态的进程的个数初始值为1
,然后将各进程访问资源的临界区CS置于wait(mutex)和signal(mutex)之间即可。
其初值为0
。
p1,p2两进程因合作完成一项任务而共用一个变量x。进程p2将处理结果送入x;进程P1将x的结果打印。
分析:
1.刚开始 empty 信号量=1 因为刚开始缓冲区是空的;full=0,缓冲区中没有数据,所以full=0
2.先看p2,因为p2往缓冲区中放入数据后,p1才能取出打印,所以先 wait(empty) ,申请到信号量后,将x放入缓冲区,然后将 full 信号量+1,p1才能申请到信号量(执行这一步的时候full信号量为0,p1申请不到信号量,只有这一步最后执行完将full+1,p1才能开始执行,也就实现了同步的效果
)
3.因为上一步最后把full信号量+1,所以p1可以申请到信号量,然后打印x,再将 empty 信号量+1
信号量提示:
技巧:前驱图中有几个有向边就设置几个信号量、执行前先要进行 wait-P 操作然后进行 signal-V 操作
利用信号量实现进程互斥:
进程互斥是指多个进程在访问共享资源时,需要相互排斥,以避免对共享资源的冲突访问。利用信号量可以很容易地实现进程互斥。我们可以为共享资源设置一个二元信号量,初始值为1,表示该资源可用。当一个进程要访问该共享资源时,它需要首先获取该信号量,将其减1,然后才能访问该资源。当该进程完成对该资源的访问后,需要将该信号量加1,表示该资源已经释放,其他进程可以访问该资源。这种方法可以确保同一时间只有一个进程可以访问该资源。
利用信号量实现前驱关系:
前驱关系是指一个节点在有向图中的前置节点。利用信号量可以很容易地实现前驱关系。我们可以为每个节点设置一个信号量,表示它是否可以被访问。当一个进程要访问某个节点时,它需要首先获取该节点的前置节点的信号量,然后才能获取该节点的信号量。如果前置节点的信号量为0,则当前进程需要等待,直到前置节点的信号量为1。这种方法可以确保每个节点只有在其前置节点完成访问后才能被访问。
利用信号量实现进程同步:
进程同步是指多个进程在执行过程中需要相互协调,以避免对共享资源的冲突访问。利用信号量可以很容易地实现进程同步。我们可以设置一个计数信号量,初始值为0,表示当前没有进程可以执行。当一个进程完成一定的操作后,需要将该信号量加1,表示有一个进程可以执行。当其他进程需要执行时,它们需要首先获取该信号量,如果信号量的值大于0,则可以执行,否则需要等待。当一个进程完成操作后,需要将该信号量减1,以便其他进程可以执行。这种方法可以确保多个进程在执行过程中相互协调,以避免对共享资源的冲突访问。