信号量机制

信号量机制

信号量(Semaphore)机制是一种卓有成效的进程同步工具。

1,整型信号量

把整型信号量定义为一个表示资源数目的整型量S,除初始化外,仅能通过两个标准的原子操作wait(S)signal(S)来访问。

wait(S)和signal(S)操作可以描述为:

wait(S){
while( S <= 0) do no-op;   S--;}
signal(S){S++;}

wait(S)和signal(S)是两个原子操作,它们在执行时是不可中断的。当一个进程在修改某信号量时,没有其他进程能同时对该信号量进行修改。

在整型信号量机制中的wait操作中,只要是信号量S<=0,就会不断地测试。因此该机制没有遵循“让权等待”准则,而是使进程处于“忙等”的状态。

2,记录型信号量

Typedef struct{

Int value;

Struct process_control_block*list;

}semaphore;

Wait(semaphore *s){

S.value--;

If(s.value<0) block(s.list);

}

Signal(semaphore *s)

{s.value++;

If(s.value<=0) wakeup(s.list);}

在记录型信号量机制中,S.value 的初值表示系统中某类资源的数目,因而又称为资源信号量。当 S.value<0 时,表示该类资源已分配完毕,因此进程应调用 block 原语,进行自我阻塞,放弃处理机,并插入到信号量链表S.list 中。如果 S.value 的初值为 1,表示只允许一个进程访问临界资源,此时的信号量转化为互斥信号量,用于进程互斥。

s.value的意义是当信号量值大于0时表示可用资源的数目

s.value小于等于0绝对值为信号量上等待的进程数

2.4.4 信号量的应用
  1. 利用信号量实现进程互斥
  为使多个进程能互斥地访问某临界资源,只需为该资源设置一互斥信号量mutex,并设其初始值为1,然后将各进程访问该资源的临界区CS置于wait(mutex)和signal(mutex)操作之间即可。

 2. 利用信号量实现前趋关系
  还可利用信号量来描述程序或语句之间的前趋关系。设有两个并发执行的进程P1和P2。P1中有语句S1;P2中有语句S2。我们希望在S1执行后再执行S2。为实现这种前趋关系,只需使进程P1和P2共享一个公用信号量S,并赋予其初值为0,将signal(S)操作放在语句S1后面,而在S2语句前面插入wait(S)操作,即
  在进程P1中,用S1;signal(S);
  在进程P2中,用wait(S);S2;

2.4.5 管程机制
  1.管程的定义
  系统中的各种硬件资源和软件资源均可用数据结构抽象地描述其资源特性,即用少量信息和对该资源所执行的操作来表征该资源,而忽略它们的内部结构和实现细节。

  由上述的定义可知,管程由四部分组成:① 管程的名称;② 局部于管程的共享数据结构说明;③ 对该数据结构进行操作的一组过程;④ 对局部于管程的共享数据设置初始值的语句。图2-15是一个管程的示意图。

猜你喜欢

转载自blog.csdn.net/weixin_42387537/article/details/82871789