摘 要:無(wú)線控制器(AC)是WLAN網(wǎng)絡(luò)的集中控制中樞,是部署大型無(wú)線局域網(wǎng)必不可少的組成部分。AC系統(tǒng)為嵌入式系統(tǒng),要求高吞吐率,低成本,具有一定的實(shí)時(shí)性。本文介紹一種多線程無(wú)線控制器的設(shè)計(jì)方法,以具體業(yè)務(wù)按照優(yōu)先級(jí)由高至低的順序劃分多線程。使線程數(shù)目更少,實(shí)時(shí)性更強(qiáng),可以同時(shí)維護(hù)數(shù)千Socket連接數(shù)。本文最后對(duì)首要性能指標(biāo)做出了分析。
關(guān)鍵詞:多線程并發(fā);軟實(shí)時(shí)系統(tǒng);消息隊(duì)列;響應(yīng)時(shí)間優(yōu)化
中國(guó)分類(lèi)號(hào):TP311.52
1 按照功能劃分多線程設(shè)計(jì)方法概述
在進(jìn)行多線程應(yīng)用程序設(shè)計(jì)時(shí),一般是按照對(duì)象劃分線程,一個(gè)對(duì)象對(duì)應(yīng)一個(gè)線程。這樣做的好處是可以很方便的擴(kuò)展對(duì)象的數(shù)量規(guī)模,并簡(jiǎn)化程序的復(fù)雜程度。
但是在嵌入式程序設(shè)計(jì)當(dāng)中,對(duì)事件的響應(yīng)時(shí)間要求更高,按照對(duì)象劃分線程的方法只能保證每個(gè)對(duì)象獲得CPU的時(shí)間的公平的,當(dāng)CPU成為系統(tǒng)瓶頸時(shí),并無(wú)法保證每個(gè)對(duì)象都可以及時(shí)的得到CPU資源。
如果采用按照業(yè)務(wù)優(yōu)先級(jí)劃分多線程的方法,就可以使按照具體事務(wù)對(duì)響應(yīng)時(shí)間要求的高低來(lái)劃分優(yōu)先級(jí),生成不同優(yōu)先級(jí)的多個(gè)事件隊(duì)列。這樣就可以保證最緊急的事件,在最短的時(shí)間內(nèi)得到處理。
圖1 單個(gè)對(duì)象單個(gè)線程模型
如圖1,為處理單個(gè)對(duì)象的線程結(jié)構(gòu)模型,當(dāng)CPU調(diào)度到此線程時(shí),依次處理高優(yōu)先級(jí)事件,中等優(yōu)先級(jí)事件,低優(yōu)先級(jí)事件。假設(shè)處理高優(yōu)先級(jí)事件花費(fèi)時(shí)間為T(mén)a,中等優(yōu)先級(jí)事件的花費(fèi)為T(mén)b,低優(yōu)先級(jí)事件的花費(fèi)為T(mén)c,那么在Nc個(gè)CPU的系統(tǒng)中,處理第M個(gè)對(duì)象的平均等待時(shí)間Td為:
(Ta+Tb+Tc)x(M-1)/Nc 公式1
圖2 按照功能劃分多線程模型
如圖2,為按照優(yōu)先級(jí)劃分多線程的設(shè)計(jì)方法,CPU將依次處理三個(gè)隊(duì)列中的事件,高優(yōu)先級(jí)的事件總是最優(yōu)先得到處理。設(shè)定CPU調(diào)度方式為FIFO和非搶占,集中處理高優(yōu)先級(jí)隊(duì)列的線程時(shí)間限制為T(mén)h,集中處理中優(yōu)先級(jí)隊(duì)列的線程時(shí)間限制為T(mén)i,集中處理低優(yōu)先級(jí)隊(duì)列的線程時(shí)間限制為T(mén)j,則第M個(gè)對(duì)象的高優(yōu)先級(jí)事件得到響應(yīng)的最大時(shí)延為Max(Th,Ti,Tj)。與圖1的設(shè)計(jì)方法相比較,圖2具有明顯的優(yōu)勢(shì)。
根據(jù)業(yè)務(wù)優(yōu)先級(jí)劃分多線程結(jié)構(gòu)程序設(shè)計(jì)方法的其他優(yōu)勢(shì)還有線程最大個(gè)數(shù)可控,響應(yīng)時(shí)間可控,實(shí)時(shí)性更好等。
無(wú)線控制器AC要求一定的實(shí)時(shí)性,是一個(gè)網(wǎng)絡(luò)密集型和CPU密集型的軟件系統(tǒng)。適用于本文提出的這種設(shè)計(jì)方法。如圖3,將AC與AP之間的連接設(shè)計(jì)為T(mén)CP的通信方式,保證報(bào)文傳輸?shù)目煽啃浴:罄m(xù)可以引入OpenSSL,實(shí)現(xiàn)報(bào)文的加密傳輸。
圖3 AC系統(tǒng)示意圖
采用業(yè)務(wù)優(yōu)先級(jí)劃分的設(shè)計(jì)方法,AC系統(tǒng)容易出現(xiàn)多個(gè)線程同時(shí)發(fā)送數(shù)據(jù)的情況。如圖4,線程B在線程A發(fā)送數(shù)據(jù)完畢后開(kāi)始發(fā)送數(shù)據(jù)。當(dāng)線程B發(fā)送的數(shù)據(jù)量超過(guò)了TCP發(fā)送隊(duì)列的容量時(shí),線程B會(huì)被阻塞。如果線程A緊接著也要發(fā)送數(shù)據(jù),則線程A也會(huì)被阻塞。直到TCP發(fā)送隊(duì)列中有數(shù)據(jù)發(fā)送成功,騰出足夠的空間容納線程B和線程A之后才會(huì)恢復(fù)。
可以通過(guò)下面兩種方法,以避免上述阻塞的情況產(chǎn)生:
(1)將TCP Socket的屬性設(shè)置為非阻塞。
(2)將TCP Socket的發(fā)送隊(duì)列進(jìn)行適度的擴(kuò)大。
(3)在發(fā)送數(shù)據(jù)前,對(duì)TCP Socket發(fā)送隊(duì)列進(jìn)行檢查。如果沒(méi)有空閑的空間,則放棄發(fā)送。
圖4 TCP阻塞示意圖
為了避免陷入阻塞,可以在發(fā)包前對(duì)發(fā)送隊(duì)列進(jìn)行判定,一旦檢測(cè)出發(fā)送隊(duì)列已滿的情況發(fā)生,則放棄本次數(shù)據(jù)發(fā)送。
2 無(wú)線控制器
AC系統(tǒng)的主要目的是發(fā)現(xiàn),控制,管理,維護(hù)同一網(wǎng)絡(luò)中的無(wú)線接入點(diǎn)AP。具體事務(wù)可以劃分為發(fā)現(xiàn)探測(cè)過(guò)程,連接建立過(guò)程,鏈路?;钸^(guò)程,命令交互過(guò)程等等。
表1 無(wú)線控制器AC主要功能列表
事務(wù)名稱(chēng)優(yōu)先級(jí)單個(gè)事務(wù)耗時(shí)(ms)線程時(shí)間片控制
鏈路?;钭罡?對(duì)象個(gè)數(shù)Mx2
命令交互次高5對(duì)象個(gè)數(shù)Mx2
連接建立一般100對(duì)象個(gè)數(shù)Mx2
如表1,可將AC系統(tǒng)劃分為3個(gè)專(zhuān)門(mén)處理事務(wù)的線程和1個(gè)負(fù)責(zé)收包解析并分發(fā)各個(gè)事務(wù)的連接管理線程。
2.1 連接管理任務(wù)設(shè)計(jì)
連接管理線程主要負(fù)責(zé)維護(hù)與各個(gè)AP之間的Socket連接,包括鏈路的協(xié)商,建立和斷開(kāi),以及報(bào)文的接收等。該線程需要設(shè)置為最高優(yōu)先級(jí),確保Socket接收到報(bào)文之后,可以立即得到處理。
使用EPOLL機(jī)制實(shí)現(xiàn)AC與所有AP之間的連接的監(jiān)聽(tīng),收到報(bào)文后立即分發(fā)至各個(gè)業(yè)務(wù)模塊。經(jīng)過(guò)實(shí)際的測(cè)試,連接數(shù)可以達(dá)到4000以上。
2.2 鏈路?;钊蝿?wù)設(shè)計(jì)
然后是鏈路?;罹€程,主要負(fù)責(zé)定時(shí)向AP發(fā)送鏈路?;钕?,并根據(jù)鏈路?;罨貞?yīng)消息判定AP是否在線。假設(shè)?;钪芷跒镵,則要求在K時(shí)間內(nèi)發(fā)出M個(gè)鏈路保活消息。否則就會(huì)有AP掉線,進(jìn)而使整個(gè)無(wú)線系統(tǒng)不穩(wěn)定。出于對(duì)系統(tǒng)負(fù)載分擔(dān)的考慮,并不能簡(jiǎn)單的在定時(shí)器到期后將M個(gè)鏈路保活報(bào)文集中的一次性全發(fā)出去,因?yàn)檫@樣會(huì)使得M個(gè)AP在同一時(shí)刻內(nèi)集中的發(fā)送鏈路保活響應(yīng)報(bào)文,進(jìn)而瞬間提高AC系統(tǒng)的負(fù)載。針對(duì)這種情況,一種解決辦法是將M個(gè)鏈路?;顖?bào)文在K周期內(nèi)均勻的發(fā)送出去。設(shè)定?;钪芷贙的誤差為秒級(jí),則每秒需要發(fā)出M/K+1個(gè)報(bào)文。使用獨(dú)立的鏈路保活線程,設(shè)置線程的喚醒周期為秒。該線程被喚醒時(shí),首先計(jì)算本線程上一次執(zhí)行到現(xiàn)在經(jīng)過(guò)的時(shí)間Ka,然后計(jì)算本次線程執(zhí)行需要發(fā)出的鏈路?;顖?bào)文個(gè)數(shù)Ma=Kax(M/K+1),再然后發(fā)出Ma個(gè)鏈路?;顖?bào)文,最后記錄本次調(diào)用發(fā)生的時(shí)間,供下一次計(jì)算Ka時(shí)使用。
鏈路保活任務(wù)是絕對(duì)不允許被阻塞的。阻塞一旦發(fā)生,不僅引起阻塞的AP會(huì)掉線,當(dāng)阻塞時(shí)間較長(zhǎng)時(shí),其他AP也會(huì)因?yàn)榈貌坏巾憫?yīng)而陸續(xù)的掉線。因此?;顖?bào)文發(fā)送之前,一定要對(duì)TCP Socket的發(fā)送隊(duì)列進(jìn)行檢查,如果不滿足本次發(fā)送條件,直接放棄。等待下一次定時(shí)器到期后再次嘗試。
圖5 鏈路?;钊蝿?wù)流程圖
2.3 連接建立任務(wù)設(shè)計(jì)
按照時(shí)間順序,AP的上線過(guò)程第一步是建立連接,包含發(fā)現(xiàn)探測(cè)和TCP握手兩個(gè)步驟。發(fā)現(xiàn)探測(cè)的目的是識(shí)別設(shè)備類(lèi)型,預(yù)部署,避免連接重復(fù)建立,以及確定三層網(wǎng)絡(luò)是否暢通。TCP握手步驟以非阻塞的方式進(jìn)行,可以與多個(gè)AP并發(fā)的進(jìn)行,并可以進(jìn)一步實(shí)現(xiàn)為基于OpenSSL的安全連接TLS。AC作為Server端響應(yīng)來(lái)自AP的TCP連接請(qǐng)求,整個(gè)線程每次執(zhí)行只處理一個(gè)TCP報(bào)文,并不會(huì)占用太多的CPU時(shí)間。
將該線程的優(yōu)先級(jí)設(shè)定得比較低,目的是讓CPU優(yōu)先處理已上線的AP的事務(wù),并盡量縮短已發(fā)現(xiàn)的AP的上線時(shí)間。該任務(wù)的另一個(gè)作用是控制并發(fā)連接數(shù),只要為該線程設(shè)置單位時(shí)間內(nèi)可處理的報(bào)文個(gè)數(shù),就可以有效的抑制并發(fā)連接個(gè)數(shù)。
圖6 連接建立任務(wù)流程圖
2.4 命令交互任務(wù)設(shè)計(jì)
命令交互流程是AP上線后,與AC不定時(shí)交互數(shù)據(jù)的過(guò)程,數(shù)據(jù)量小,具有隨機(jī)性,且容易產(chǎn)生突發(fā)的數(shù)據(jù)流。在程序的具體實(shí)現(xiàn)中,需要根據(jù)具體的命令的特點(diǎn),進(jìn)一步細(xì)分若干個(gè)具體的任務(wù)。
3 性能分析
表2 系統(tǒng)規(guī)格
組件規(guī)格
CPU單核533MHz
內(nèi)存DDR2 512MB
以太網(wǎng)控制器千兆
系統(tǒng)總線32位
內(nèi)置存儲(chǔ)器Nor-flash 32MB
OS嵌入式Linux
3.1 吞吐率(R)
使用wireshark抓包統(tǒng)計(jì)系統(tǒng)的TCP數(shù)據(jù)報(bào)文吞吐率如表3??梢缘贸鐾掏侣蕿?00個(gè)/秒。將大量數(shù)據(jù)合并到一個(gè)報(bào)文中進(jìn)行發(fā)送,可以提升實(shí)際業(yè)務(wù)的處理效率。
表3 TCP數(shù)據(jù)報(bào)文統(tǒng)計(jì)
報(bào)文統(tǒng)計(jì)周期報(bào)文數(shù)量
5分鐘30012
10分鐘60020
15分鐘90040
20分鐘120055
3.2 命令交互響應(yīng)時(shí)間
一次完整的命令交互至少包含兩條消息,一個(gè)是AP發(fā)給AC,另一個(gè)是AC發(fā)給AP;或者相反。復(fù)雜的命令則需要多次交互。這里將命令交互響應(yīng)時(shí)間定義為一次報(bào)文交互所消耗的時(shí)間。
如果發(fā)生命令交互之時(shí),系統(tǒng)處于空閑狀態(tài),則可根據(jù)吞吐率(R)計(jì)算一次命令交互的響應(yīng)時(shí)間為2R=20ms。
考慮到整個(gè)系統(tǒng)對(duì)線程原子操作的時(shí)間控制在1秒(設(shè)為變量U,單位ms)以?xún)?nèi),當(dāng)發(fā)生命令交互之時(shí),如果系統(tǒng)處在繁忙狀態(tài),則AC系統(tǒng)響應(yīng)一次命令交互,會(huì)產(chǎn)生最多1秒的延時(shí)。此時(shí)響應(yīng)時(shí)間為(U+2R)毫秒。
綜合任務(wù)優(yōu)先級(jí)考慮,命令交互的優(yōu)先級(jí)排在鏈路?;钪螅溌繁;钚枰l(fā)送M個(gè)保活報(bào)文。此時(shí)響應(yīng)時(shí)間為(U+(M+2)xR)毫秒。
3.3 AP并發(fā)上線時(shí)間
AP上線時(shí)間是衡量系統(tǒng)綜合性能的一個(gè)重要指標(biāo),能夠真實(shí)的體現(xiàn)到用戶(hù)體驗(yàn)中。AC系統(tǒng)處理AP上線是通過(guò)連接建立,命令交互等多個(gè)線程協(xié)同處理完成的。期望的運(yùn)行結(jié)果是類(lèi)似于對(duì)數(shù)曲線的效果。
參考文獻(xiàn):
[1]徐文超.802.11無(wú)線網(wǎng)絡(luò)資源管理算法研究[D].2011
[2]趙俊.IEEE 802.11無(wú)線局域網(wǎng)性能分析和優(yōu)化[D].2003
[3]何劍,劉鐮斧編著.Linux實(shí)時(shí)性能瓶頸分析[J].成都信息工程學(xué)院學(xué)報(bào),2005.
作者簡(jiǎn)介:賈非(1984.01-),男,就職于神州數(shù)碼網(wǎng)絡(luò)公司,高級(jí)開(kāi)發(fā)工程師。
作者單位:北京信息科技大學(xué) 理學(xué)院,北京 100192
基金項(xiàng)目:國(guó)家自然科學(xué)基金號(hào):61473325