一种带配额的信号量的制作方法

文档序号:6537377阅读:140来源:国知局
一种带配额的信号量的制作方法
【专利摘要】本发明公开一种带配额的信号量,其包括一整型的变量、一睡眠调度队列、一配额值及两个操作(V与P),其运作如下:过程1:初始化,给该信号量一个非负数的整数值作为整型的变量X;给该信号量一个配额值作为限制值;过程2:运行V,变量X的值被增加,当该变量X的值增加到配额值时,将调用该信号量操作的进程挂到睡眠调度队列进行休眠,直到有其他的进程调用P操作,该变量X的值被减少小于配额值,则重新唤醒被挂到睡眠调度队列的进程;过程3:运行P,变量X的值被减少,当该变量X的值减到0时,将调用该信号量操作的进程挂到睡眠调度队列进行休眠,直到有其他进程调用V操作,该变量X的值大于1,则重新唤醒被挂到睡眠调度队列的进程。
【专利说明】一种带配额的信号量
【技术领域】
[0001]本发明涉及信号量,具体涉及一种新颖的带配额的信号量。
【背景技术】 [0002]众所周知,现代计算机操作系统中有多种同步原语,例如信号量,自旋锁,互斥锁和条件变量等。它们都有各自应用的场景用来实现多个进程或多个线程之间的同步和互斥。其中,信号量(Semaphore)是以一个整数变量,提供信号,以确保在并行计算环境中,不同进程在访问共享资源时,不会发生冲突。是一种不需要使用忙碌等待(busywaiting)的一种方法。信号量的概念是由荷兰计算机科学家艾兹格?迪杰斯特拉(EdsgerW.Dijkstra)发明的,广泛的应用于不同的操作系统中。在系统中,给予每一个进程一个信号量,代表每个进程目前的状态,未得到控制权的进程会在特定地方被强迫停下来,等待可以继续进行的信号到来。现在信号量机制已经被广泛的应用到单处理机和多处理机系统以及计算机网络中。
[0003]在实际使用中,信号量S具备两种操作动作,之前称为V (又称signalO)与P(wait O)。V操作会增加信号量S的数值,P操作会减少它。其运作方式如下:
过程1:初始化,给与它一个非负数的整数值。
[0004]过程2:运行P (wait()),信号量S的值将被减少。企图进入临界区段的进程,需要先运行P (waito)。当信号量S减为负值时,进程会被挡住,不能继续;当信号量S不为负值时,进程可以获准进入临界区段。
[0005]过程3:运行V(又称signal O ),信号量S的值会被增加。退出离开临界区段的进程,将会运行V (又称signal O)。当信号量S不为负值时,先前被挡住的其他进程,将可获准进入临界区段。
[0006]目前的信号量适用的场景是生产者一消费者应用。生产者即为产生消息的进程,消费者为获取消息的进程。生产者生产资源(消息),消费者消耗资源(消息),当消费者消费资源的速度比生产者快的时候,资源降低为零时,消费者将被调度休眠,直到生产者生产出更多的可用的资源。同时,从上面所述的场景中可以看到,信号量这种同步原语,不考虑生产者能力远大于消费者能力的场景。

【发明内容】

[0007]因此,针对上述的问题,本发明提出一种带配额的信号量,该带配额的信号量是一种信号量的变种,也是一种新的同步原语,针对消费消息的进程无法快速消费足够多的消息的情况进行考虑,且能够解决一些更为复杂问题,从而解决现有技术之不足。
[0008]为了解决上述技术问题,本发明所采用的技术方案是,一种带配额的信号量,包括一个整型的变量、一个睡眠调度队列以及一个配额值,该信号量包括两个操作,V(signalO)与P (wait O ),其运作方式如下:
过程1:初始化,给该信号量一个非负数的整数值作为整型的变量X ;同时,给该信号量一个配额值作为限制值;
过程2:运行V(signal O ),变量X的值被增加,当该变量X的值增加到配额值时,将调用该信号量操作的进程挂到睡眠调度队列进行休眠,直到有其他的进程调用P操作,该变量X的值被减少小于配额值,则重新唤醒被挂到睡眠调度队列的进程;
过程3:运行P(wait O ),变量X的值被减少,当该变量X的值减到O时,将调用该信号量操作的进程挂到睡眠调度队列进行休眠,直到有其他的进程调用V操作,该变量X的值被增加大于1,则重新唤醒被挂到睡眠调度队列的进程。
[0009]优选的,所述配额值为整型配额值,是对生产者的生产能力的限制值,该配额值如果没有预设,则默认为无穷大。这样,在默认的情况下,这种带配额的信号量就退化为原来的信号量,即可作为普通信号量来使用。
[0010]本发明的所谓带配额的信号量是对生产者的一种限制。这种同步原语和信号量一样,有一个整型的信号量值,但是除此之外,本发明的带配额的信号量要引入一个整型变量作为配额值。同样与信号量相似,新的同步原语(该带配额的信号量)也有P操作(消费操作),v操作(生产操作)。当V操作时,信号量值加1,当对信号量做P操作时,信号量值减1,当信号量值减到等于O时,调用信号量P操作的进程被挂到睡眠队列上睡眠,直到有其他的进程调用V操作时,信号量值大于1,被睡眠的消费者进程才被唤醒继需处理。与信号量不同的是,带配额的信号量当生产者进程调用V操作,将信号量值加I直到等于配额值时,生产者进程同样也要被挂到睡眠队列上睡眠,直到其他的消费者进程的P操作将信号量的值减小到小于配额值时,生产者进程才能被唤醒继续执行。
[0011]此发明通过上述方法,采用了一个带配额的信号量概念,不但能够解决传统信号量所解决的问题,而且还能解决更多的复杂问题,如共享内存进程间通讯就可以用带配额的信号量很简单的解决。传统的信号量其实是本发明提出的“带配额的信号量”的一个特例,那既是配额值无穷大的“带配额的信号量”。通过将无法继续操作的进程进入休眠状态,可减少系统资源的消耗。本发明创新性的提出了一种带配额的信号量概念,对原信号量的同步原语进行改进,而产生一种更高效率的进程间通信的工具,解决了生产者生产了太多的消息而获取者来不及处理的问题,其具有很好的实用价值。
【具体实施方式】
[0012]现结合【具体实施方式】对本发明进一步说明。
[0013]现有技术中的信号量这种同步原语,不考虑生产者能力远大于消费者能力的场景。让举一个例子说明。用共享内存进行进程间通信,将一片共享内存划分多个邮箱槽位用来传递消息。每次生产者进程从共享内存中分配一个邮箱,写入信息,通知消费者进程提取信息。这时候需要一个同步原语来做两个进程间的同步。信号量是很自然想到的一种选择,但是如果生产者发送信息的速度远大于消费者进程的话,意味着有可能生产者分配光所有的共享内存槽位之后,在消费者还没来得及处理之前就会重用没有处理的共享内存槽位,这样就会导致消息的丢失。究其原因,是对生产者没有限制。所以本发明提出一种新的操作系统进程间,线程间的同步原语“带配额的信号量”。
[0014]本发明提出的带配额的信号量,其实是一种新型的信号量,它不但能够解决传统信号量所解决的问题,而且还能解决更多的复杂问题,如上所述的共享内存进程间通讯就可以用带配额的信号量很简单的解决。传统的信号量其实是本发明提出的“带配额的信号量”的一个特例,那既是配额值无穷大的“带配额的信号量”。
[0015]具体的,本发明的一种带配额的信号量,包括一个整型的变量,一个配额值(默认值为无穷大),一个睡眠调度队列,两个操作(P操作和V操作)。
[0016]其中,一个整型变量X就是信号量的值。
[0017]一个整型配额值Quota就是对生产者的生产能力的限制值,由用户定义,如果不定义默认值就是无穷大(在默认值的情况下,这种同步原语就退化成了原来的信号量)。
[0018]一个睡眠队列,这个睡眠队列与计算机操作系统的调度队列相关,任何线程或任务满足睡眠条件,进入睡眠队列,则暂时挂起任务,让出CPU的执行,进入睡眠队列睡眠;直到睡眠条件解除,再次将睡眠队列中的任务或进程唤醒,设置成可以执行的状态,允许CPU调度执行这个进程/任务。上述的睡眠条件有两个:a:生产者线程将信号量值加到了等于配额值,将生产者进程挂到睡眠队列;b:消费者将信号量减为了 0,将消费者线程挂入到睡眠队列。
[0019]两个操作:V操作,生产者线程对信号量值做原子加I ;P操作,消费者线程对信号量做原子减I。
[0020]有了以上的元素就可以实现一个带配额的信号量并且可以将其应用于各种各样的生产者/消费者模型的应用中了。
[0021]所谓带配额的信号量是对生产者的一种限制。这种同步原语和信号量一样,有一个整型的信号量值,但是除此之外,的带配额的信号量要引入一个整型变量作为配额值。同样与信号量相似,新的同步原语也有V操作(生产操作),P操作(消费操作)。当V操作时,信号量值加1,当对信号量做P操作时,信号量值减1,当信号量值减到等于O时,调用信号量P操作的进程被挂到睡眠队列上睡眠,直到有其他的进程调用V操作时,信号量值大于1,被睡眠的消费者进程才被唤醒继需处理。与信号量不同的是,带配额的信号量当生产者进程调用V操作,将信号量值加I直到等于配额值时,生产者进程同样也要被挂到睡眠队列上睡目民,直到其他的消费者进程的P操作将信号量的值减小到小于配额值时,生产者进程才能被唤醒继续执行。
[0022]举个实际的例子比如:在使用银行的业务管理系统时,用户需要领取号码。如果没有用户取号,银行的工作人员就不会工作,如果有用户取了号码,则表明有用户排队,则工作人员需要工作。取号的用户即可抽象为“生产者”,工作人员可抽象为“消费者”。工作人员处理的速度快,很快就没有用户排队,则工作人员停止工作,直到下一个用户取了号码排队,工作人员又开始工作。这就是日常生活中的生产者消费者模型。从上可知,每次有用户取号就意味着生产者做了 V操作,工作人员处理一个用户的事务,就意味着消费者P操作。把号码的数目认为是一个变量X,V操作导致X+1,P操作导致X-1。当X减为零则表明消费者停止消费,一旦X不再为零,则消费者开始消费。如果使用传统的信号量来解决上述问题,因为其忽略了生产者生产能力过剩的问题,如果消费者处理的速度慢,生产者生产的速度过快,银行的业务管理系统就无法继续正常运转。因此,本发明对现有的信号量进行改进形成一个新的信号量机制,不仅对消费者的能力做限制,还对生产者的能力做限制,例如生产者有一个配额值20,那么当X等于20时,生产者也进入休眠,直到X的值小于20,才发下一个号码。由此可见,采用本发明的带配额的信号量,可以很好的解决上述问题。[0023]尽管结合优选实施方案具体展示和介绍了本发明,但所属领域的技术人员应该明白,在不脱离所附权利要求书所限定的本发明的精神和范围内,在形式上和细节上可以对本发明做出各种变化,均为本发明的保护范围。
【权利要求】
1.一种带配额的信号量,其特征在于:包括一个整型的变量、一个睡眠调度队列以及一个配额值,该信号量包括两个操作,V与P,其运作方式如下: 过程1:初始化,给该信号量一个非负数的整数值作为整型的变量X;同时,给该信号量一个配额值作为限制值; 过程2:运行V,变量X的值被增加,当该变量X的值增加到配额值时,将调用该信号量操作的进程挂到睡眠调度队列进行休眠,直到有其他的进程调用P操作,该变量X的值被减少小于配额值,则重新唤醒被挂到睡眠调度队列的进程; 过程3:运行P,变量X的值被减少,当该变量X的值减到O时,将调用该信号量操作的进程挂到睡眠调度队列进行休眠,直到有其他的进程调用V操作,该变量X的值被增加大于1,则重新唤醒被挂到睡眠调度队列的进程。
2.根据权利要求1所述的带配额的信号量,其特征在于:所述配额值为整型配额值。
【文档编号】G06F9/52GK103761155SQ201410043415
【公开日】2014年4月30日 申请日期:2014年1月29日 优先权日:2014年1月29日
【发明者】吴江 申请人:赛凡信息科技(厦门)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1