操作系统之-----信号量机制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WannerWang/article/details/49556479


信号量机制是一种卓越成效的进程同步工具,信号量机制已经被广泛的使用于单处理机,和多处理系统的计算机网络中。

信号量S是一个整数,S大于等于零代表可供并发进程使用的资源实体数,当S小于零时则表示正在等待使用临界区的进程数,

整型信号量:

整型信号量定义一个用于表示资源数目的整型量数目,但是仅能通过两个原子操作waits)和sigal s)来访问,

while S{

whileS<=0 ); 

s--

}

singal s{

S++;

}

wait s)与singal S)是原子操作,,执行是不可中断的。

整型信号量缺点:

在整型信号量中,只要信号量是是s<=0 就会不断的测试,并未遵循“让权等待原则”,而使进程处于忙等状态。

记录型信号量:

定义了一个用于代表资源数目的整型变量value,还应增加一个进程链表指针 list用于连接所有的等待进程。

如下:

typedef Struct {

int value 

struct process_contral_block *list ;

}semaphore;

wait ( S) signl (S) 如下:

wait ( semaphore  *s{

s->value --;

if (S->value <= 0 ) block (S->list);

}

singal (semaphore  * s)

{

 S->value ++;

 if (s->value++) 

  wakeup (s->list)

}

s->value代表系统中某类资源的数目,对其进行wait操作,意味着进程请求一个单位的该类资源,使系统中可供分配的该类资源数目减少一个,当s.value<0 表示该资源已经分配完毕,该进程调用阻塞原语将自己阻塞,放弃处理机,并插入信号量链表中,其遵循让权等待,

此时s->value表示的绝对值表示在信号量链队阻塞的进程数目,对信号量的每次signl操作表示执行进程释放一个单元的资源,使系统中可供分配的的该类资源数增加一个。若加1s->value<=0 ,表示在信号量链队中仍有等待该资源的进程被阻塞。故应调动wakeup原语。

AND型信号量

将进程在整个运行过程中的所有资源,一次性全部分配给进程,进程使用完后再一次性释放,只要一个进程尚未分配成功,其他所有为之分配的资源也不分配给它。

信号量集:

AND信号量机制加以扩充,对进程所申请的所有资源以及每类资源不同的资源需求量,在一次pv原语操作中完成申请或释放。

 

 

 

 

 

 

展开阅读全文

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