使用多線程還是用IO復(fù)用select?
選用多線程還是IO多路復(fù)用必須要看場景的!
選擇select還是epoll也是需要看場景的!
如果是短連接,服務(wù)器使用線程池(多線程)處理完畢,馬上進(jìn)行釋放,保證活躍的線程所需要的內(nèi)存和CPU效率是在服務(wù)器承受范圍之內(nèi),那么多線程比IO多路復(fù)用效果要好,因?yàn)闊o論是select還是epoll都需要去額外的監(jiān)聽,監(jiān)聽到需要數(shù)據(jù)處理,才調(diào)用回調(diào)函數(shù),分配處理線程去執(zhí)行,這段時間有性能和資源的消耗,這種情況無疑是多線程模型更有優(yōu)勢!
如果是長連接,因?yàn)檫B接長時間不釋放,服務(wù)端需要保持線程去維護(hù)連接,這時候所有空閑的連接都相當(dāng)于一個阻塞的狀態(tài),而且多線程需要的內(nèi)存資源比較多,高并發(fā)的情況服務(wù)器直接死機(jī)了!而使用IO多路復(fù)用,用來維持連接的線程只有一個(或幾個),不會有多余的內(nèi)存開銷,這時候IO多路復(fù)用的優(yōu)勢得以體現(xiàn)!
如果確定選擇IO多路復(fù)用,又該選擇select/epoll哪種模型呢?
首先來看下select和epoll的本質(zhì)區(qū)別:都有一個監(jiān)聽線程去監(jiān)聽事件,但是select采取輪詢的方式,不管有多少連接過來都要一一輪詢,有通信數(shù)據(jù)就處理,而epoll是把所有socket對應(yīng)的文件掛在紅黑樹上,而活躍的放在一張雙向鏈表中,只處理這個鏈表中的連接!如果有新的連接需要處理,從紅黑樹上塞到鏈表中進(jìn)行處理!
比如1000個連接中,只有十個有數(shù)據(jù)傳輸,select需要從1000個中遍歷出這10個,然后進(jìn)行處理,而epoll模型只需要從鏈表中取出來即可使用!
由此可見,如果是少量連接,同時大量連接都是活躍的情況下,select可能稍微略勝一籌,但如果是大量連接,且活躍數(shù)占比少的情況,epoll堪稱完美模型,在可預(yù)見的范圍中,epoll增加連接,性能幾乎不衰減!
寫一個類似epoll的處理模型,會對以后的高并發(fā),多線程處理大有助益,更多的技術(shù)分享,敬請關(guān)注。。。