線程池模式一般分為兩種:L/F領(lǐng)導(dǎo)者與跟隨者模式、HS/HA半同步/半異步模式。
HS/HA 半同步/ 半異步模式 :分為三層,同步層、隊列層、異步層,又稱為生產(chǎn)者消費者模式,主線程處理I/O事件并解析然后再往隊列丟數(shù)據(jù),然后消費者讀出數(shù)據(jù)進(jìn)行應(yīng)用邏輯處理;
優(yōu)點:簡化編程將低層的異步I/O和高層同步應(yīng)用服務(wù)分離,且沒有降低低層服務(wù)性能。集中層間通信。
缺點:需要線程間傳輸數(shù)據(jù),因此而帶來的動態(tài)內(nèi)存分配,數(shù)據(jù)拷貝,語境切換帶來開銷。高層服務(wù)不可能從底層異步服務(wù)效率中獲益。
L/F 領(lǐng)導(dǎo)者跟隨者模式 :在LF線程池中,線程可處在3種線程狀態(tài)之一: leader、follower或processor。處于leader狀態(tài)的線程負(fù)責(zé)監(jiān)聽tb網(wǎng)絡(luò)端口,當(dāng)有消息到達(dá)時,該線程負(fù)責(zé)消息分離,并從處于 follower狀態(tài)中的線程中按照某種機(jī)制如FIFO或基于優(yōu)先級等選出一個來當(dāng)新的leader,然后將自己設(shè)置為processor狀態(tài)去分配和處 理該事件。處理完畢后線程將自身的狀態(tài)設(shè)置為follower狀態(tài)去等待重新成為leader。在整個線程池中同一時刻只有一個線程可以處于leader 狀態(tài),這保證了同一事件不會被多個線程重復(fù)處理。
缺點:實現(xiàn)復(fù)雜性和缺乏靈活性;
優(yōu)點:增強(qiáng)了CPU高速緩存相似性,消除了動態(tài)內(nèi)存分配和線程間的數(shù)據(jù)交換。
兩種模式性能分析:
L/F模式處理一個消息的時間為多路分離、分配、處理的時間,加上線程管理時間,LF中多個線程共享一個事件源,所以,需要協(xié)調(diào)它們間的行為,即 有同步開銷,L/F同步開銷僅為申請/釋放鎖的開銷,在LF處理請求過程中并不需要線程上下文切換,但是在線程由follower成為leader時需要 進(jìn)行線程上下文切換,所以當(dāng)兩個請求同時到達(dá)時,這種上下文切換會影響第二個請求的處理時間,也會帶來一定的上下文開銷。
T(L/F)=T(多路分離)+T(分配)+T(處理)+T(同步)+T(上下文)
HS/HA模式監(jiān)聽線程和工作線程間通過一個消息隊列來交換數(shù)據(jù)。這會帶來數(shù)據(jù)傳遞開銷,。同時,監(jiān)聽線程和工作線程都需要去訪問消息隊列,造成 了資源的競爭,需要額外的同步機(jī)制來協(xié)調(diào)他們的行為,包括監(jiān)聽線程獲取和釋放資源鎖,對應(yīng)的工作線程獲取和釋放資源鎖,以及監(jiān)聽線程在將一個請求放入隊列 后通知工作線程帶來的開銷,我們稱此為同步開銷,HS/HA模式的同步開銷大于L/F的同步開銷,。一個請求由監(jiān)聽線程負(fù)責(zé)放入消息隊列,但是卻由工作線 程來處理,所以,每個請求都會造成一次線程上下文切
換,由此帶來的開銷我們稱為上下文開銷。
T (H/H)=T(多路分離)+T(分配)+T(處理)+T(同步)+T(數(shù)據(jù)傳遞)+T(上下文)
從上面分析可以看出沒有并發(fā)情況下L/F模式線程池模式性能優(yōu)于HS/HA模式。
并發(fā)性能分析:
T(多路分離)、T(分配):LF和HH中把每一個消息的到來當(dāng)作一個事件來處理。tbw事件分配所做的工作是在一個事件處理器注冊表中為一個事件查找 事件處理器。這一步驟花費的時間隨著當(dāng)前注冊的事件處理器的個數(shù)變化。當(dāng)線程池接受用戶連接請求后會為每一個連接注冊一個事件處理器,所有通過該連接發(fā)來 的請求都將由同一個事件處理器來處理。而事件處理器表采用一個平衡二叉樹來實現(xiàn)。因此,事件分配的時間可以認(rèn)為是隨著并發(fā)用戶數(shù)的增大而增大;
T(處理)處理消息和管理線程所需的時間都不受并發(fā)用戶數(shù)的影響。
T(線程管理),多線程帶來的線程管理開銷只會隨著線程池中線程數(shù)而變化,相對固定。
LF和HH的吞吐量會隨著并發(fā)用戶數(shù)的增加而增加。當(dāng)并發(fā)用戶數(shù)達(dá)到一定數(shù)量時,CPU成為系統(tǒng)瓶頸,此后增大并發(fā)用戶數(shù)不僅不能增加并發(fā)處理的請求個數(shù),反而會加大多路分離和分配的時間,從而使得系統(tǒng)吞吐量下降。
最佳性能時線程線:
隨著線程數(shù)的增多吞吐量不斷增大,當(dāng)達(dá)到最大值后有一個短暫的保持階段,此后繼續(xù)增大線程數(shù)反而會使得吞吐量減小。而且當(dāng)請求類型為計算密集型時線程數(shù)對
HH 的吞吐量的影響并不是很明顯。原因是HH線程池在增加線程數(shù)時線程管理開銷也有較大幅度的增加。因此,通過增大線程數(shù)來改善系統(tǒng)性能對HH來說并不是一種有效的方法。