{eval=Array;=+count(Array);}

国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

問(wèn)答專(zhuān)欄Q & A COLUMN

Linux開(kāi)發(fā),使用多線程還是用IO復(fù)用select/epoll?

YorkChenYorkChen 回答0 收藏1
問(wèn)題描述:每分鐘有2K用戶(hù)訪問(wèn),服務(wù)器端處理請(qǐng)求選擇用多線程(每個(gè)用戶(hù)一個(gè)線程),還是用I/O復(fù)用?
收藏問(wèn)題

3條回答

hightopo

hightopo

回答于2022-06-27 17:14

選用多線程還是IO多路復(fù)用必須要看場(chǎng)景的!

選擇select還是epoll也是需要看場(chǎng)景的!

如果是短連接,服務(wù)器使用線程池(多線程)處理完畢,馬上進(jìn)行釋放,保證活躍的線程所需要的內(nèi)存和CPU效率是在服務(wù)器承受范圍之內(nèi),那么多線程比IO多路復(fù)用效果要好,因?yàn)闊o(wú)論是select還是epoll都需要去額外的監(jiān)聽(tīng),監(jiān)聽(tīng)到需要數(shù)據(jù)處理,才調(diào)用回調(diào)函數(shù),分配處理線程去執(zhí)行,這段時(shí)間有性能和資源的消耗,這種情況無(wú)疑是多線程模型更有優(yōu)勢(shì)!

如果是長(zhǎng)連接,因?yàn)檫B接長(zhǎng)時(shí)間不釋放,服務(wù)端需要保持線程去維護(hù)連接,這時(shí)候所有空閑的連接都相當(dāng)于一個(gè)阻塞的狀態(tài),而且多線程需要的內(nèi)存資源比較多,高并發(fā)的情況服務(wù)器直接死機(jī)了!而使用IO多路復(fù)用,用來(lái)維持連接的線程只有一個(gè)(或幾個(gè)),不會(huì)有多余的內(nèi)存開(kāi)銷(xiāo),這時(shí)候IO多路復(fù)用的優(yōu)勢(shì)得以體現(xiàn)!

如果確定選擇IO多路復(fù)用,又該選擇select/epoll哪種模型呢?

首先來(lái)看下select和epoll的本質(zhì)區(qū)別:都有一個(gè)監(jiān)聽(tīng)線程去監(jiān)聽(tīng)事件,但是select采取輪詢(xún)的方式,不管有多少連接過(guò)來(lái)都要一一輪詢(xún),有通信數(shù)據(jù)就處理,而epoll是把所有socket對(duì)應(yīng)的文件掛在紅黑樹(shù)上,而活躍的放在一張雙向鏈表中,只處理這個(gè)鏈表中的連接!如果有新的連接需要處理,從紅黑樹(shù)上塞到鏈表中進(jìn)行處理!

比如1000個(gè)連接中,只有十個(gè)有數(shù)據(jù)傳輸,select需要從1000個(gè)中遍歷出這10個(gè),然后進(jìn)行處理,而epoll模型只需要從鏈表中取出來(lái)即可使用!

由此可見(jiàn),如果是少量連接,同時(shí)大量連接都是活躍的情況下,select可能稍微略勝一籌,但如果是大量連接,且活躍數(shù)占比少的情況,epoll堪稱(chēng)完美模型,在可預(yù)見(jiàn)的范圍中,epoll增加連接,性能幾乎不衰減!

寫(xiě)一個(gè)類(lèi)似epoll的處理模型,會(huì)對(duì)以后的高并發(fā),多線程處理大有助益,更多的技術(shù)分享,敬請(qǐng)關(guān)注。。。

評(píng)論0 贊同0
  •  加載中...
DoINsiSt

DoINsiSt

回答于2022-06-27 17:14

多線程和用select/epoll是沒(méi)有關(guān)聯(lián)的,在select和epoll模型里也可以使用多線程進(jìn)行io處理,select/epoll 的出現(xiàn)是為了解決一個(gè)線程對(duì)應(yīng)一個(gè)請(qǐng)求時(shí)阻塞線程的問(wèn)題,基于epoll的事件模型,解決了線程的阻塞問(wèn)題即一個(gè)線程可以為多個(gè)請(qǐng)求服務(wù)

評(píng)論0 贊同0
  •  加載中...
chanjarster

chanjarster

回答于2022-06-27 17:14

多線程既每個(gè)線程負(fù)責(zé)處理一個(gè)用戶(hù)連接,當(dāng)?shù)却龜?shù)據(jù)(如讀寫(xiě)數(shù)據(jù))時(shí)線程被阻塞掛起,數(shù)據(jù)就緒后線程恢復(fù)執(zhí)行。優(yōu)點(diǎn)是開(kāi)發(fā)相對(duì)簡(jiǎn)單,缺點(diǎn)是處理并發(fā)能力差一些。

IO復(fù)用是事件驅(qū)動(dòng)的方式,既等待數(shù)據(jù)時(shí)線程保存處理當(dāng)前連接的上下文,然后線程切換去處理其它數(shù)據(jù)就緒的請(qǐng)求。優(yōu)點(diǎn)是處理并發(fā)的能力強(qiáng),缺點(diǎn)是開(kāi)發(fā)相對(duì)復(fù)雜一些。一些開(kāi)源的庫(kù),如libevent,可以讓事件驅(qū)動(dòng)的開(kāi)發(fā)更容易。

Web服務(wù)器Apache和Nginx分別對(duì)應(yīng)上面的兩種模式。Nginx就是以高性能高并發(fā)著稱(chēng)。

在問(wèn)題描述中每分鐘2K的請(qǐng)求,如果能夠在一秒內(nèi)就能完成一個(gè)請(qǐng)求的處理,并發(fā)在每秒30到40之間,那多線程模式就可以了,40個(gè)線程就能達(dá)到要求;如果每個(gè)請(qǐng)求要一分鐘才能處理完,那并發(fā)連接數(shù)就是2K,創(chuàng)建2k個(gè)線程可能就不大現(xiàn)實(shí)。可以考慮基于事件驅(qū)動(dòng)的方式。

具體選擇那種的關(guān)鍵還是看,同時(shí)保持多大的并發(fā)連接。

評(píng)論0 贊同0
  •  加載中...

最新活動(dòng)

您已邀請(qǐng)0人回答 查看邀請(qǐng)

我的邀請(qǐng)列表

  • 擅長(zhǎng)該話題
  • 回答過(guò)該話題
  • 我關(guān)注的人
向幫助了您的網(wǎng)友說(shuō)句感謝的話吧!
付費(fèi)偷看金額在0.1-10元之間
<