信号量 实现进程互斥与同步

  1. 信号量基本术语

    现代计算机系统中,多个进程可以并发执行,进程间必然存在共享资源和相互合作的问题。

    同步主要是用户多个进程相互协作,共同完成任务,是进程间的直接制约问题;互斥则主要是为了多个进程分时使用有限的资源。

    信号量(semaphore)是1965年由荷兰人Dijkstra提出的一种卓有成效的进程间同步及互斥工具。信号量在操作系统中实现时一般作为一个整数变量,这种信号量称为整型信号量。信号量S的物理意义:

    S >= 0表示某资源的可用数;

    S<0 其绝对值表示阻塞队列中等待该资源的进程数目;

信号量的两个操作方法是PV,P操作为S=S-1;表示申请一个资源,V操作为S=S+1;表示释放一个资源。因为对整数的加减1操作是在一个指令完成的,而硬件能够保证中断只能发生在指令之间,所以PV操作不会被中断打扰执行结果。

   P

  {

         S = S-1;

         if(s<0)

             Wait(S);  --------当前进程进入等待队列等待

   }



   V

   {

         S=S+1;

         if(S<=0)

             Resume(S); ----------唤醒等待队列中的一个进程

    }

2.利用信号量实现互斥

 初始化信号量mutex = 1; 当进程进入临界区时执行P操作,退出临界区时执行V操作。

   P(mutex)

     临界区代码;(操作互斥资源)

  V(mutex)
  1. 利用信号量实现同步

    此时可以把信号想象成代表一个消息。当S=0表示表示消息未产生;当S>0则表示消息已经产生。例如:

    (1)单缓冲区的生产者和消费者问题。

    生产者进程P1不断地生产产品送入缓冲区,消费者进程P2不断地从缓冲区中提取产品消费。为了实现P1与P2进程间的同步,需要设置一个信号量S1,并且初始化为1,表示缓冲区为空,可以将产品放入缓冲区中;还需要设置另一个另一个信号量S2,初始值为0,表示缓冲区没有产品,可以提取消费。

P1:生产一个产品—>P(S1)测试缓冲区是否为空—–>产品送缓冲区—->V(S2)设置有产品—->重复

P2: P(S2)测试是否有产品—–>从缓冲区取出产品——->V(S1)设置缓冲区为空——->消费—>重复

 (2)多缓冲区同步问题

  设有一个生产者和一个消费者,缓冲区可以存放n件物品,生产者不断地生产产品,消费者不断地消费产品。

 设置3个信号量,S, S1,S2。其中S是一个互斥信号量初值为1,对缓冲区资源进行互斥控制,S1表示是否可以将物品放入缓冲区,初值为n,S2表示缓冲区中是否有物品,初值为0。同步过程如下:

P1:生产一个产品—–>P(S1)—>P(S)—>产品送缓冲区—>V(S)—->V(S2)

P2:P(S2)——>P(S)—>从缓冲区取出一个产品—–>V(S)—–>V(S1)—–>消费

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值