專利名稱:一種利用信號量實現(xiàn)的序列號生成方法和生成器的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種多進程與多線程環(huán)境下獲取唯一序列號的方法和序列號生成器。
背景技術(shù):
在互聯(lián)網(wǎng)數(shù)據(jù)傳輸中,經(jīng)常要用到唯一的序列號。傳統(tǒng)方式一般采用計數(shù)器加線程鎖進行控制,而在多進程環(huán)境下,該方法存在序列號重復(fù)等問題。也有采用從數(shù)據(jù)庫讀取序列號,該方法雖然能保證唯一,但是效率低下,無法支持高并發(fā)。因此,本發(fā)明所要解決的問題是如何在多進程、多線程、高并發(fā)的環(huán)境中保證序列號的唯一性。
發(fā)明內(nèi)容
本發(fā)明的目的之一是提供一種序列號生成方法,保證在多進程與多線程高發(fā)情況下序列號的唯一性,該方法包括如下流程步驟I,輸入鏈路編號;步驟2,打開信號量,獲取信號量ID ;步驟3,如果信號量ID獲取成功,對信號量進行加鎖操作;步驟4,判斷鏈路編號是否在合理范圍內(nèi),如果是,則根據(jù)鏈路編號計算序列號;其中,根據(jù)鏈路編號計算序列號具體為,找到鏈路編號對應(yīng)的計數(shù)器,進行累加,生成序列號。步驟5,判斷序列號是否達到最大值,如果否,直接執(zhí)行步驟6 ;步驟6,對信號量進行解鎖操作,釋放其占用的資源,然后返回序列號。上述步驟3進一步包括,如果信號量I D獲取不成功,則創(chuàng)建信號量,如果信號量創(chuàng)建成功,則對信號量進行加鎖,如果信號量創(chuàng)建不成功,則獲取信號失敗,結(jié)束流程。上述步驟5進一步包括,如果序列號達到了最大值,則將此序列號重新置為初始值,然后執(zhí)行步驟6。本發(fā)明的目的之二是提供一種序列號生成器,保證在多進程與多線程高發(fā)情況下序列號的唯一丨I"生,該序列號生成器包括輸入單元,用以輸入鏈路編號;獲取單兀,用以打開信號量,獲取信號量ID ;加鎖單元,用以在信號量ID獲取成功后,對信號量進行加鎖操作;序列號生成單元,判斷鏈路編號是否在合理范圍內(nèi),如果是,則根據(jù)鏈路編號計算序列號;
判斷單元,判斷序列號是否達到最大值;解鎖單元,如果序列號未達到最大值,對信號量進行解鎖操作,釋放其占用的資源,然后返回序列號。其中,序列號生成單元根據(jù)鏈路編號計算序列號具體為,找到鏈路編號對應(yīng)的計數(shù)器,進行累加,生成序列號。
該序列號生成器進一步包括信號量創(chuàng)建單元,用于當信號量ID獲取不成功時,創(chuàng)建信號量,如果信號量創(chuàng)建成功,則由加鎖單元對信號量進行加鎖,如果信號量創(chuàng)建不成功,則獲取信號失敗,結(jié)束流程。該序列號生成器更進一步包括序列號重置單元,用以當判斷單元判斷序列號達到了最大值時,則將此序列號重新置為初始值,然后再由解鎖單元進行解鎖操作。本發(fā)明的有益效果是I)采用本發(fā)明獲取唯一序列號時,可以直接移植,無須改動。可以設(shè)定序列號的起始值,最大值,當序列號達到最大值后,自動從起初值開始循環(huán)。2)本發(fā)明能保證在高并發(fā)的情況下某段時間內(nèi)序列號依舊是唯一。時間由提前設(shè)定的起始值,最大值,以及并發(fā)量決定。
圖I為本發(fā)明的序列號生成方法的流程圖。
具體實施例方式以下結(jié)合附圖對本發(fā)明的原理和特征進行描述,所舉實例只用于解釋本發(fā)明,并非用于限定本發(fā)明的范圍。本發(fā)明提供一種序列號生成方法,流程如下步驟I,輸入鏈路編號。步驟2,打開信號量,獲取信號量ID。具體為,根據(jù)/etc/hosts,通過ftok,打開信號量,獲取信號ID。ftok函數(shù)定義如下key_t ftok(char*fname, int id);fname就是指定的文件名(已經(jīng)存在的文件名),一般使用當前目錄。id是子序號。如果要確保key_t值不變,要確保ftok的文件不被刪除。故一般指定filename為系統(tǒng)中/etc/hosts文件。步驟3,判斷信號量ID獲取是否成功,如果是,對信號量進行加鎖操作。如果信號量ID獲取不成功,則創(chuàng)建信號量,如果信號量創(chuàng)建成功,則對信號量進行加鎖操作,如果信號量獲取失敗,則結(jié)束流程。采用函數(shù)semop對信號量進行加鎖,semop函數(shù)定義如下int semop(int semid, struct sembuf *sops, unsigned nsops)semid :信號集的識別碼,可通過semget獲取。sops:指向存儲信號操作結(jié)構(gòu)的數(shù)組指針,信號操作結(jié)構(gòu)的原型如下。struct sembuf {
unsigned short sem—num; /* semaphore number */ short sem—op; /* semaphore operation */ short sem—flg; /* operation flags */
};sem_num :操作信號在信號集中的編號,第一個信號的編號是O。Sem_0p:如果其值為正數(shù),該值會加到現(xiàn)有的信號內(nèi)含值中。通常用于釋放所控資源的使用權(quán);如果sem_op的值為負數(shù),而其絕對值又大于信號的現(xiàn)值,操作將會阻塞,直到 信號值大于或等于sem_op的絕對值。通常用于獲取資源的使用權(quán);如果sem_op的值為0,則操作將暫時阻塞,直到信號的值變?yōu)镺。sem_flg :信號操作標志。在加鎖操作中,設(shè)置sem_op為_1,使操作阻塞。當進入加鎖操作后,此塊共享內(nèi)存數(shù)據(jù)不能被其他進程訪問。步驟4,判斷鏈路號是否在合理范圍內(nèi),如果是,根據(jù)鏈路號計算序列號,如果否,則結(jié)束流程。計算序列號具體為在共享內(nèi)存中,每個進程有一個計數(shù)器。當進入加鎖狀態(tài)后,根據(jù)Ixnitejd (每個進程都預(yù)先設(shè)置一個唯一的值)找到對應(yīng)的計數(shù)器,進行累加,生成序列號,即序列號遞增。步驟5,判斷序列號是否達到最大值,如果否,直接執(zhí)行步驟6。如果序列號達到最大值,則將此序列號重新置為初始值,然后執(zhí)行步驟6。步驟6,對信號量進行解鎖操作,釋放其占用的資源,然后返回序列號。本發(fā)明還提供一種序列號生成器,保證在多進程與多線程高發(fā)情況下序列號的唯一丨I"生,該序列號生成器包括輸入單元,用以輸入鏈路編號;獲取單兀,用以打開信號量,獲取信號量ID ;加鎖單元,用以在信號量ID獲取成功后,對信號量進行加鎖操作;序列號生成單元,判斷鏈路編號是否在合理范圍內(nèi),如果是,則根據(jù)鏈路編號計算序列號;判斷單元,判斷序列號是否達到最大值;解鎖單元,如果序列號未達到最大值,對信號量進行解鎖操作,釋放其占用的資源,然后返回序列號。其中,序列號生成單元根據(jù)鏈路編號計算序列號具體為,找到鏈路編號對應(yīng)的計數(shù)器,進行累加,生成序列號。該序列號生成器進一步包括信號量創(chuàng)建單元,用于當信號量ID獲取不成功時,創(chuàng)建信號量,如果信號量創(chuàng)建成功,則由加鎖單元對信號量進行加鎖,如果信號量創(chuàng)建不成功,則獲取信號失敗,結(jié)束流程。該序列號生成器更進一步包括序列號重置單元,用以當判斷單元判斷序列號達到了最大值時,則將此序列號重新置為初始值,然后再由解鎖單元進行解鎖操作。舉例山西電信智能交換平臺實施中,每條CCR消息都要獲取一個唯一的HH,在系統(tǒng)運行前,為31個省的鏈路都配上鏈路編號route_id,然后設(shè)置號序列號的起始值,最大值。每個省的起始值和最大值都不相同,以便每個省的HH都在不同的范圍。假設(shè)鏈路編號=I時,設(shè)最大值=100000000,起始值為1,當該序列號達到最大值后,會從初始值從新開始循環(huán)。輸入鏈路編號route_id,打開信號量,獲取信號量ID,如果獲取信號量ID失敗,則創(chuàng)建信號量,如果獲取信號量ID成功或者創(chuàng)建信號量成功,則執(zhí)行信號量加鎖操作。當 鏈路編號小于0或大于最大值時,返回錯誤提示,如果鏈路編號位于合理范圍內(nèi),則根據(jù)r0Ute_id(每個進程都預(yù)先設(shè)置一個唯一的值)找到對應(yīng)的計數(shù)器,進行累加,生成序列號。然后,判斷序列號是否大于最大值,如果否,則解鎖信號量,釋放資源,如果大于最大值,則將序列號重置為初始值,然后解鎖信號量,釋放資源。以上所述僅為本發(fā)明的較佳實施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應(yīng)包含在本發(fā)明的保護范圍之內(nèi)。
權(quán)利要求
1.ー種利用信號量實現(xiàn)的序列號生成方法,包括如下步驟 步驟I,輸入鏈路編號; 步驟2,打開信號量,獲取信號量ID ; 步驟3,如果信號量ID獲取成功,對信號量進行加鎖操作; 步驟4,判斷鏈路編號是否在合理范圍內(nèi),如果是,則根據(jù)鏈路編號計算序列號; 步驟5,判斷序列號是否達到最大值,如果否,直接執(zhí)行步驟6 ; 步驟6,對信號量進行解鎖操作,釋放其占用的資源,然后返回序列號。
2.根據(jù)權(quán)利要求I所述的序列號生成方法,其特征在于步驟4中,根據(jù)鏈路編號計算序列號具體為,找到鏈路編號對應(yīng)的計數(shù)器,進行累加,生成序列號。
3.根據(jù)權(quán)利要求I或2所述的序列號生成方法,其特征在于該步驟3進ー步包括,如果信號量ID獲取不成功,則創(chuàng)建信號量,如果信號量創(chuàng)建成功,則對信號量進行加鎖,如果信號量創(chuàng)建不成功,則獲取信號失敗,結(jié)束流程。
4.根據(jù)權(quán)利要求I或2所述的序列號生成方法,其特征在于步驟5中,如果序列號達到了最大值,則將此序列號重新置為初始值,然后執(zhí)行步驟6。
5.ー種利用信號量實現(xiàn)的序列號生成器,該序列號生成器包括 輸入單元,用以輸入鏈路編號; 獲取單元,用以打開信號量,獲取信號量ID ; 加鎖單元,用以在信號量ID獲取成功后,對信號量進行加鎖操作; 序列號生成単元,判斷鏈路編號是否在合理范圍內(nèi),如果是,則根據(jù)鏈路編號計算序列號; 判斷単元,判斷序列號是否達到最大值; 解鎖單元,如果序列號未達到最大值,對信號量進行解鎖操作,釋放其占用的資源,然后返回序列號。
6.根據(jù)權(quán)利要求5所述的序列號生成器,其特征在于序列號生成単元根據(jù)鏈路編號計算序列號具體為,找到鏈路編號對應(yīng)的計數(shù)器,進行累加,生成序列號。
7.根據(jù)權(quán)利要求5或6所述的序列號生成器,其特征在于該序列號生成器進ー步包括信號量創(chuàng)建單元,用于當信號量ID獲取不成功吋,創(chuàng)建信號量,如果信號量創(chuàng)建成功,則由加鎖單元對信號量進行加鎖,如果信號量創(chuàng)建不成功,則獲取信號失敗,結(jié)束操作。
8.根據(jù)權(quán)利要求5或6所述的序列號生成器,其特征在于該序列號生成器進ー步包括序列號重置単元,用以當判斷単元判斷序列號達到了最大值時,則將此序列號重新置為初始值,然后再由解鎖單元進行解鎖操作。
全文摘要
本發(fā)明公開一種利用信號量實現(xiàn)的序列號生成方法以及序列號生成器,具體的序列號生成步驟為,輸入單元輸入鏈路編號;獲取單元打開信號量,獲取信號量ID;加鎖單元在信號量ID獲取成功后,對信號量進行加鎖操作;然后由序列號生成單元在判斷鏈路編號是否在合理范圍內(nèi)時,則根據(jù)鏈路編號計算序列號;解鎖單元在判斷單元判斷序列號未達到最大值的情況下,對信號量進行解鎖操作,釋放其占用的資源,然后返回序列號。本發(fā)明保證了多進程與多線程環(huán)境下的序列號唯一性。
文檔編號G06F9/38GK102662632SQ20121006658
公開日2012年9月12日 申請日期2012年3月14日 優(yōu)先權(quán)日2012年3月14日
發(fā)明者張慶庭, 焦念蘭, 韓宇峰, 顧朝輝 申請人:北京神州數(shù)碼思特奇信息技術(shù)股份有限公司