1. 程式人生 > >LINUX環境並發服務器的三種實現模型

LINUX環境並發服務器的三種實現模型

服務 sset 成了 nec 使用 ndt 系統調用 accept listen

服務器設計技術有很多,按使用的協議來分有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(...);

轉自:http://www.cnblogs.com/lchb/articles/2749354.html

LINUX環境並發服務器的三種實現模型