第二章 2.3 信号量机制

整形信号量:

  • 信号量定义为一个整型量;
  • 根据初始情况赋相应的值;
  • 仅能通过两个原子操作来访问
		 P 操作:
		 wait(S):	 
             While S<=0 do no-op; 
             S:=S-1;
         V 操作:
         signal(S):	  
             S:=S+1;

在这里插入图片描述

整型信号量符合“有限等待”原则,但不符合“让权等待”原则

记录性信号量:

  • 不仅要有值的处理,还有队列的处理。
  • 此时形成记录型数据结构,包括两部分:
    - 整型变量value(代表资源数目)
    - 进程链表L(链接所有等待进程):
  • 代码描述:
        type  Semaphore=record
             value:integer;
	         L:list  of  PCB;
	    end;
  • 操作:S.Value,S.L
P、V 操作:
P操作wait():
    S.value = S.value - 1;
    if  S.value < 0  then  block(S,L)

V操作signal():
    S.value = S.value + 1;
    if  S.value <= 0 then wakeup(S,L)

  • 定义信号量semaphore代表可用资源实体的数量,又叫信号灯
    - 当≥0,代表可供并发进程使用的资源实体数
    - 当<0,表示正在等待使用该资源的进程数
  • 建立一个信号量必须经过说明,包括:
    - 信号量所代表的意义
    - 赋初值
    - 建立相应的数据结构,以便指向等待使用临界区的进程。
  • 除初值外,信号量的值仅能由标准原子操作P、V操作来改变
信号量的基本应用:
  • 实现进程互斥
  • 实现进程间的前趋关系( 有序 )
互斥信号量注意点:
  • 互斥信号量mutex初值为1;
  • 每个进程中将临界区代码置于P(mutex)和V(mutex)原语之间
  • 必须成对使用P和V原语(在同一进程中),不能次序错误、重复或遗漏:
    - 遗漏P原语则不能保证互斥访问
    - 遗漏V原语则不能在使用临界资源之后将其释放(给其他等待的进程)
控制同步顺序的注意点:
  • 信号量值为0的点是限制的关键所在;
  • 成对使用P和V原语(在有先后关系的两个进程中),不能次序错误、重复或遗漏,否则同步顺序出错

AND 型信号量

  • 出现原因:一些应用往往需要两个或多个共享资源,而不是前述的一个资源。进程同时要求的共享资源越多,发生死锁可能性越大
    在这里插入图片描述
Swait(S1, S2,, Sn)
    if (S1 >=1 andand Sn>=1 )then
        for i:=1 to n do
           Si:= Si -1 ;
        endfor
    else
       将进程阻塞在第一个不能满足资源信号量的队列中。
   endif

Ssignal(S1, S2,, Sn)
    for i:=1 to n do
       Si:= Si +1 ;
       唤醒所以与si相关的阻塞进程
    endfor  
信号量集:

优点:

  • 每次只能获得或释放一个单位的资源,低效;
  • 某些时候资源分配有下限的限制;
  • 修改:在大于可分配设置的下界值t前提下,每次可分配d个
信号量题目做题一般方法:
  • 分析问题,找出同步、互斥关系
  • 根据资源设置信号量变量
  • 写出代码过程,并注意P、V操作的位置
  • 检查代码,模拟机器运行,体验信号量的变化和程序运行过程是否正确
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值