Linux下的幾種併發伺服器的設計模式
Linux下的幾種併發伺服器的設計模式
1.單執行緒或者單程序
相當於短連結,當accept之後,就開始資料的接收和資料的傳送,不接受新的連線,即一個server,一個client,不存在併發。
2.迴圈伺服器和併發伺服器
2.1 迴圈伺服器:一個server只能一次只能接收一個client,噹噹前client結束訪問之後才能進行下一個client的連線。
2.2 併發伺服器:一個server同一時間可以響應很多客戶端的訪問。
3.select+多執行緒模式
併發伺服器的三種實現方式
3.1 多程序併發伺服器
是指TCP連線後,每一個客戶機的請求並不由伺服器直接處理,而是由伺服器建立一個子程序來處理
3.2 多執行緒併發伺服器
多程序伺服器是對多程序的伺服器的改進,由於多程序伺服器在建立程序時要消耗較大的系統資源,所以用執行緒來取代程序,這樣服務處理程式可以較快的建立。據統計,建立執行緒於建立程序要快10100倍,所以又把執行緒稱為“輕量級”程序。程序與程序不同的是:一個程序內所有執行緒共享相同的全域性記憶體,全域性變數等資訊。
是指TCP連線後,每一個客戶機的請求並不由伺服器直接處理,而是由伺服器創
3.3 多路複用I/O
I/O是為了解決執行緒/程序阻塞在那個I/O呼叫中,常用select或者pool
4.epoll
在linux2.6之後有的epoll,實用的方法是:用一個執行緒專門進行埠的監聽,accept接收到連線的時候,把連線設定成非阻塞方式,把epoll時間設定成邊緣觸發方式,加入epoll管理。接收執行緒阻塞在epoll的等待事件函式。另外一個執行緒專門用於資料傳送。
注意:
4.1 如果把epoll設定成水平觸發效率就下降採用select的水平。
4.2 Unix系統下有單個程序開啟的描述符的限制,還有系統內開啟的描述符的數目限制。系統內開啟的描述符數目限制由軟硬連結限制兩個。硬連線是根據機器的配置而不同。軟連線限制可以修改但是必須小於硬限制。
應用:
Linux下大規模的TCP併發。
當前併發還有其它的方式。比如執行緒池。程序池等,每種模式都有他的優缺點,如果大規模的併發,採用epoll會更好。
epoll的時間設定有邊緣觸發方式和水平觸發方式
1)水平觸發方式:
如果檔案描述符已經就緒可以非阻塞的執行IO操作了,此時會觸發通知。允許在任意時候重複檢測IO的狀態,沒有必要每次描述符就緒後儘可能多的執行IO,select,poll就屬於水平觸發事件。
只要滿足要求就觸發一個事件。
2)邊緣觸發方式:
如果檔案描述符自上次狀態改變後有新的IO活動到來,此時會觸發通知。在收到一個IO事件通知儘可能多的執行IO操作,因為如果再一次通知中沒有執行完IO那麼就需要等到下一次新的IO活動到來才能獲取就緒的描述符。訊號驅動式IO就屬於邊緣觸發。
每當狀態改變就觸發一個事件。
eg:現在有一個1000個位元組的報文,無論是水平觸發還是邊緣觸發,都會發送一個只讀通知,當收到了100個位元組後,水平觸發因為還有位元組沒有讀完,就會發送一個只讀通知,但是邊緣觸發會一直保持等待的通知,等待接下來的報文的到來,直到邊緣觸發返回EWOULDBLOCK就摒棄這個socket。