0
点赞
收藏
分享

微信扫一扫

同步与互斥的概念


如果两个或以上的进程间存在时序关系(即有先后),需要协同工作以完成一项任务,称为同步

如果它们纯粹只是因为共享具有排它性的资源时所产生的关系,称为互斥

信号量

信号量是实现互斥的方法之一。与之配合一起的是PV原语操作。

  • Semaphore S (信号量S)
  • Operation P :P操作原语,P是荷兰语Proberen的首字母,意为尝试
  • Operation V:V操作原语,V是荷兰语verhogen的首字母,意为增加

信号量S用于指示当前共享资源的可用数量。
当尝试去使用一个这类共享资源时,调用P操作原语将信号量S减1,表示共享资源可用数量减少一个。
当使用完一个这类共享资源时,归还给系统时,调用V操作原语将信号量增加1,表示共享资源可用数量增加一个。

我们用一个例子来说明一下, 这个例子仅代表个人观点:
假如两个进程通过一块共享内存进行数据通信,它们不能同时去读、写这块内存,那么我们现在用信号量的方式来控制。

根据我们的假设,可用资源(共享内存块)的数量为1,因此设置我们的信号量S等于1
当进程想操作共享内存块时,先执行P操作,将S减少1
当进程退出操作共享内存块时,执行V操作,将S增加1

首先,我们来分析P操作的过程。

  1. 进程尝试使用共享资源,执行P操作,S就会减少1
  2. 因为我们的可用资源数量是1,那么S的结果在执行P操作后,仍然大于或等于0,说明共享资源此时是可以被使用的,因此进程可以开始操作共享资源。
  3. 如果S的结果是小于0的,说明共享资源此时不可以被使用(因为此时它可能正在被其他进程使用着),这种情况下,将进程的相关对象加入等待队列中,等待共享资源。
  4. 当共享资源被释放后,在等待队列中的相关对象会被“唤醒”,被唤醒的对象就可以使用共享资源了。

V操作过程:

  1. 在释放资源时,调用V操作,将信号量增加1,表示可用共享资源数增加1,
  2. 如果信号量此时的结果大于0,说明此时等待队列里没有等待者,直接返回
  3. 如果信号量小于或等于0,说明此时等待队列里有等待者,此时它就要去唤醒等待队列中的对象,让唤醒的对象使用资源,

Created with Raphaël 2.3.0 P原语 S = S - 1 S >= 0 返回 加入等待队列 yes no


Created with Raphaël 2.3.0 V原语 S = S + 1 S > 0 返回 从等待队列唤醒一个等待者 yes no


信号量在简单的应用场景很适合,不过对于庞大又复杂的系统,就会很困难,它的易读性会越来越差。


举报

相关推荐

0 条评论