服務器設計-處理併發請求

服務器設計技術有很多,按使用的協議來分有TCP服務器和UDP服務器。按處理方式來分有循環服務器和併發服務器。


在網絡程序裏面,一般來說都是許多客戶對應一個服務器,爲了處理客戶的請求,對服務端的程序就提出了特殊的要求。

目前最常用的服務器模型有:

·循環服務器:服務器在同一時刻只能響應一個客戶端的請求

·併發服務器:服務器在同一時刻可以響應多個客戶端的請求

1.循環服務器實現

1.1 UDP循環服務器的實現方法:

UDP循環服務器每次從套接字上讀取一個客戶端的請求->處理->然後將結果返回給客戶機。

因爲UDP是非面向連接的,沒有一個客戶端可以老是佔住服務端。只要處理過程不是死循環,服務器對於每一個客戶機的請求總是能夠滿足。

UDP循環服務器模型爲:

socket(...);

bind(...);

while(1)
{

   recvfrom(...);

   process(...);

   sendto(...);
}

1.2 TCP循環服務器的實現方法

TCP循環服務器接受一個客戶端的連接,然後處理,完成了這個客戶的所有請求後,斷開連接。TCP循環服務器一次只能處理一個客戶端的請求,只有在這個客戶的所有請求滿足後,服務器纔可以繼續後面的請求。如果有一個客戶端佔住服務器不放時,其它的客戶機都不能工作了,因此,TCP服務器一般很少用循環服務器模型的

TCP循環服務器模型爲:

socket(...);

bind(...);

listen(...);

while(1)
{

   accept(...);

   process(...);

   close(...);
}

 

2 三種併發服務器實現方法

一個好的服務器,一般都是併發服務器。併發服務器設計技術一般有:多進程服務器、多線程服務器、I/O複用服務器等。

2.1 多進程併發服務器

在Linux環境下多進程的應用很多,其中最主要的就是網絡/客戶服務器。多進程服務器是當客戶有請求時 ,服務器用一個子進程來處理客戶請求。父進程繼續等待其它客戶的請求。這種方法的優點是當客戶有請求時 ,服務器能及時處理客戶 ,特別是在客戶服務器交互系統中。對於一個 TCP服務器,客戶與服務器的連接可能並不馬上關閉 ,可能會等到客戶提交某些數據後再關閉 ,這段時間服務器端的進程會阻塞 ,所以這時操作系統可能調度其它客戶服務進程。比起循環服務器大大提高了服務性能。

TCP多進程併發服務器

TCP併發服務器的思想是每一個客戶機的請求並不由服務器直接處理,而是由服務器創建一個子進程來處理。

socket(...);

bind(...);

listen(...);

while(1)
{

   accpet(...);

   if(fork(...) == 0)
   {

    process(...);

    close(...);

    exit(...);
   }
   close(...);
}

2.2多線程服務器

多線程服務器是對多進程的服務器的改進 ,由於多進程服務器在創建進程時要消耗較大的系統資源 ,所以用線程來取代進程 ,這樣服務處理程序可以較快的創建。據統計 ,創建線程與創建進程要快 10100 倍 ,所以又把線程稱爲“輕量級”進程。線程與進程不同的是:一個進程內的所有線程共享相同的全局內存、全局變量等信息。這種機制又帶來了同步問題。以下是多線程服務器模板:

socket(...);

bind(...);

listen(...);

while(1)
{

   accpet(...);

   if((pthread_create(...))!==-1)
   {

     process(...);

     close(...);

     exit(...);
   }
   close(...);
}

2.3 I/O複用服務器

I/ O複用技術是爲了解決進程或線程阻塞到某個 I/ O系統調用而出現的技術 ,使進程不阻塞於某個特定的I/ O系統調用。它也可用於併發服務器的設計,常用函數select 或 poll來實現。

socket(...);

bind(...);

listen(...);

while(1)
{

  if(select(...)>0)

   if(FD_ISSET(...)>0)

        {

accpet(...);

            process(...);

}

   close(...);
}

 

以上都是TCP服務器端的程序,TCP客戶端的程序可以通用:

 

socket(...);

connect(...);

listen(...);

process(...);

close(...);

發佈了25 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章