• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

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

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

      劉俊汐,張 文

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

      1 引言

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

      2 基礎(chǔ)理論

      文件描述符是由內(nèi)核創(chuàng)建的文件的索引,指向被打開的文件,涉及I/O的系統(tǒng)調(diào)用都會使用文件描述符。而每個活動的套接字由一個小整數(shù)標(biāo)識,被稱為套接字描述符。由于套接字描述符也存放在文件描述符表中,所以同一進(jìn)程不能擁有相同數(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è)計(jì)一個單線程并發(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ā)生變化的套接字描述符,即可以進(jìn)行相應(yīng)的操作。

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

      在客戶端,首先創(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)聽套接字就緒,則進(jìn)行連接,并將該套接字描述符加入到活躍文件描述符集afds中;如果連接套接字上的讀I/O就緒,則進(jìn)行數(shù)據(jù)處理,如圖1所示。

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

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

      5 實(shí)驗(yàn)結(jié)果

      首先運(yùn)行服務(wù)器端程序。其套接字描述符的打印值如下,監(jiān)聽套接字為23,最大可用的套接字描述符數(shù)量為1024個。看到afds中第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ù)。因?yàn)榇藭r連接套接字25上的網(wǎng)絡(luò)I/O就緒,所以select將rfds的第26位被置為1并返回,活動描述符集afds沒有變化。

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

      此時打開第二個客戶端,不發(fā)送數(shù)據(jù),可以看到顯示連接套接字ssock26,此時rfds的第24位被置為1,表明監(jiān)聽套接字就緒。因?yàn)橛辛诵碌倪B接,所以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進(jìn)行網(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.

      猜你喜歡
      描述符監(jiān)聽服務(wù)器端
      基于結(jié)構(gòu)信息的異源遙感圖像局部特征描述符研究
      千元監(jiān)聽風(fēng)格Hi-Fi箱新選擇 Summer audio A-401
      基于AKAZE的BOLD掩碼描述符的匹配算法的研究
      淺析異步通信層的架構(gòu)在ASP.NET 程序中的應(yīng)用
      成功(2018年10期)2018-03-26 02:56:14
      利用CNN的無人機(jī)遙感影像特征描述符學(xué)習(xí)
      網(wǎng)絡(luò)監(jiān)聽的防范措施
      電子制作(2017年20期)2017-04-26 06:58:02
      在Windows中安裝OpenVPN
      應(yīng)召反潛時無人機(jī)監(jiān)聽航路的規(guī)劃
      局域網(wǎng)監(jiān)聽軟件的設(shè)計(jì)
      河南科技(2014年5期)2014-02-27 14:08:21
      網(wǎng)頁防篡改中分布式文件同步復(fù)制系統(tǒng)
      昭通市| 营口市| 钟祥市| 康定县| 绥宁县| 博客| 重庆市| 介休市| 榕江县| 寻甸| 黄骅市| 泸西县| 高尔夫| 阜宁县| 若尔盖县| 迭部县| 和平区| 叶城县| 永年县| 苏尼特左旗| 莒南县| 吐鲁番市| 米泉市| 水城县| 长汀县| 桐柏县| 浏阳市| 赤壁市| 苏尼特右旗| 达孜县| 兴业县| 廉江市| 盐边县| 安平县| 同江市| 交城县| 墨玉县| 阆中市| 乐昌市| 通海县| 屏南县|