• 
    

    
    

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

      ?

      循環(huán)和并發(fā)服務的比較及應用

      2012-04-29 00:44:03陳春嬌
      電腦知識與技術(shù) 2012年32期
      關鍵詞:應用算法

      陳春嬌

      摘要:該文比較詳細地介紹了循環(huán)和并發(fā)服務器的概念、工作原理及循環(huán)和并發(fā)服務器的算法,從工作原理、工作流程等方面進行闡述兩者的區(qū)別,并分別用一個循環(huán)服務器程序和并發(fā)服務器程序?qū)嵗a加以說明。

      關鍵詞:循環(huán)服務器;并發(fā)服務器;算法;應用

      中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2012)32-7706-04

      1循環(huán)和并發(fā)服務器的概念

      網(wǎng)絡服務器有循環(huán)服務器和并發(fā)服務器兩種。循環(huán)服務器:循環(huán)服務器在同一個時刻只可以響應一個客戶端的請求;并發(fā)服務器:并發(fā)服務器在同一個時刻可以響應多個客戶端的請求。

      網(wǎng)絡服務器有循環(huán)服務器和并發(fā)服務器兩種。連接性問題是傳輸協(xié)議的中心,而客戶使用這個傳輸協(xié)議訪問某個服務器。TCP/IP協(xié)議族給用提供了兩種傳輸協(xié)議,可以使用面向連接的傳輸(TCP)或無連接的傳輸(UDP)。因此,可以將服務器劃分為四種一般的類型:循環(huán)無連接、循環(huán)面向連接、并發(fā)無連接、并發(fā)面向連接。

      2循環(huán)和并發(fā)服務的工作原理

      2.1循環(huán)服務器的工作原理及及流程

      1)循環(huán)無連接(UDP)的服務器的工作原理及應用范圍

      循環(huán)無連接的服務器的算法

      ①創(chuàng)建套接字并將其綁定到所提供服務的熟知端口上。

      ②重復地讀取來自客戶的請求,構(gòu)造響應,按照應用協(xié)議向客戶發(fā)回響應。

      UDP循環(huán)服務器的實現(xiàn)非常簡單:UDP服務器每次從套接字上讀取一個客戶端的請求,處理,然后將結(jié)果返回給客戶機.

      可以用下面的算法來實現(xiàn).

      socket(...);

      bind(...);

      while(1)

      {

      recvfrom(...);

      process(...);

      sendto(...);

      }

      因為UDP是非面向連接的,沒有一個客戶端可以老是占住服務端.只要處理過程不是死循環(huán),服務器對于每一個客戶機的請求總是能夠滿足.

      2)循環(huán)面向連接(TCP)的服務器的工作原理及應用范圍

      循環(huán)面向連接的服務器的算法

      ①創(chuàng)建套接字并將其綁定到它所提供服務的熟知端口上。

      ②將該端口設置為被動模式,使其準備為服務器所用。

      ③從該套接字上接受下一個連接請求,獲得該連接的新的套接字。

      ④重復地讀取來自客戶的請求,構(gòu)造響應,按照應用協(xié)議向客戶發(fā)回響應。

      ⑤當與某個特定客戶完成交互時,關閉連接,并返回步驟3以接受新的連接。

      TCP循環(huán)服務器的實現(xiàn)也不難:TCP服務器接受一個客戶端的連接,然后處理,完成了這個客戶的所有請求后,斷開連接。

      算法如下:

      socket(...);

      bind(...);

      listen(...);

      while(1)

      {

      accept(...);

      while(1)

      {

      read(...);

      process(...);

      write(...);

      }

      close(...);

      }

      TCP循環(huán)服務器一次只能處理一個客戶端的請求.只有在這個客戶的所有請求都滿足后,服務器才可以繼續(xù)后面的請求.這樣如果有一個客戶端占住服務器不放時,其它的客戶機都不能工作了.因此,TCP服務器一般很少用循環(huán)服務器模型的.

      2.2并發(fā)服務器的工作原理及應用范圍

      1)并發(fā)面向連接(TCP)的服務器的工作原理及應用范圍

      并發(fā)服務器:TCP服務器

      為了彌補循環(huán)TCP服務器的缺陷,人們又想出了并發(fā)服務器的模型.并發(fā)服務器的思想是每一個客戶機的請求并不由服務器直接處理,而是服務器創(chuàng)建一個子進程來處理.

      算法如下:

      socket(...);

      bind(...);

      listen(...);

      while(1)

      {

      accept(...);

      if(fork(..)==0)

      {

      while(1)

      {

      read(...);

      process(...);

      write(...);

      }

      close(...);

      exit(...);

      }

      close(...);

      }

      TCP并發(fā)服務器可以解決TCP循環(huán)服務器客戶機獨占服務器的情況.不過也同時帶來了一個不小的問題.為了響應客戶機的請求,服務器要創(chuàng)建子進程來處理.而創(chuàng)建子進程是一種非常消耗資源的操作.

      2)并發(fā)無連接的服務器的工作原理及應用范圍

      不同于順序服務器,并發(fā)服務器就要能在一個時間為多個客戶端提供服務。例如,一個聊天服務器可能服務一個特定的客戶端數(shù)小時──在停止為這個客戶端服務之前服務器不能等待,除非是在等待一下個客戶端到來之前的間隙才能等待。

      我們將提供服務從守護進程移至它自己的服務進程。然而,因為每個子進程都繼承所有打開的文件(套接字被像文件一樣處理),新進程不僅繼承“accept()返回的句柄,”那是指調(diào)用accept返回的套接字;新進程也繼承頂級套接字,這是頂級進程一開始打開的套接字。

      然而,服務進程不需要這個套接字,應該立即關閉(close)它。同樣的,守護進程不再需要accept()返回的套接字,不僅應該,還必須關閉(close)它──否則,那遲早會耗盡可用的文件描述符。

      在服務進程完成服務之后,它將關閉accept()返回的套接字。它不會返回到accept,而是退出進程。

      在UNIX?上,一個進程并不真正的退出,而是返回至父進程。典型情況中,父進程等待(wait)子進程,并取得一個返回值。但是,我們的守護進程不能簡單的停止或等待,那有違建立其它進程的整個目的。但是如果從不使用wait,它的子進程可能會成為僵尸──不再有功用可仍然徘徊著。

      出于那樣的原因,守護進程需要在初始化守護進程階段設置信號處理程序。至少要處理信號SIGCHLD,這樣守護進程可以從系統(tǒng)清除僵尸返回值并釋放僵尸占用的系統(tǒng)資源。

      這是現(xiàn)在我們的流程圖包含一個進程信號框的原因,它不與任何其它框相連接。順便說一句,許多服務器程序也處理SIGHUP,作為超級用戶發(fā)出的要求重讀配置文件的信號。這允許我們不必終止或重啟服務器程序就改變設置。

      3循環(huán)服務器和并發(fā)服務器的比較及應用場景

      3.1并發(fā)服務器和循環(huán)服務器比較

      一般來說,并發(fā)服務器更難設計和構(gòu)建,其最終的代碼也更復雜并且難于修改。然而,大多數(shù)程序員還是選擇了并發(fā)實現(xiàn)的方法,因為循環(huán)服務器會在分布式應用中引起不必要的時延,而且可能會成為影響許多客戶應用程序的性能瓶頸。我們概括如下:使用循環(huán)方法實現(xiàn)的服務器易于構(gòu)建和理解,但這樣的結(jié)果會使其性能很差,因為這樣的服務器要使客戶等待服務。相反,以并發(fā)方法實現(xiàn)的服務器難于設計和構(gòu)建,但卻有較好的性能。

      3.2循環(huán)服務器和并發(fā)服務器的應用場景

      1)循環(huán)的和并發(fā)的:如果循環(huán)方案產(chǎn)生的響應時間對應用來說足夠充分,就可以使用循環(huán);否則需要并發(fā);2)真正的和表面上的并發(fā)性:如果線程或切換環(huán)境的開銷大,服務器需要在多個連接之間共享或者交換數(shù)據(jù),用單線程;使用線程開銷不大或者要得到最大并發(fā)性,使用多進程;3)面向連接的和無連接的:如果應用協(xié)議處理了可靠性問題,或者應用在局域網(wǎng)環(huán)境內(nèi),使用無連接的傳輸。

      4循環(huán)和并發(fā)服務器程序?qū)嵗?/p>

      循環(huán)服務器容易設計、實現(xiàn)和維護,但是性能差;并發(fā)服務器難以構(gòu)建和設計,但是性能好,響應快。

      4.1循環(huán)服務器的應用程序?qū)嵗?/p>

      循環(huán)式服務器模型:(以時間服務程序time為例)

      1)服務器端主函數(shù)部分代碼分析

      ①前期準備部分

      int

      main(intargc,char*argv[])

      {

      structsockaddr_infsin; /*用于存儲客戶端地址信息 */

      char *service="time"; /*用于存儲服務名或者端口號*/

      char buf[1];

      int sock;

      time_t now; /*當前時間*/

      un小ignedint alen; /*客戶端地址長度*/

      switch(argc)

      {

      case 1:

      break;

      case 2:

      service=argv[1];

      break;

      default:

      errexit("usage:UDPtimed[port]\n");

      }

      /*argc=1時,表示只有一程序名稱。argv[0]指向輸入的程序路徑及名稱;argc=2,表示除了程序名外還有一個參數(shù)。argv[0]指向輸入的程序路徑及名稱。argv[1]指向參數(shù)的字符串;Default報錯。*/

      sock=passiveUDP(service);

      /*調(diào)用已定義的passiveUDP函數(shù)創(chuàng)建套接字*/

      ②實際處理連接通信服務部分

      while(1){

      alen=sizeof(fsin);

      if(recvfrom(sock,buf,sizeof(buf),0,(structsockaddr*)&fsin,&alen)<0)

      errexit("recvfrom:%s\n",strerror(errno));

      /*讀取來自客戶端發(fā)起的請求,若返回值小于0就讀取失敗調(diào)用errexit函數(shù)報錯*/

      (void)time(&now); /*獲取時間*/

      now=htonl((unsignedlong)(now+UNIXEPOCH));

      /*將本地字節(jié)順序轉(zhuǎn)換成客戶端能識別的統(tǒng)一的網(wǎng)絡字節(jié)順序*/

      (void)sendto(sock,(char*)&now,sizeof(now),0,(structsockaddr*)&fsin,sizeof(fsin));

      /*調(diào)用sendto函數(shù)將時間信息發(fā)送給客戶端*/

      }

      ③ passivesock函數(shù)模塊關鍵代碼分析:(含sock、bind、listen)

      memset(&sin,0,sizeof(sin)); /*將sin初始化置零*/

      sin.sin_family=AF_INET;

      sin.sin_addr.s_addr=INADDR_ANY; /*將服務器接入點置為任意inaddr_any*/

      if(pse=getservbyname(service,transport))/*嘗試通過service獲取地址*/

      sin.sin_port=htons(ntohs((unsignedshort)pse→s_port)+portbase);

      /*htons/ntohs本地字節(jié)順序與網(wǎng)絡字節(jié)順序的相互轉(zhuǎn)換;設置全局的portbase可以重新分配端口值,映射到更高的端口,這樣測試就不會與原來的重復,還能運行原來的服務的,便于測試*/

      s=socket(PF_INET,type,ppe→p_proto);

      if(s<0)

      errexit("can'tcreatesocket:%s\n",strerror(errno));

      /*創(chuàng)建套接字,成功則返回描述符S,失敗則報錯*/

      bind(s,(structsockaddr*)&sin,sizeof(sin)) /*綁定端口地址*/

      listen(s,qlen) /*調(diào)用listen函數(shù)設為監(jiān)聽狀態(tài)*/

      5結(jié)束語

      該文共分為四個部分,第一部分比較詳細地介紹了循環(huán)和并發(fā)服務器的概念;第二部分詳細介紹循環(huán)和并發(fā)服務器的工作原理及算法,第三部分主要講循環(huán)和并發(fā)服務器比較及應用場合,第四部分是舉出循環(huán)服務器和并發(fā)服器的程序?qū)嵗a并進行分析。在撰寫這篇論文過程中,明顯感覺該學科的的難度,但正是在這個摸索的過程中,通過實踐對該課程的知識有了更深層的理解。

      參考文獻:

      [1]ComerDE,StevensDL.用TCP/IP進行網(wǎng)際互連[M].趙剛,林瑤,蔣慧,譯.北京:電子工業(yè)出版社,2011.

      [2]杜煜.計算機網(wǎng)絡基礎[M].北京:人民郵電出版社,2002.

      [3]RameshS,PerrorsHG.Amultilayerclient-serverqueueingnetworkmodelwithsynchronousandasynchronousmessages[J].IEEETransactiononSoftwareEngineering,2000,26(11):1086-1100.

      [4]洪英.Linux中帳號的安全管理方法[J].科技創(chuàng)新導報,2008(4):12.

      [5]關于main函數(shù)的(int_argc,char_argv[]).51CTOLinux編程學習[Z].

      [6]武奇生.網(wǎng)絡與TCP/IP協(xié)議[M].西安:西安電子科大出版社,2010.

      猜你喜歡
      應用算法
      基于MapReduce的改進Eclat算法
      Travellng thg World Full—time for Rree
      進位加法的兩種算法
      算法初步兩點追蹤
      基于增強隨機搜索的OECI-ELM算法
      多媒體技術(shù)在小學語文教學中的應用研究
      考試周刊(2016年76期)2016-10-09 08:45:44
      分析膜技術(shù)及其在電廠水處理中的應用
      科技視界(2016年20期)2016-09-29 14:22:00
      GM(1,1)白化微分優(yōu)化方程預測模型建模過程應用分析
      科技視界(2016年20期)2016-09-29 12:03:12
      煤礦井下坑道鉆機人機工程學應用分析
      科技視界(2016年20期)2016-09-29 11:47:01
      氣體分離提純應用變壓吸附技術(shù)的分析
      科技視界(2016年20期)2016-09-29 11:02:20
      大邑县| 宿迁市| 赤城县| 河津市| 本溪| 青浦区| 兴和县| 神池县| 津南区| 义乌市| 绥阳县| 尚义县| 故城县| 义马市| 同心县| 庆元县| 安龙县| 两当县| 潞城市| 云安县| 藁城市| 安庆市| 龙口市| 塔城市| 保山市| 西宁市| 宝兴县| 永顺县| 兰州市| 宜君县| 铜川市| 麻阳| 葵青区| 泸溪县| 深水埗区| 三江| 集贤县| 定南县| 华容县| 通辽市| 辽宁省|