常見併發伺服器方案

2021-09-29 07:35:25 字數 2450 閱讀 4459

1. 迴圈式/迭代式伺服器

1)短連線(如果是長連線則需要在read與write之間增加乙個迴圈,那樣的話外層迴圈無法退出,接收不到其它連線請求,即只能服務乙個客戶端);

2)單執行緒,無法充分利用多核cpu;

3)不適合執行時間較長的服務(encode->compute->decode執行時間過長會影響其他客戶端連線的響應速度)。

2. 並髮式(concurrent)伺服器

1)長連線;

2)one connection per process(主程序每次fork 後要關閉connfd,子程序要關閉listenfd),one connection per thread(執行緒間共享檔案描述符,因此不用也不能關閉socket,否則會影響主線程的監聽和子執行緒與客戶端之間的通訊);

3)適合執行時間較長的服務。

1)預先建立程序/執行緒;

2)可以提高連線的響應速度;

3)當多個子程序阻塞於accept時,若有乙個客戶端連線請求到來,則多個子程序都會被觸發,但只有乙個accept有成功返回,這種現象稱為「驚群」。

4. 反應式伺服器(reactor模式)

1)select/poll/epoll;

2)併發處理多個請求,實際上是在乙個執行緒中完成的,無法充分利用多核cpu(單執行緒輪詢);

3)不適合執行時間較長的服務(為了讓客戶端感覺是在「併發」處理而不是「迴圈」處理,每個請求必須在相對較短時間內執行)。

5. reactor + thread per request(過渡方案)

6. reactor + worker thread(過渡方案)

每個連線都在乙個工作執行緒中完成,能充分利用多核cpu。

7. reactor + threadpool(能適應密集計算)

第五、第六種方法的改進。

muduo庫的/example/suduku/中有乙個reactor + threadpool的例子,因為數獨求解是計算密集型任務。

在實踐中,為了使reactor能快速返回事件迴圈中去響應請求,經常將讀到的資料put到乙個環形記憶體佇列(一般記憶體or共享記憶體),而threadpool的執行緒則從這個環形記憶體佇列中讀取資料進行計算。

8. multiple reactors(能適應更大的突發i/o請求)

1)reactors in threads(one loop per thread) memcached就是這種模型,乙個主線程,多個工作執行緒,主線程reactor負責接收客戶端連線,每個執行緒有各自的reactor負責執行任務佇列中的任務。

2)reactors in processes;

3)round robin(輪叫);

4)一般來說乙個subreactor適用於乙個千兆網口。

9. multiple reactors + threadpoll(one loop per thread + threadpool) (能適應突發i/o與密集計算)

muduo庫主推的一種併發伺服器模型!!!

多個subreactor共享乙個執行緒池。

10. proactor伺服器(proactor模式,基於非同步i/o)

1)理論上proactor比reactor效率要高一些;

2)非同步i/o能夠讓i/o操作與計算重疊,充分利用dma特性;

3)linux非同步i/o:

glibc aio (aio_*),有bug;

kernel native aio (io_*),也不完美。目前僅支援o_direct方式來對磁碟讀寫,跳過系統快取。要自己實現快取,難度不小。

4)boost asio實現的proactor,實際上不是真正意義上的非同步i/o,底層是用epoll來實現的,模擬非同步i/o。

多種併發伺服器之間的對比

常見併發伺服器模型

1 短連線 如果是長連線則需要在read與write之間增加乙個迴圈,那樣的話外層迴圈無法退出,接收不到其它連線請求,即只能服務乙個客戶端 2 單執行緒,無法充分利用多核cpu 3 不適合執行時間較長的服務 encode compute decode執行時間過長會影響其他客戶端連線的響應速度 1 長...

併發伺服器

併發伺服器 伺服器使用多個控制線程,同時處理多個客戶請求。有關併發執行的細節取決於所用作業系統。但其思路很簡單 併發伺服器程式被分為主程式 執行緒 和控制代碼兩部分,主程式只接受來自客戶的連線請求,並為該客戶建立乙個控制線程 每乙個控制線程只與乙個客戶互動,並執行控制代碼程式。當處理完乙個客戶後,該...

併發伺服器

1.select優點 跨平台缺點 對於單個程序的檔案描述符的數量存在最大限制linux一般為1024,32位機器位1024,64位機器位2048 2 對socket進行掃瞄時是一次掃瞄的,即採用輪詢的方法,效率較低 3.遍歷列表浪費cpu時間 poll優點 解決了套接字的上限問題 缺點 效率跟sel...