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