一種帶配額的信號量的制作方法
【專利摘要】本發(fā)明公開一種帶配額的信號量,其包括一整型的變量、一睡眠調度隊列、一配額值及兩個操作(V與P),其運作如下:過程1:初始化,給該信號量一個非負數的整數值作為整型的變量X;給該信號量一個配額值作為限制值;過程2:運行V,變量X的值被增加,當該變量X的值增加到配額值時,將調用該信號量操作的進程掛到睡眠調度隊列進行休眠,直到有其他的進程調用P操作,該變量X的值被減少小于配額值,則重新喚醒被掛到睡眠調度隊列的進程;過程3:運行P,變量X的值被減少,當該變量X的值減到0時,將調用該信號量操作的進程掛到睡眠調度隊列進行休眠,直到有其他進程調用V操作,該變量X的值大于1,則重新喚醒被掛到睡眠調度隊列的進程。
【專利說明】一種帶配額的信號量
【技術領域】
[0001]本發(fā)明涉及信號量,具體涉及一種新穎的帶配額的信號量。
【背景技術】 [0002]眾所周知,現代計算機操作系統中有多種同步原語,例如信號量,自旋鎖,互斥鎖和條件變量等。它們都有各自應用的場景用來實現多個進程或多個線程之間的同步和互斥。其中,信號量(Semaphore)是以一個整數變量,提供信號,以確保在并行計算環(huán)境中,不同進程在訪問共享資源時,不會發(fā)生沖突。是一種不需要使用忙碌等待(busywaiting)的一種方法。信號量的概念是由荷蘭計算機科學家艾茲格?迪杰斯特拉(EdsgerW.Dijkstra)發(fā)明的,廣泛的應用于不同的操作系統中。在系統中,給予每一個進程一個信號量,代表每個進程目前的狀態(tài),未得到控制權的進程會在特定地方被強迫停下來,等待可以繼續(xù)進行的信號到來?,F在信號量機制已經被廣泛的應用到單處理機和多處理機系統以及計算機網絡中。
[0003]在實際使用中,信號量S具備兩種操作動作,之前稱為V (又稱signalO)與P(wait O)。V操作會增加信號量S的數值,P操作會減少它。其運作方式如下:
過程1:初始化,給與它一個非負數的整數值。
[0004]過程2:運行P (wait()),信號量S的值將被減少。企圖進入臨界區(qū)段的進程,需要先運行P (waito)。當信號量S減為負值時,進程會被擋住,不能繼續(xù);當信號量S不為負值時,進程可以獲準進入臨界區(qū)段。
[0005]過程3:運行V(又稱signal O ),信號量S的值會被增加。退出離開臨界區(qū)段的進程,將會運行V (又稱signal O)。當信號量S不為負值時,先前被擋住的其他進程,將可獲準進入臨界區(qū)段。
[0006]目前的信號量適用的場景是生產者一消費者應用。生產者即為產生消息的進程,消費者為獲取消息的進程。生產者生產資源(消息),消費者消耗資源(消息),當消費者消費資源的速度比生產者快的時候,資源降低為零時,消費者將被調度休眠,直到生產者生產出更多的可用的資源。同時,從上面所述的場景中可以看到,信號量這種同步原語,不考慮生產者能力遠大于消費者能力的場景。
【發(fā)明內容】
[0007]因此,針對上述的問題,本發(fā)明提出一種帶配額的信號量,該帶配額的信號量是一種信號量的變種,也是一種新的同步原語,針對消費消息的進程無法快速消費足夠多的消息的情況進行考慮,且能夠解決一些更為復雜問題,從而解決現有技術之不足。
[0008]為了解決上述技術問題,本發(fā)明所采用的技術方案是,一種帶配額的信號量,包括一個整型的變量、一個睡眠調度隊列以及一個配額值,該信號量包括兩個操作,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]優(yōu)選的,所述配額值為整型配額值,是對生產者的生產能力的限制值,該配額值如果沒有預設,則默認為無窮大。這樣,在默認的情況下,這種帶配額的信號量就退化為原來的信號量,即可作為普通信號量來使用。
[0010]本發(fā)明的所謂帶配額的信號量是對生產者的一種限制。這種同步原語和信號量一樣,有一個整型的信號量值,但是除此之外,本發(fā)明的帶配額的信號量要引入一個整型變量作為配額值。同樣與信號量相似,新的同步原語(該帶配額的信號量)也有P操作(消費操作),v操作(生產操作)。當V操作時,信號量值加1,當對信號量做P操作時,信號量值減1,當信號量值減到等于O時,調用信號量P操作的進程被掛到睡眠隊列上睡眠,直到有其他的進程調用V操作時,信號量值大于1,被睡眠的消費者進程才被喚醒繼需處理。與信號量不同的是,帶配額的信號量當生產者進程調用V操作,將信號量值加I直到等于配額值時,生產者進程同樣也要被掛到睡眠隊列上睡眠,直到其他的消費者進程的P操作將信號量的值減小到小于配額值時,生產者進程才能被喚醒繼續(xù)執(zhí)行。
[0011]此發(fā)明通過上述方法,采用了一個帶配額的信號量概念,不但能夠解決傳統信號量所解決的問題,而且還能解決更多的復雜問題,如共享內存進程間通訊就可以用帶配額的信號量很簡單的解決。傳統的信號量其實是本發(fā)明提出的“帶配額的信號量”的一個特例,那既是配額值無窮大的“帶配額的信號量”。通過將無法繼續(xù)操作的進程進入休眠狀態(tài),可減少系統資源的消耗。本發(fā)明創(chuàng)新性的提出了一種帶配額的信號量概念,對原信號量的同步原語進行改進,而產生一種更高效率的進程間通信的工具,解決了生產者生產了太多的消息而獲取者來不及處理的問題,其具有很好的實用價值。
【具體實施方式】
[0012]現結合【具體實施方式】對本發(fā)明進一步說明。
[0013]現有技術中的信號量這種同步原語,不考慮生產者能力遠大于消費者能力的場景。讓舉一個例子說明。用共享內存進行進程間通信,將一片共享內存劃分多個郵箱槽位用來傳遞消息。每次生產者進程從共享內存中分配一個郵箱,寫入信息,通知消費者進程提取信息。這時候需要一個同步原語來做兩個進程間的同步。信號量是很自然想到的一種選擇,但是如果生產者發(fā)送信息的速度遠大于消費者進程的話,意味著有可能生產者分配光所有的共享內存槽位之后,在消費者還沒來得及處理之前就會重用沒有處理的共享內存槽位,這樣就會導致消息的丟失。究其原因,是對生產者沒有限制。所以本發(fā)明提出一種新的操作系統進程間,線程間的同步原語“帶配額的信號量”。
[0014]本發(fā)明提出的帶配額的信號量,其實是一種新型的信號量,它不但能夠解決傳統信號量所解決的問題,而且還能解決更多的復雜問題,如上所述的共享內存進程間通訊就可以用帶配額的信號量很簡單的解決。傳統的信號量其實是本發(fā)明提出的“帶配額的信號量”的一個特例,那既是配額值無窮大的“帶配額的信號量”。
[0015]具體的,本發(fā)明的一種帶配額的信號量,包括一個整型的變量,一個配額值(默認值為無窮大),一個睡眠調度隊列,兩個操作(P操作和V操作)。
[0016]其中,一個整型變量X就是信號量的值。
[0017]一個整型配額值Quota就是對生產者的生產能力的限制值,由用戶定義,如果不定義默認值就是無窮大(在默認值的情況下,這種同步原語就退化成了原來的信號量)。
[0018]一個睡眠隊列,這個睡眠隊列與計算機操作系統的調度隊列相關,任何線程或任務滿足睡眠條件,進入睡眠隊列,則暫時掛起任務,讓出CPU的執(zhí)行,進入睡眠隊列睡眠;直到睡眠條件解除,再次將睡眠隊列中的任務或進程喚醒,設置成可以執(zhí)行的狀態(tài),允許CPU調度執(zhí)行這個進程/任務。上述的睡眠條件有兩個:a:生產者線程將信號量值加到了等于配額值,將生產者進程掛到睡眠隊列;b:消費者將信號量減為了 0,將消費者線程掛入到睡眠隊列。
[0019]兩個操作:V操作,生產者線程對信號量值做原子加I ;P操作,消費者線程對信號量做原子減I。
[0020]有了以上的元素就可以實現一個帶配額的信號量并且可以將其應用于各種各樣的生產者/消費者模型的應用中了。
[0021]所謂帶配額的信號量是對生產者的一種限制。這種同步原語和信號量一樣,有一個整型的信號量值,但是除此之外,的帶配額的信號量要引入一個整型變量作為配額值。同樣與信號量相似,新的同步原語也有V操作(生產操作),P操作(消費操作)。當V操作時,信號量值加1,當對信號量做P操作時,信號量值減1,當信號量值減到等于O時,調用信號量P操作的進程被掛到睡眠隊列上睡眠,直到有其他的進程調用V操作時,信號量值大于1,被睡眠的消費者進程才被喚醒繼需處理。與信號量不同的是,帶配額的信號量當生產者進程調用V操作,將信號量值加I直到等于配額值時,生產者進程同樣也要被掛到睡眠隊列上睡目民,直到其他的消費者進程的P操作將信號量的值減小到小于配額值時,生產者進程才能被喚醒繼續(xù)執(zhí)行。
[0022]舉個實際的例子比如:在使用銀行的業(yè)務管理系統時,用戶需要領取號碼。如果沒有用戶取號,銀行的工作人員就不會工作,如果有用戶取了號碼,則表明有用戶排隊,則工作人員需要工作。取號的用戶即可抽象為“生產者”,工作人員可抽象為“消費者”。工作人員處理的速度快,很快就沒有用戶排隊,則工作人員停止工作,直到下一個用戶取了號碼排隊,工作人員又開始工作。這就是日常生活中的生產者消費者模型。從上可知,每次有用戶取號就意味著生產者做了 V操作,工作人員處理一個用戶的事務,就意味著消費者P操作。把號碼的數目認為是一個變量X,V操作導致X+1,P操作導致X-1。當X減為零則表明消費者停止消費,一旦X不再為零,則消費者開始消費。如果使用傳統的信號量來解決上述問題,因為其忽略了生產者生產能力過剩的問題,如果消費者處理的速度慢,生產者生產的速度過快,銀行的業(yè)務管理系統就無法繼續(xù)正常運轉。因此,本發(fā)明對現有的信號量進行改進形成一個新的信號量機制,不僅對消費者的能力做限制,還對生產者的能力做限制,例如生產者有一個配額值20,那么當X等于20時,生產者也進入休眠,直到X的值小于20,才發(fā)下一個號碼。由此可見,采用本發(fā)明的帶配額的信號量,可以很好的解決上述問題。[0023]盡管結合優(yōu)選實施方案具體展示和介紹了本發(fā)明,但所屬領域的技術人員應該明白,在不脫離所附權利要求書所限定的本發(fā)明的精神和范圍內,在形式上和細節(jié)上可以對本發(fā)明做出各種變化,均為本發(fā)明的保護范圍。
【權利要求】
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日 優(yōu)先權日:2014年1月29日
【發(fā)明者】吳江 申請人:賽凡信息科技(廈門)有限公司