国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Linux單線程并發(fā)服務(wù)器探索

2018-04-18 11:05劉俊汐
數(shù)字通信世界 2018年1期
關(guān)鍵詞:描述符服務(wù)器端監(jiān)聽

劉俊汐,張 文

(1.綿陽中學(xué),綿陽 621000;2.電子科技大學(xué)計算機科學(xué)與工程學(xué)院,成都 611731)

1 引言

大部分的并發(fā)服務(wù)器采用fork子進程方式,從而達(dá)到并發(fā)的效果,本文將探索另一種并發(fā)服務(wù)器的設(shè)計思想,僅使用單線程,就可以完成并發(fā)功能。文中重點講述如何設(shè)計一個單線程并發(fā)服務(wù)器,需要怎樣的線程結(jié)構(gòu),以及select函數(shù)在單線程中如何管理眾多的套接字描述符。通過實驗結(jié)果的分析,再次強化對select函數(shù)的理解,了解套接字描述符的變化過程。

2 基礎(chǔ)理論

文件描述符是由內(nèi)核創(chuàng)建的文件的索引,指向被打開的文件,涉及I/O的系統(tǒng)調(diào)用都會使用文件描述符。而每個活動的套接字由一個小整數(shù)標(biāo)識,被稱為套接字描述符。由于套接字描述符也存放在文件描述符表中,所以同一進程不能擁有相同數(shù)值的文件描述符和套接字描述符。

Select函數(shù)的原型如下:Int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,st ruct t imeval *t imeout)。主要講述readrfds和timeout參數(shù)。readfds指向可讀文件描述符集,如果其中某個文件可讀,select的返回值大于0。若沒有處于可讀狀態(tài)的文件,再根據(jù)timeout判斷是否超時,如果超時,select返回0;若select返回負(fù)值,說明出錯。如果不關(guān)心任何文件的讀變化可以將readfds指向NULL。writefds、er rorfds與readfds 類似,都是指向文件描述符集。

timeout指向一個超時時間結(jié)構(gòu)體,通過它控制select的執(zhí)行狀態(tài),若指向NULL,select將以阻塞方式執(zhí)行,直到事件發(fā)生才返回;若將時間值設(shè)為0,將select變?yōu)橐粋€非阻塞函數(shù),立刻返回結(jié)果;若timeout值大于0,select僅在timeout時間段內(nèi)阻塞,若事件出現(xiàn)或時鐘超時將返回。

3 設(shè)計一個單線程并發(fā)服務(wù)器

單線程服務(wù)器中,所有的套接字都由一個線程管理。試想一個單線程服務(wù)器,有許多客戶連接到該服務(wù)器上。線程以阻塞方式等待數(shù)據(jù)的到達(dá),一旦任何一個連接上有數(shù)據(jù)到達(dá),線程將被喚醒,并處理請求和發(fā)送響應(yīng)。然后它將再次阻塞,等待其他連接上的數(shù)據(jù)到達(dá)。只要CPU足夠快地應(yīng)付服務(wù)器上出現(xiàn)的工作負(fù)荷,使用單線程就能像使用多線程那樣處理各個請求。

只通過單線程管理所有的套接字,需要使用基礎(chǔ)理論部分提到的select函數(shù)。當(dāng)有新的連接或讀寫I/O準(zhǔn)備就緒,內(nèi)核會自動修改文件描述符集的值。通過將監(jiān)聽套接字和連接套接字都放入select 函數(shù)的可讀文件描述符集中,一旦有新的連接請求或讀I/O準(zhǔn)備就緒,內(nèi)核會將對應(yīng)的套接字描述符置為1,借助FD_ISSET宏函數(shù)來確定具體發(fā)生的事件。所以在程序中,只要能找到發(fā)生變化的套接字描述符,即可以進行相應(yīng)的操作。

4 單線程并發(fā)ECHO服務(wù)器設(shè)計

在客戶端,首先創(chuàng)建一個套接字,通過該套接字與服務(wù)器建立連接,在該套接字上不斷完成寫讀操作。如果客戶端完成請求,則可以斷開與服務(wù)器的連接,釋放資源。

在服務(wù)器端,首先創(chuàng)建監(jiān)聽套接字,將監(jiān)聽套接字放入文件描述符集,通過調(diào)用select函數(shù),由內(nèi)核修改可讀文件描述符集對應(yīng)位的值,然后判斷是監(jiān)聽套接字就緒還是連接套接字上的讀I/O就緒,若監(jiān)聽套接字就緒,則進行連接,并將該套接字描述符加入到活躍文件描述符集afds中;如果連接套接字上的讀I/O就緒,則進行數(shù)據(jù)處理,如圖1所示。

每當(dāng)監(jiān)聽套接字就緒時,即服務(wù)器每連接一個客戶端,調(diào)用accept函數(shù)返回一個連接套接字ssock,并將其放入afds活動文件描述符集中。若可讀文件描述符集中有就緒I/O時,并且文件描述符不是監(jiān)聽套接字msock,便調(diào)用echo()函數(shù)進行回射處理。如果客戶端結(jié)束服務(wù),將其從對應(yīng)的afds中刪除。

圖1 服務(wù)器端流程圖

5 實驗結(jié)果

首先運行服務(wù)器端程序。其套接字描述符的打印值如下,監(jiān)聽套接字為23,最大可用的套接字描述符數(shù)量為1024個??吹絘fds中第24位被置為1,由于僅使用幾個客戶端測試,所以后面的描述符省略不打印。此時服務(wù)器程序阻塞于select函數(shù)。msock is:23。

接著打開一個客戶端,不發(fā)送數(shù)據(jù)。從打印信息顯示此時有一個連接套接字ssock25建立。由于此時有一個客戶端建立連接,內(nèi)核修改r fds的狀態(tài),將第24位置為1,表明監(jiān)聽套接字就緒,select 函數(shù)得以返回。活動描述符集afds中第24、26被置為1,表示一個監(jiān)聽套接字和一個連接套接字。rfds is:

在客戶端窗口中輸入數(shù)據(jù)sdads,可以看到接收框中顯示相同的數(shù)據(jù)。因為此時連接套接字25上的網(wǎng)絡(luò)I/O就緒,所以select將rfds的第26位被置為1并返回,活動描述符集afds沒有變化。

圖2 第一個客戶端發(fā)送數(shù)據(jù)

此時打開第二個客戶端,不發(fā)送數(shù)據(jù),可以看到顯示連接套接字ssock26,此時rfds的第24位被置為1,表明監(jiān)聽套接字就緒。因為有了新的連接,所以afds中第27位被置為1。

現(xiàn)在關(guān)閉第一個客戶端,看到rfds的第26位被置1,afds中將25連接套接字對應(yīng)位刪除,只有一個連接套接字(26)和一個監(jiān)聽套接字活躍。

當(dāng)關(guān)閉第二個客戶端時,看到rfds的第27位被置1,afds中將26連接套接字對應(yīng)位刪除,現(xiàn)在只有一個監(jiān)聽套接字活躍。

6 結(jié)束語

由于ECHO服務(wù)器屬于數(shù)據(jù)到達(dá)驅(qū)動,所以能夠使用單線程服務(wù)器完成多線程服務(wù)器的功能。關(guān)鍵是使用了操作系統(tǒng)的異步I/O函數(shù)select,通過select管理服務(wù)器上所有的套接字描述符,由于函數(shù)返回時內(nèi)核會修改套接字描述符集,所以能夠知道有新的連接請求或I/O就緒。

[1] Douglas E.Comer,David L.Stevens.用TCP/IP進行網(wǎng)際互連ü客戶-服務(wù)器編程與應(yīng)用[M].北京∶電子工業(yè)出版社,2008.

[2] W.Richard Stevens,Bill Fenner,Andrew M.Rudoff.UNIX 網(wǎng)絡(luò)編程 卷 1 :套接字網(wǎng)絡(luò)編程API.第3版[M].北京∶人民郵電出版社,2015.

猜你喜歡
描述符服務(wù)器端監(jiān)聽
基于結(jié)構(gòu)信息的異源遙感圖像局部特征描述符研究
英國風(fēng)真無線監(jiān)聽耳機新貴 Cambridge Audio(劍橋)Melomania Touch
Linux環(huán)境下基于Socket的數(shù)據(jù)傳輸軟件設(shè)計
千元監(jiān)聽風(fēng)格Hi-Fi箱新選擇 Summer audio A-401
基于AKAZE的BOLD掩碼描述符的匹配算法的研究
基于深度學(xué)習(xí)的局部描述符
網(wǎng)絡(luò)監(jiān)聽的防范措施
基于Qt的安全即時通訊軟件服務(wù)器端設(shè)計
基于Qt的網(wǎng)絡(luò)聊天軟件服務(wù)器端設(shè)計
特征聯(lián)合和旋轉(zhuǎn)不變空間分割聯(lián)合的局部圖像描述符