孫明剛(積成電子股份有限公司,山東 濟南 250100)
?
一種使用環形緩存和環形隊列實現UDP高效并發的方法
孫明剛
(積成電子股份有限公司,山東 濟南 250100)
摘 要:本方法涉及UDP并發技術領域,尤其涉及一種使用環形緩存和環形隊列實現UDP高效并發的方法。特點如下:在數據接收線程中創建環形隊列,用于存儲待返回數據的客戶端標識,并在數據處理子線程創建發送環形緩存和接收環形緩存,用于接收數據和存儲待發送數據;數據接收線程在接收數據的同時查看環形隊列中是否有需返回數據的客戶端標識,如由相應數據處理子線程發送環形緩存中的數據發送出去。本方法的循環緩沖區可以提供對緩沖區的互斥訪問,因而數據接收線程與數據處理子線程之間不需要加互斥保護,可同時進行,從而有了良好的并發性能,循環緩沖區可以更好地利用系統內存資源。
關鍵詞:環行緩存;環形隊列;并發性能
(一)主要步驟
1 發起服務端的數據接收線程,創建環形隊列。
3 創建與該客戶端對應的數據處理子線程,并創建該子線程的發送環形緩存和接收環形緩存。
4 數據接收線程將收到的數據復制到相應數據處理子線程的接收環形緩存中。
6 數據接收線程在接收數據的同時,查看環形隊列中是否有需返回數據的客戶端標識,如有則將該標識出隊列,由該標識索引到相應客戶端的數據處理子線程,并將該數據處理子線程發送環形緩存中的數據發送出去。
(二)主要特征

圖1
UDP是用戶數據包協議的簡稱,是OSI(Open System Interconnection,開放式系統互聯)參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。目前,UDP實現并發有以下三種方法:
(一)循環方式
創建一個套接字,將它綁定到一個端口上,并在這個端口上接收請求,進入無限循環,在該循環中服務器接受來自客戶的下一個請求,處理這一請求,然后將這個應答發回給客戶。這種模式對于處理請求占用時間較長,效率比較低下。我們考慮像文件傳送這樣的服務,它在處理每一個請求時,要求有相當可觀的時間,假設聯系該服務器的第一個客戶要求傳送一個巨大的文件,而聯系到該服務器的第二個客戶要求傳送一個小文件,若服務器一直等到第一個文件傳送完畢才考慮傳送第二個文件,那么第二個客戶將為了一個小文件而等一段不合理的時間。
(二)創建主線程接收請求
創建數據處理子線程單獨處理接收到的數據,并將處理結果發回給客戶端。設計思想,發起一個主線程從指定端口接收數據,當接收到數據時,創建對應的數據處理線程,將該數據交由該線程處理,處理結束后將數據發回客戶端,之后數據處理線程退出。線程創建和銷毀費時較長,因為創建一個線程要獲取內存資源或者其它更多資源,所以提高服務程序效率的一個手段就是盡可能地減少創建和銷毀線程的次數。如果數據交互比較頻繁,這種方法性能較低。
(三)主線程監聽客戶請求
刮耳崖前傳令急,霹靂一聲千騎入。弓刀匼匝網周遭,罪人黜伏將焉逃?鐵籠盛之負以斧,駭汗淋漓寫如雨。從征土目凡數千,咸使觀睹爭駢闐。穴中誰敢萌反復,請視今朝索諾木。遠人從此識天威,愿萬萬古安邊陲。[3]65
有請求到來時,記下其IP和端口,然后創建一個子線程將IP和端口傳給子線程,由子線程負責與該客戶端通信。這是目前常用的方法,但此方法最大的問題在于:子線程會新建套接字,并綁定一個新端口與客戶端通信,如果客戶端指定從服務器某一端口接收數據,會造成客戶端接收失敗。

圖2
針對上述問題,本方法提供了一種使用環形緩存和環形隊列實現UDP高效并發的解決方案。
(一)一種使用環形緩存和環形隊列實現UDP高效并發的方法主要步驟
1 發起服務端的數據接收線程,創建環形隊列。
3 創建與該客戶端對應的數據處理子線程,并創建該子線程的發送環形緩存和接收環形緩存。
4 數據接收線程將收到的數據復制到相應數據處理子線程的接收環形緩存中。
數據處理子線程在其接收環形緩存中接收數據,如果接收環形緩存中有數據,數據處理子線程處理數據,處理完后將需要發送的數據復制到其發送環形緩存中,并將其對應的客戶端標識存到數據接收線程的環形隊列中。
數據接收線程在接收數據的同時,查看環形隊列中是否有需返回數據的客戶端標識,如有則將該標識出隊列,由該標識索引到相應客戶端的數據處理子線程,并將該數據處理子線程發送環形緩存中的數據發送出去。
執行步驟1前需先為數據接收線程創建套接字并綁定一端口,固定從服務器的這一個端口接收來自客戶端的數據。
(二)本方法的有益效果
1 循環緩沖區可以提供對緩沖區的互斥訪問,因而數據接收線程與數據處理子線程之間不需要加互斥保護,可同時進行,從而有了良好的并發性能,循環緩沖區可以更好地利用系統內存資源。
2 使用環形隊列存儲需要發送數據的客戶端標識,如果有需要發送數據的客戶端則可直接從中取出,不需遍歷所有客戶端,有效減少CPU空轉時間,提高CPU利用率。
3 數據的接收與發送使用一個套接字和一個接收線程即可實現,可以大大減少系統頻繁創建線程的資源開銷,節約套接字(文件描述符)占用,并可有效避免因新建線程重新綁定端口造成的客戶端接收失敗現象。
4 數據接收和數據處理分離設計,可以使用不同的優先級來確保數據可靠、完整、實時的接收,并符合軟件工程中的“高內聚、低耦合”設計思想。
附圖說明:圖1是本方法數據接收發送主線程的流程圖,圖2是本方法數據處理子線程的流程圖。
(三)方案具體實施方式
下面結合附圖對本方法的實施過程進行詳細說明:一種使用環形緩存和環形隊列實現UDP高效并發的方法,如圖所示,包括以下步驟:
1 為數據接收線程創建套接字并綁定一端口,發起服務端的數據接收線程,創建環形隊列。
3 創建與該客戶端對應的數據處理子線程,在子線程的構造函數中實現發送環形緩存的創建和接收環形緩存的創建。
4 數據接收線程將收到的數據復制到相應數據處理子線程的接收環形緩存中。
5 數據處理子線程在其接收環形緩存中接收數據,如果接收環形緩存中有數據,數據處理子線程處理數據,處理完后將需要發送的數據復制到其發送環形緩存中,并將其對應的客戶端標識存到數據接收線程的環形隊列中。
6 數據接收線程在接收數據的同時,每接收完一幀數據后去環形隊列中查看是否有需返回數據的客戶端標識,如有則將該標識出隊列,由該標識索引到相應客戶端的數據處理子線程,并將該數據處理子線程發送環形緩存中的數據發送出去。
參考文獻
[1]蘆東昕,張華強,王陳.基于UDP的可靠數據傳遞技術研究[J].計算機工程,2003(22):62-63.
[2]劉捷,龔根華,饒泓,陶俊才.基于UDP的新型數據傳輸協議[J].南昌大學學報(理科版),2006(5):496-499+503.
[3]王艷芳,戴永,劉東華,孔華威,曾艷艷.基于UDP的數據可靠傳輸技術研究與應用[J].計算機工程與應用,2010(3):10 5-108.
中圖分類號:TP391
文獻標識碼:A
通信地址2 數據接收線程在指定端口接收數據,如果收到合法數據,通過數據中的來判斷是否已經存在相應客戶端的數據處理子線程,如果存在,則直接執行步驟4;如果不存在,則先執行步驟3創建新的數據處理子線程,之后再執行步驟4。 其主要特征在于執行步驟1前需要先為數據接收線程創建套接字并綁定一端口。所述數據中的是指數據中包含的源客戶端的IP地址或設備的 2 數據接收線程在指定端口接收數據,如果收到合法數據,通過數據中的來判斷是否已經存在相應客戶端的數據處理子線程,如果存在,則直接執行步驟4;如果不存在,則先執行步驟3創建新的數據處理子線程,之后再執行步驟4。 所述數據中的是指數據中包含的源客戶端的IP地址或設備的 2 數據接收線程在綁定端口接收數據,如果收到合法數據,通過數據中的(指數據中包含的源客戶端的IP地址或設備的 。數據合法與否是根據數據的起始字符、結束字符、長度和校驗碼綜合判斷。 。通信過程中可以利用這一地址來識別各客戶端。數據合法與否是根據數據的起始字符、結束字符、長度和校驗碼綜合判斷。[0011]本方法使用通信程序中經常用到的環形緩存作為數據結構,來存放通信中各客戶端發送和接收的數據,環形緩存是一個先進先出的循環緩沖區,可以向通信程序提供對緩存的互斥訪問。使用環形隊列結構來存儲每一個需要在數據處理完后發送返回結果的客戶端標識。這兩種數據結構的配合使用可以實現高效的UDP并發。 )來判斷是否已經存在相應客戶端的數據處理子線程,如果存在,則直接執行步驟4;如果不存在,則先執行步驟3,創建新的數據處理子線程,之后再執行步驟4。數據合法性判斷是根據數據的起始字符、結束字符、長度和校驗碼綜合判斷。