.NET4.0并行計(jì)算技術(shù)基礎(chǔ)(7)new_第1頁(yè)
.NET4.0并行計(jì)算技術(shù)基礎(chǔ)(7)new_第2頁(yè)
.NET4.0并行計(jì)算技術(shù)基礎(chǔ)(7)new_第3頁(yè)
.NET4.0并行計(jì)算技術(shù)基礎(chǔ)(7)new_第4頁(yè)
.NET4.0并行計(jì)算技術(shù)基礎(chǔ)(7)new_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.NET4.0并行計(jì)算技術(shù)基礎(chǔ)(7) 呵呵,越到國(guó)慶反而越忙,好多天沒更新了,工作第一天,貼出一篇新文。 金旭亮 2009.10.9=19.3.4任務(wù)并行庫(kù)原理初探在上一小節(jié)中,我們看到只需簡(jiǎn)單地調(diào)用Parallel類中的一些靜態(tài)方法,就可以讓代碼并行執(zhí)行。您一定會(huì)對(duì)任務(wù)并行庫(kù)的強(qiáng)大功能有了很深的印象,一些喜歡刨根問底的讀者可能會(huì)問:任務(wù)并行庫(kù)怎樣實(shí)現(xiàn)代碼的并行執(zhí)行?任務(wù)并行庫(kù)的底層技術(shù)細(xì)節(jié)很復(fù)雜,要介紹它超出了本書的范疇,然而,對(duì)其工作原理作一個(gè)介紹是可能的,了解這些知識(shí),對(duì)于開發(fā)并行程序而言是很有益的。1 并行指令的生成軟件工程師使用Paralllel類編寫的并行算法,經(jīng)過編譯器的處理,會(huì)

2、全部轉(zhuǎn)換為對(duì)Task類相應(yīng)方法和屬性的調(diào)用指令,這些指令被保存到編譯好的程序集中。Task類的實(shí)例代表一個(gè)可以被并行執(zhí)行的任務(wù),任務(wù)(而不是線程!)是TPL實(shí)現(xiàn)并行計(jì)算的基本單位。2任務(wù)并行庫(kù)的工作原理任務(wù)由線程負(fù)責(zé)執(zhí)行,為了獲取較高的性能,TPL使用線程池中的線程,并且使用了一個(gè)與線程池直接集成的“任務(wù)調(diào)度器(Task Scheduler)”來負(fù)責(zé)分派工作任務(wù)給線程,這個(gè)調(diào)度器使用的任務(wù)分派策略稱為“Work-stealing”。如圖1916所示,線程池中的每個(gè)線程都擁有一個(gè)專有的(本地的)任務(wù)隊(duì)列,當(dāng)線程創(chuàng)建任務(wù)(即Task類的實(shí)例)時(shí),默認(rèn)設(shè)置下,這些任務(wù)被放入了線程本地工作隊(duì)列中。如果

3、任務(wù)本身是通過調(diào)用ThreadPool.QueueUserWorkItem()添加的,則此任務(wù)會(huì)被添加到一個(gè)全局隊(duì)列(global queue)中,這一全局隊(duì)列就是圖1916中所示的“線程池任務(wù)隊(duì)列”。以下是任務(wù)調(diào)度器實(shí)現(xiàn)任務(wù)調(diào)度的基本過程:當(dāng)任務(wù)調(diào)度器開始分派任務(wù)時(shí),它先檢查一下創(chuàng)建此任務(wù)的線程是不是線程池中的線程(這種線程擁有一個(gè)本地的任務(wù)隊(duì)列),如果不是,此任務(wù)被加入到線程池全局任務(wù)隊(duì)列中,如果是,任務(wù)調(diào)度器檢查此任務(wù)是否設(shè)置了TaskCreationOptions.PreferFairness標(biāo)記,如果設(shè)置了,則此任務(wù)被加入到線程池全局任務(wù)隊(duì)列中,否則,還是被放入到線程的本地隊(duì)列中。當(dāng)

4、一個(gè)線程開始執(zhí)行時(shí),它優(yōu)先搜索自己的專有任務(wù)隊(duì)列,當(dāng)此隊(duì)列為空時(shí),它才會(huì)去搜索全局任務(wù)隊(duì)列。由此可見,這種調(diào)度策略實(shí)際上是其于優(yōu)先級(jí)的,本地工作隊(duì)列比全局隊(duì)列擁有更高的優(yōu)先級(jí)。上述這種默認(rèn)的調(diào)度策略適用于絕大多數(shù)情況,但不可能是所有的情況,如果需要對(duì)線程本地隊(duì)列和線程池全局隊(duì)列中的任務(wù)一視同仁,在不改變調(diào)度策略的情況下(這個(gè)策略是由.NET為線程池所提供的默認(rèn)調(diào)度器實(shí)現(xiàn)的,不可改),可以通過將需要“一視同仁”的Task任務(wù)直接放到線程池全局隊(duì)列而不是線程本地隊(duì)列中實(shí)現(xiàn),其具體的實(shí)現(xiàn)方法就是在創(chuàng)建任務(wù)時(shí),設(shè)置它的TaskCreationOptions.PreferFairness標(biāo)記。提示:如果

5、并行執(zhí)行是通過Parallel類的Invoke、For和ForEach方法啟動(dòng)的,則不能為其指定TaskCreationOptions.PreferFairness標(biāo)記,只有在顯式創(chuàng)建Task類的代碼中可以設(shè)置此標(biāo)記。下一小節(jié)將介紹如何直接使用Task類進(jìn)行基于“任務(wù)”的并行編程。下面對(duì)任務(wù)并行庫(kù)的工作原理作一個(gè)小結(jié)。簡(jiǎn)單地說:線程就是“工人”,它負(fù)責(zé)執(zhí)行“任務(wù)”,任務(wù)由任務(wù)調(diào)度器負(fù)責(zé)分配。任務(wù)調(diào)度器具有很強(qiáng)的智能性,它能自動(dòng)協(xié)調(diào)各個(gè)任務(wù)的分配,不讓“忙”的線程“忙死”,“閑”的線程“閑死”。從線程的角度看,由于有任務(wù)調(diào)度器的公平管理,所有線程都是“團(tuán)結(jié)互助”的“雷鋒”。將線程之間合作的工作從

6、線程自身的職責(zé)中“剝離”出來,交由任務(wù)調(diào)度器來統(tǒng)一協(xié)調(diào)管理,這是.NET 4.0并行計(jì)算任務(wù)庫(kù)設(shè)計(jì)的一個(gè)關(guān)鍵點(diǎn)。如果讓線程自身來負(fù)責(zé)處理工作任務(wù)的合理分配,必然會(huì)在線程函數(shù)內(nèi)增加同步的代碼,這會(huì)讓整個(gè)軟件系統(tǒng)變得復(fù)雜和難于調(diào)試。我們可以適當(dāng)?shù)貙PL的這種設(shè)計(jì)思想引申到社會(huì)生活領(lǐng)域:如果將線程比喻為“政府官員”,那么,任務(wù)調(diào)度器就可以看成是一種“制度”,正是在“制度”的制約之下,“官員”才可能廉潔公正。在現(xiàn)實(shí)社會(huì)中,指望貪官他們“良心”發(fā)現(xiàn)而自己“金盆洗手”是不現(xiàn)實(shí)的,必須建立起一種有效的制度,讓所有官員都置于強(qiáng)有力的監(jiān)督之下,“貪污”的行為自然會(huì)受到極大的制約。這是題外話了。在下一小節(jié)中,我

7、們將開始深入地了解Task類。19.3.5任務(wù)的創(chuàng)建與任務(wù)的狀態(tài)1創(chuàng)建任務(wù)在19.3.3節(jié)中,我們介紹了使用Parallel類的幾個(gè)靜態(tài)方法(如Invoke和For)進(jìn)行并行編程的基本方法,在19.3.4節(jié)中,我們又知道了實(shí)際上Parallel類的功能是通過Task類實(shí)現(xiàn)的,因此,如果我們需要對(duì)任務(wù)的執(zhí)行方式有更多的控制,可以直接基于Task對(duì)象編程而非使用Parallel類的靜態(tài)方法。進(jìn)行并行編程的第一步,是創(chuàng)建一個(gè)任務(wù)對(duì)象。最簡(jiǎn)單的方法就是直接使用new關(guān)鍵字創(chuàng)建Task對(duì)象。Task類的構(gòu)造函數(shù)有多個(gè)重載形式,我們逐個(gè)介紹其含義和用途: public Task(Action action

8、);上述構(gòu)造函數(shù)創(chuàng)建一個(gè)Task對(duì)象,并且讓其關(guān)聯(lián)一個(gè)任務(wù)函數(shù)(由action參數(shù)引用),當(dāng)Task對(duì)象被線程執(zhí)行時(shí),此函數(shù)被調(diào)用。publicTask(Actionaction, object state);這一構(gòu)造函數(shù)的第2個(gè)參數(shù)用于向任務(wù)函數(shù)傳送附加信息,這些附加信息其實(shí)就是任務(wù)函數(shù)調(diào)用時(shí)的實(shí)參。publicTask(Action action, TaskCreationOptions creationOptions);這一構(gòu)造函數(shù)多了一個(gè)TaskCreationOptions類型的參數(shù),此參數(shù)用于設(shè)置任務(wù)的屬性標(biāo)記,上一小節(jié)說過,默認(rèn)情況下新建的任務(wù)會(huì)放在創(chuàng)建它的線程1的本地隊(duì)列中,如

9、果希望將任務(wù)放入線程池的全局隊(duì)列中,可以向此構(gòu)造函數(shù)傳入“TaskCreationOptions.PreferFairness”值。1假設(shè)此線程是線程池中的線程publicTask(Actionaction, object state,TaskCreationOptionscreationOptions);這一構(gòu)造函數(shù)是前3個(gè)構(gòu)造函數(shù)的“集大成者”,各參數(shù)的含義不再贅述??偨Y(jié)一下,每個(gè)任務(wù)一定關(guān)聯(lián)有一個(gè)任務(wù)函數(shù)。這是Task對(duì)象的本質(zhì)特征。創(chuàng)建好以后,并不會(huì)自動(dòng)運(yùn)行,必須顯示調(diào)用它的Start()方法。只有此方法被調(diào)用之后,此任務(wù)才會(huì)被插入到線程(或線程池)所關(guān)聯(lián)的任務(wù)隊(duì)列中,并在任務(wù)調(diào)度器的

10、管理下得到執(zhí)行。Task t= new Task() =/任務(wù)函數(shù)代碼);/任務(wù)對(duì)象創(chuàng)建完畢,但還未加入到任務(wù)隊(duì)列中t.Start(); /將任務(wù)追加到相應(yīng)的任務(wù)隊(duì)列中調(diào)度執(zhí)行。創(chuàng)建任務(wù)的第2種方法是使用TaskFactory類,顧名思義,此類是一個(gè)“任務(wù)創(chuàng)建工廠”,它提供了“一堆”的公有方法可用于創(chuàng)建任務(wù)對(duì)象。Task類有一個(gè)靜態(tài)屬性Factory可用于引用一個(gè)TaskFactory對(duì)象。比如,上述創(chuàng)建并啟動(dòng)一個(gè)任務(wù)的代碼可以簡(jiǎn)化為:Task t =Task.Factory.StartNew() =/任務(wù)函數(shù)代碼);在深入了解Task類的基礎(chǔ)之上,TaskFactory類的使用就沒有任何奇特

11、之處,請(qǐng)讀者自行查詢MSDN了解TaskFactory類提供的另外一些方法的用法。2了解任務(wù)的狀態(tài)“風(fēng)蕭蕭兮易水寒,壯士一去兮不復(fù)還”,與線程對(duì)象一樣,每一個(gè)Task對(duì)象都會(huì)經(jīng)歷一個(gè)生命周期,在這個(gè)生命周期的每個(gè)特定階段,對(duì)象處于一個(gè)特定的狀態(tài),并且不可能由后一個(gè)狀態(tài)“回轉(zhuǎn)”到前一個(gè)狀態(tài)。簡(jiǎn)單地說,Task對(duì)象的生命是一條單行線,一旦上路,就只能往前走,直到生命的終結(jié),期間絕無(wú)走回頭路的可能。如圖1917所示,Task對(duì)象擁有8個(gè)狀態(tài),這些狀態(tài)之間可以相互轉(zhuǎn)換。其中,Created是起始狀態(tài),而Canceled、Faulted和RanToCompletion是3個(gè)終止?fàn)顟B(tài),其余狀態(tài)都是中間狀態(tài)。通過對(duì)Task類特定的方法的調(diào)用,Task對(duì)象會(huì)自動(dòng)進(jìn)行狀態(tài)的轉(zhuǎn)換。通常情況下軟件工程師無(wú)需考慮這一轉(zhuǎn)換過程,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論