国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Linux 下多線程的方案實(shí)現(xiàn)與對(duì)比

2024-05-03 05:42:10劉坤禹王歡歡甄帥輝
信息記錄材料 2024年3期
關(guān)鍵詞:任務(wù)量空閑線程

王 鑫,扈 月,劉坤禹,王歡歡,甄帥輝

(1 中國(guó)電子科技集團(tuán)公司第三十研究所 四川 成都 610041)

(2 中國(guó)人民解放軍31012 部隊(duì) 北京 100091)

0 引言

線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位,它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位[1]。多線程技術(shù)主要解決任務(wù)并發(fā)的問題,它的核心在于將宏觀的任務(wù)量拆解為微觀的任務(wù)分量,將任務(wù)分量派發(fā)到不同的線程上,從而減少任務(wù)的處理時(shí)間。多線程使用場(chǎng)景一般分為兩種:第一種為按需分配,即針對(duì)每個(gè)任務(wù)派生一個(gè)獨(dú)立的線程去處理該任務(wù),雖然在任務(wù)量少的應(yīng)用中,該方式處理效率高,但是在任務(wù)量巨大的應(yīng)用中,該方式在線程創(chuàng)建和銷毀中將耗費(fèi)大量時(shí)間;第二種為預(yù)先分配,即提前創(chuàng)建包含一定數(shù)目線程的線程池,線程池又分為靜態(tài)線程池和動(dòng)態(tài)線程池兩種,靜態(tài)線程池通過預(yù)先創(chuàng)建包含固定數(shù)量線程的線程池去處理任務(wù),動(dòng)態(tài)線程池相較于靜態(tài)線程池的不同點(diǎn)在于可以通過任務(wù)量的變化動(dòng)態(tài)調(diào)整線程池中線程的數(shù)量,它們都能節(jié)省線程的創(chuàng)建和銷毀時(shí)間,從而降低每個(gè)線程的平均創(chuàng)建和銷毀時(shí)間。

靜態(tài)線程池預(yù)先創(chuàng)建一定數(shù)量線程后,線程數(shù)量不再變化,用以處理所有任務(wù),但當(dāng)任務(wù)達(dá)到波峰時(shí),任務(wù)響應(yīng)時(shí)間將會(huì)加大,降低用戶體驗(yàn)感。動(dòng)態(tài)線程池也是預(yù)先創(chuàng)建一定數(shù)量線程后,通過對(duì)任務(wù)量的分析,動(dòng)態(tài)調(diào)整線程池中線程數(shù)量的大小,降低任務(wù)響應(yīng)時(shí)間。動(dòng)態(tài)線程池實(shí)現(xiàn)時(shí)面臨一些問題,例如動(dòng)態(tài)調(diào)整線程池系數(shù)不恰當(dāng)和單個(gè)工作線程如何回收銷毀。

本文將對(duì)以上提出的三種多任務(wù)處理模型進(jìn)行分析,并著重優(yōu)化設(shè)計(jì)動(dòng)態(tài)線程池,通過不同規(guī)模的模擬任務(wù),不同模型參數(shù)的調(diào)整,對(duì)比驗(yàn)證三種模型。

1 方案介紹

1.1 多線程方案

多線程方案即“隨時(shí)請(qǐng)求,隨時(shí)創(chuàng)建,隨時(shí)回收”,任務(wù)請(qǐng)求送入任務(wù)調(diào)度模塊,任務(wù)調(diào)度模塊創(chuàng)建線程進(jìn)行任務(wù)請(qǐng)求處理,任務(wù)處理完畢后,線程回收模塊進(jìn)行線程的回收和銷毀,面對(duì)多少任務(wù),即需創(chuàng)建多少個(gè)線程進(jìn)行任務(wù)處理。

該方案邏輯簡(jiǎn)單,實(shí)現(xiàn)便捷,適用于小規(guī)模且無周期性的任務(wù)量。但是當(dāng)任務(wù)量爆發(fā)式增長(zhǎng)時(shí),該方案受限于操作系統(tǒng)和硬件資源所能創(chuàng)建的線程數(shù)總量,當(dāng)線程數(shù)達(dá)到上限后,新來的任務(wù)將不能得到及時(shí)處理[2]。

1.2 靜態(tài)線程池方案

靜態(tài)線程池方案即“預(yù)先創(chuàng)建,隨時(shí)請(qǐng)求,統(tǒng)一回收”,初始化模塊創(chuàng)建預(yù)先設(shè)定數(shù)量M 的線程,當(dāng)出現(xiàn)任務(wù)請(qǐng)求,通過任務(wù)入隊(duì)模塊將任務(wù)存入任務(wù)隊(duì)列中,線程池從任務(wù)隊(duì)列中獲取任務(wù),進(jìn)行任務(wù)處理,線程池的數(shù)量始終保持不變。方案示意如圖1 所示。

圖1 靜態(tài)線程池方案示意圖

針對(duì)一定規(guī)模且周期性的任務(wù)量,利用靜態(tài)線程池的方案,可以節(jié)省線程創(chuàng)建和銷毀的時(shí)間,加快任務(wù)處理速度,提升用戶體驗(yàn)感。當(dāng)任務(wù)量達(dá)到線程池的數(shù)量M 后,沒有新的線程可以處理任務(wù)隊(duì)列中的任務(wù),會(huì)加大一些任務(wù)的處理時(shí)間,降低用戶體驗(yàn)感。

1.3 動(dòng)態(tài)線程池方案

動(dòng)態(tài)線程池方案即“動(dòng)態(tài)創(chuàng)建,隨時(shí)請(qǐng)求,動(dòng)態(tài)回收”。初始化模塊創(chuàng)建預(yù)先設(shè)定數(shù)量的線程,當(dāng)出現(xiàn)任務(wù)請(qǐng)求,通過任務(wù)入隊(duì)模塊將任務(wù)存入任務(wù)隊(duì)列中,線程池從任務(wù)隊(duì)列中獲取任務(wù),進(jìn)行任務(wù)處理。當(dāng)任務(wù)監(jiān)控模塊檢測(cè)到線程池空閑線程數(shù)量在設(shè)定的時(shí)間T1 內(nèi)一直為0且任務(wù)隊(duì)列中的任務(wù)數(shù)量不為0,任務(wù)監(jiān)控模塊將根據(jù)調(diào)整系數(shù)P1 進(jìn)行新線程的創(chuàng)建;當(dāng)任務(wù)監(jiān)控模塊檢測(cè)到線程池空閑線程數(shù)量在設(shè)定時(shí)間T2 內(nèi)一直不為0 且任務(wù)隊(duì)列中的任務(wù)數(shù)據(jù)為0,任務(wù)監(jiān)控模塊將根據(jù)調(diào)整系數(shù)P2進(jìn)行空閑線程的回收。方案示意如圖2 所示。

圖2 動(dòng)態(tài)線程池方案示意圖

針對(duì)一定規(guī)模、周期性、具有井噴式特性的任務(wù)量,利用動(dòng)態(tài)線程池的方案,不僅可以節(jié)省線程創(chuàng)建和銷毀的時(shí)間,而且當(dāng)任務(wù)量井噴式地增長(zhǎng)時(shí),可以動(dòng)態(tài)調(diào)整線程數(shù)量,加快任務(wù)處理速度,提升用戶體驗(yàn)感。當(dāng)任務(wù)量經(jīng)過潮汐趨于平穩(wěn)時(shí),通過銷毀線程池中空閑的線程,確保線程池的活性[3]。該方案的難點(diǎn)主要為如何確定線程池動(dòng)態(tài)調(diào)整的系數(shù),如何高效回收空閑線程。

因多線程方案和靜態(tài)線程池方案邏輯和結(jié)構(gòu)簡(jiǎn)單,因此下面主要針對(duì)動(dòng)態(tài)線程池進(jìn)行分析與設(shè)計(jì)。

2 動(dòng)態(tài)線程池方案分析與設(shè)計(jì)

傳統(tǒng)動(dòng)態(tài)線程池采用“動(dòng)態(tài)創(chuàng)建,隨時(shí)請(qǐng)求,動(dòng)態(tài)回收”的方式對(duì)線程池進(jìn)行控制,其中動(dòng)態(tài)調(diào)整線程池線程數(shù)和線程池的空閑線程安全退出機(jī)制的選擇對(duì)動(dòng)態(tài)線程池的性能起著關(guān)鍵作用。本文主要針對(duì)以上兩點(diǎn)進(jìn)行分析與設(shè)計(jì)。

2.1 動(dòng)態(tài)調(diào)整線程池線程數(shù)

針對(duì)動(dòng)態(tài)調(diào)整線程數(shù),傳統(tǒng)的做法為基于預(yù)測(cè)公式進(jìn)行線程數(shù)調(diào)整,該方法實(shí)現(xiàn)復(fù)雜,且使用場(chǎng)景具有局限性[4]。

固定線程數(shù)量的線程池在某些場(chǎng)景下不能滿足應(yīng)用需求,線程池常見的動(dòng)態(tài)調(diào)整線程數(shù)量的方案有基于設(shè)定值觸發(fā)和基于任務(wù)量趨勢(shì)預(yù)測(cè)兩種形式:①基于任務(wù)量趨勢(shì)預(yù)測(cè)的方式對(duì)任務(wù)建模要求高,需要結(jié)合統(tǒng)計(jì)學(xué)原理進(jìn)行任務(wù)量趨勢(shì)預(yù)測(cè),能夠真實(shí)反映任務(wù)量的變化從而進(jìn)行高效處理,但是該方式的使用場(chǎng)景具有局限性,且需要較大的算力資源;②基于設(shè)定值觸發(fā)的方式通過預(yù)先設(shè)置不同規(guī)模的參數(shù)集合,通過任務(wù)量的跟蹤選擇合適的參數(shù),實(shí)現(xiàn)簡(jiǎn)單,線程池維護(hù)開銷小且通用性較高。本文為保證線程池的通用性,采用基于設(shè)定值觸發(fā)方式來動(dòng)態(tài)調(diào)整線程池。

(1)合理設(shè)置相關(guān)參數(shù)

若設(shè)線程池中最大線程數(shù)為T_M(jìn)AX,最小線程數(shù)為_M(jìn)IN,最大空閑線程數(shù)為T_FMAX,最小空閑線程數(shù)為T_FMIN,處理原則是:①在線程池初始化階段,創(chuàng)建T_M(jìn)IN個(gè)空閑線程。②線程池中空閑線程數(shù)量T_FNOW 低于T_FMIN 時(shí),通過待處理任務(wù)量派生調(diào)整系數(shù)P1 觸發(fā)線程池調(diào)整進(jìn)行P1×T_M(jìn)IN 個(gè)線程添加。③線程池中空閑線程數(shù)量T_FNOW 不低于T_FMIN 且小于T_FMAX 時(shí),通過固定調(diào)整系數(shù)P2 觸發(fā)線程池調(diào)整進(jìn)行P2×(T_FNOWTFMIN)個(gè)線程刪除。④線程池中空閑線程數(shù)量不低于T_FMAX 時(shí),通過固定調(diào)整系數(shù)P3 觸發(fā)線程池調(diào)整進(jìn)行P2×(T_FNOW-TFMAX)個(gè)線程刪除。⑤調(diào)整過程中保證調(diào)整后的線程池線程數(shù)量小于T_M(jìn)AX 且大于等于T_M(jìn)IN。

(2)延遲銷毀線程

在任務(wù)量激增的情況下通過設(shè)定值觸發(fā)增加一定數(shù)量的線程后,當(dāng)任務(wù)量減少時(shí),需要銷毀這部分創(chuàng)建的線程。此時(shí)并不真正地銷毀這些線程,而是將它放入銷毀列表中,創(chuàng)建并使能定時(shí)器。當(dāng)定時(shí)器計(jì)時(shí)完畢時(shí),若無創(chuàng)建新線程的需求將會(huì)銷毀這些線程;如果在定時(shí)器計(jì)時(shí)完畢前,有創(chuàng)建新線程的需求,將刪除該銷毀列表的定時(shí)器,并使用這些還未銷毀的線程,根據(jù)任務(wù)量變化重復(fù)前面的步驟,從而達(dá)到了提高線程的復(fù)用。

2.2 安全退出線程

針對(duì)空閑線程安全退出,傳統(tǒng)的做法為在線程創(chuàng)建初期進(jìn)行統(tǒng)計(jì),并對(duì)創(chuàng)建的線程進(jìn)行狀態(tài)監(jiān)控,當(dāng)需要減少線程數(shù)量時(shí),通過狀態(tài)監(jiān)控發(fā)現(xiàn)空閑線程并進(jìn)行回收,該方法存在的問題為對(duì)線程進(jìn)行狀態(tài)監(jiān)控將耗費(fèi)大量計(jì)算資源[5]。

線程退出的方式主要分為線程主動(dòng)退出和線程被動(dòng)退出兩種,多線程方案和靜態(tài)線程池方案不需要考慮線程退出的方式,直接進(jìn)行線程回收即可。動(dòng)態(tài)線程池方案需要考慮線程回收的方式,需檢測(cè)線程池中的線程是否處于空閑狀態(tài)。一般采用輪詢或者信號(hào)觸發(fā),輪詢即重復(fù)地查詢某個(gè)線程的狀態(tài),將會(huì)耗費(fèi)大量的計(jì)算資源;信號(hào)量方式需要維護(hù)大量的信號(hào)量,耗費(fèi)大量的存儲(chǔ)資源。

因此本文提出一種空閑自動(dòng)釋放機(jī)制,當(dāng)任務(wù)監(jiān)控模塊做出決策應(yīng)減少線程數(shù)量時(shí),將“自殺”任務(wù)放入任務(wù)隊(duì)列中,此時(shí)空閑線程便無差別地從任務(wù)隊(duì)列中領(lǐng)取任務(wù),從而釋放資源,結(jié)束線程。

3 代碼架構(gòu)

多線程方案即一任務(wù)一線程,用完即毀,使用操作系統(tǒng)自帶函數(shù)即可實(shí)現(xiàn)。

本文通過添加函數(shù)等實(shí)現(xiàn)了線程池創(chuàng)建、初始化、獲取線程數(shù)量和獲取線程池狀態(tài)等接口,通過對(duì)該系列接口的動(dòng)態(tài)組合,可以實(shí)現(xiàn)靜態(tài)線程池和動(dòng)態(tài)線程池兩種方案。

(1)使用方法

(2)接口與功能

采用面向?qū)ο蟮乃枷?,將線程池的方法定義在sl_thread_pool 結(jié)構(gòu)體中,實(shí)現(xiàn)線程池的初始化、狀態(tài)查詢和線程數(shù)量調(diào)整等功能。

針對(duì)多線程方案,通過任務(wù)使能系統(tǒng)函數(shù)pthread_create 創(chuàng)建處理任務(wù)的線程,在該線程內(nèi)首先進(jìn)行系統(tǒng)函數(shù)pthread_detach 操作,使得該線程處理完任務(wù)后可以自動(dòng)退出。

靜態(tài)線程池和動(dòng)態(tài)線程池代碼組織方式基本一致,不同之處在于動(dòng)態(tài)線程池多了線程池?cái)?shù)量的動(dòng)態(tài)調(diào)整過程。實(shí)際使用中的線程池通常與其他模塊深度結(jié)合,所以線程池的接口需要盡可能獨(dú)立。

4 測(cè)試對(duì)比

(1)測(cè)試環(huán)境。FT-2000 處理器(4 核,2.6 GHz),內(nèi)存1 X 8 G/DDR4/2666 MHz/noECC/1.2 v, 銀河麒麟4.0.2。

(2)測(cè)試設(shè)計(jì)線程池相比原來多線程的機(jī)制優(yōu)勢(shì)主要體現(xiàn)在:節(jié)省線程的創(chuàng)建和銷毀時(shí)間以及能夠快速地將線程進(jìn)行復(fù)用,但需考慮使用場(chǎng)景;任務(wù)并發(fā)量小,池內(nèi)的線程復(fù)用程度不高,能夠節(jié)省的少量線程的創(chuàng)建時(shí)間和銷毀時(shí)間,會(huì)被池內(nèi)線程的維護(hù)開銷所抵消;任務(wù)執(zhí)行時(shí)間很長(zhǎng),工作線程執(zhí)行任務(wù)的時(shí)間遠(yuǎn)遠(yuǎn)大于線程創(chuàng)建和調(diào)度的時(shí)間,那些短暫的時(shí)間不會(huì)帶來明顯的性能提升,因?yàn)榫€程池也需要進(jìn)行部分維護(hù)工作。結(jié)合線程池常見的使用環(huán)境,將測(cè)試內(nèi)容定向到密集但耗時(shí)少的短任務(wù)上。測(cè)試對(duì)象是線程池對(duì)任務(wù)的平均響應(yīng)時(shí)間,任務(wù)派發(fā)方式為以一定時(shí)間T 為間隔,隨機(jī)產(chǎn)生任務(wù)數(shù)N添加到任務(wù)隊(duì)列直至任務(wù)數(shù)達(dá)到設(shè)定任務(wù)數(shù)M,其中以0 ~1 ms 之間的任意值作為時(shí)間間隔T,以10~50 個(gè)之間的任意值作為增加任務(wù)數(shù)N。分別與系統(tǒng)多線程方式和靜態(tài)線程池方式進(jìn)行比較,使用50 個(gè)靜態(tài)線程與50 ~500 個(gè)動(dòng)態(tài)線程池進(jìn)行測(cè)試,測(cè)試結(jié)果如表1 所示。

表1 測(cè)試結(jié)果 ms

從上表的測(cè)試結(jié)果可以看出,當(dāng)任務(wù)數(shù)越少時(shí),處理任務(wù)的效率:多線程>靜態(tài)線程池>動(dòng)態(tài)線程池;當(dāng)任務(wù)數(shù)達(dá)到一定數(shù)量N時(shí),處理任務(wù)的效率:靜態(tài)線程池>動(dòng)態(tài)線程池>多線程;當(dāng)任務(wù)數(shù)量遠(yuǎn)遠(yuǎn)超過N時(shí),處理任務(wù)的效率:動(dòng)態(tài)線程池>靜態(tài)線程池>多線程。

5 結(jié)語

綜上所述,本文對(duì)多線程處理并發(fā)任務(wù)進(jìn)行了概述,并提出了多線程、靜態(tài)線程池和動(dòng)態(tài)線程池三種方案。針對(duì)動(dòng)態(tài)線程池進(jìn)行詳細(xì)設(shè)計(jì),提出了線程回收方法和線程池參數(shù)調(diào)整方法,通過對(duì)方案進(jìn)行代碼設(shè)計(jì)并進(jìn)行不同數(shù)量的模擬任務(wù)進(jìn)行測(cè)試。測(cè)試結(jié)果表明,在不同規(guī)模的任務(wù)量下,可以選擇不同的多線程方案,達(dá)到性能優(yōu)化的效果。目前絕大多數(shù)應(yīng)用都存在任務(wù)需求量大,潮汐不定等特性,因此動(dòng)態(tài)線程池在提高任務(wù)響應(yīng)時(shí)間,提升用戶體驗(yàn)等方面存在明顯優(yōu)勢(shì)。

猜你喜歡
任務(wù)量空閑線程
戰(zhàn)時(shí)裝備修理任務(wù)量計(jì)算研究?
恩賜
詩選刊(2023年7期)2023-07-21 07:03:38
基于模糊層次分析法的通信裝備維修任務(wù)量建模方法
軟件(2020年3期)2020-04-20 01:45:06
“鳥”字謎
小讀者之友(2019年9期)2019-09-10 07:22:44
彪悍的“寵”生,不需要解釋
員工績(jī)效考核管理制度研究
淺談linux多線程協(xié)作
WLAN和LTE交通規(guī)則
CHIP新電腦(2016年3期)2016-03-10 14:09:48
基于定性與定量分析的聯(lián)絡(luò)中心任務(wù)量預(yù)測(cè)法
Linux線程實(shí)現(xiàn)技術(shù)研究
昔阳县| 无棣县| 丰都县| 乌拉特中旗| 巴彦淖尔市| 新民市| 筠连县| 岢岚县| 开远市| 平顺县| 长岛县| 志丹县| 仁寿县| 喀什市| 徐汇区| 城口县| 盈江县| 元阳县| 江达县| 喀什市| 精河县| 宁蒗| 平乡县| 青铜峡市| 麦盖提县| 皮山县| 揭东县| 临海市| 通州区| 巴东县| 广宗县| 周至县| 怀安县| 万安县| 西乌| 肥城市| 沾益县| 镇原县| 武定县| 凤庆县| 宝兴县|