网络编程模型综述 之 多线程模型
每個連接對應一個線程
???????? 一個網絡socket對應一個處理線程,socket采用阻塞I/O模型;
???????? 這種模型是小程序和java常用的策略,對于交互式的長連接應用也是常見的選擇(比如BBS),也常用來做內部服務器交互的模型。這種策略很難滿足高性能程序的需求,好處是實現極其簡單,容易嵌入復雜的交互邏輯。Apache、ftpd等都是這種工作模式。
線程池
線程池一般有兩種模式:Half-Sync/Half-Async模式和Leader/Followers模式
半同步、半異步模式(Half-Sync/Half-Async)
???????? 這種模式有三部分組成:異步事件接收層、事件同步隊列、同步事件處理層;
???????? 其中,異步事件接收層為一個線程,同步事件處理層可以有多個線程;
???????? 它的工作流程很清晰:
1.?????? 異步線程負責檢查網絡的異步事件;
2.?????? 發生網絡事件時,異步線程把網絡事件放入事件隊列;
3.?????? 同步線程從隊列中獲取網絡事件,并執行同步的讀或寫操作;
這個過程需要注意的是,不要引起兩個同步線程同時接收或發送一個socket的情況。
領導者、追隨者模式(Leader/Followers)
???????? 這種模式與Half-Sync/Half-Async完全不同,沒有事件隊列,沒有固定的事件接收者,每個線程都是事件接收者,也是處理者;
???????? Leader/Followers的流程:
1.?????? 準備若干個線程用來處理大量的事件;
2.?????? 有一個線程作為Leader,等待事件的發生;其他的線程作為Follower,僅僅是睡眠;
3.?????? 有事件需要處理時,如果Leader能很快處理掉,Leader會再次進入等待狀態;
4.?????? 如果Leader不能馬上處理完,Leader則從Followers中指定一個新的Leader,自己去處理事件,不再當Leader;
5.?????? 被喚醒的Follower作為新的Leader等待事件的發生;
6.?????? 處理事件的線程處理完畢以后,就會成為Follower的一員,直到被喚醒成為Leader;
IOCP就是典型的L/F的工作模式,當線程1從GetQueuedCompletionStatus這里返回后,如果線程1的處理過程沒有超過某個時間段,而是很快就返回,之后繼續GetQueuedCompletionStatus,那OS會讓新到的數據從線程1的GetQueuedCompletionStatus獲取,這樣就減少了線程的CONTEXT切換代碼;反之,如果線程1處理時間比較長,那么新到的數據將會由線程2的GetQueuedCompletionStatus獲得;
多進程模型
???????? 一個客戶端對應一個進程來處理,也是一種歷史悠久的網絡模型,linux的典型例子就是inetd服務。這種方式用來處理間斷性內部數據處理時,比其常駐內存的stand-alone模式更節省系統資源。
總結
以上是生活随笔為你收集整理的网络编程模型综述 之 多线程模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 存入余额宝的钱几天开始有收益?最低存入多
- 下一篇: 南方零钱佳和易方达余额佳的区别,体现在这