信号量机制

一、信号量的定义

交通灯的作用是什么?我们如何通过交通灯的指示来判断是否能通过?

信号量,也叫信号灯,是一个确定的二元组(S,Q),其中S是个具有非负初值的整型变量,且S的值只能由定义在信号量上的P操作原语和V操作原语来改变,而Q是个初始状态为空的队列。

记录型信号量是一个记录型的数据结构,包含两个数据项,一个是计数值域,另一个是等待该信号量的进程队列首指针域。记录型信号量结构可以描述如下:

  typedef struct semaphore

  {

   int S;

   PCB *Q;

   };

二、P、V操作原语

P原语操作过程:

1.S减1;

2.若S减1后仍大于或等于零,则调用P原语的进程继续执行;

3.若S减1后小于零,则该进程被阻塞到与该信号相对应的队列Q中,然后转进程调度。

V原语操作过程:

1.S加1;

2.若相加后的S大于零,则进程继续执行;

3.若相加后的S小于或等于零,则从该信号的等待队列Q中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。

试分析该订票系统如何实现了互斥?若为前例(栈)用P、V操作实现互斥,该如何改写程序?

对售票例的修改。设s初值=1。

  • Procedure p1

begin

………………

P(s)

x ←read(file)

if(x>0) then

begin

x ←x-1

writeln(x,file)

end

V(s)

………………

end;

  • Procedure p2

begin

………………

P(s)

x ←read(file)

if(x>0) then

begin

x ←x-1

writeln(x,file)

end

V(s)

………………

end;

栈的P、V实现互斥。设s初值=1。(方法同上)

用P、V操作实现互斥的一般形式

设信号量s初值为1

甲进程:

其它代码;

P(s);

甲进程的临界区;

V(s);

其它代码;

乙进程:

其它代码;

P(s);

乙进程的临界区;

V(s);

其它代码;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值