信号量机制

一、信号量的定义

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

信号量,也叫信号灯,是一个确定的二元组(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);

其它代码;

展开阅读全文

没有更多推荐了,返回首页