NET0并行計算技術(shù)基礎(chǔ)_第1頁
NET0并行計算技術(shù)基礎(chǔ)_第2頁
NET0并行計算技術(shù)基礎(chǔ)_第3頁
NET0并行計算技術(shù)基礎(chǔ)_第4頁
NET0并行計算技術(shù)基礎(chǔ)_第5頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

8、,我們逐個介紹 其含義和用途:public Task(Action action);上述構(gòu)造函數(shù)創(chuàng)建一個Task對象,并且讓其關(guān)聯(lián)一個任務(wù)函數(shù)(由 action參數(shù) 引用),當(dāng)Task對象被線程執(zhí)行時,此函數(shù)被調(diào)用。publicTask(Action<object>action, object state);這一構(gòu)造函數(shù)的第2個參數(shù)用于向任務(wù)函數(shù)傳送附加信息,這些附加信息其實就 是任務(wù)函數(shù)調(diào)用時的實參。publicTask(Action action, TaskCreationOptions creationOptions);這一構(gòu)造函數(shù)多了一個 TaskCreationOptio

9、ns類型的參數(shù),此參數(shù)用于設(shè)置任務(wù)的 屬性標(biāo)記,上一小節(jié)說過,默認(rèn)情況下新建的任務(wù)會放在創(chuàng)建它的線程11的本地隊列中,如果希望將任務(wù)放入線程池的全局隊列中,可以向此構(gòu)造函數(shù)傳入“TaskCreationOptions.PreferFairness 值。11假設(shè)此線程是線程池中的線程publicTask(Action<object>action, object state,TaskCreationOptionscreationOptions);這一構(gòu)造函數(shù)是前3個構(gòu)造函數(shù)的“集大成者”,各參數(shù)的含義不再贅述。總結(jié)一下,每個任務(wù)一定關(guān)聯(lián)有一個任務(wù)函數(shù)。這是Task對象的本質(zhì)特征。創(chuàng)建好

10、以后,并不會自動運行,必須顯示調(diào)用它的 Start()方法。只有此方法被調(diào) 用之后,此任務(wù)才會被插入到線程(或線程池)所關(guān)聯(lián)的任務(wù)隊列中,并在任務(wù) 調(diào)度器的管理下得到執(zhí)行。Task t= new Task()=>,/任務(wù)函數(shù)代碼);,/任務(wù)對象創(chuàng)建完畢,但還未加入到任務(wù)隊列中t.Start(); /將任務(wù)追加到相應(yīng)的任務(wù)隊列中調(diào)度執(zhí)行。創(chuàng)建任務(wù)的第2種方法是使用TaskFactory類,顧名思義,此類是一個“任務(wù)創(chuàng) 建工廠”,它提供了 “一堆”的公有方法可用于創(chuàng)建任務(wù)對象。Task類有一個靜態(tài)屬性 Factory可用于引用一個 TaskFactory對象。 比如,上述創(chuàng)建并啟動一個任務(wù)的

11、代碼可以簡化為:Task t =Task.Factory.StartNew()=> ,/任務(wù)函數(shù)代碼);在深入了解Task類的基礎(chǔ)之上,TaskFactory類的使用就沒有任何奇特之處,請 讀者自行查詢MSDN了解TaskFactory類提供的另外一些方法的用法。2 了解任務(wù)的狀態(tài)“風(fēng)蕭蕭兮易水寒,壯士一去兮不復(fù)還”,與線程對象一樣,每一個Task對象都會經(jīng)歷一個生命周期,在這個生命周期的每個特定階段,對象處于一個特定的 狀態(tài),并且不可能由后一個狀態(tài)“回轉(zhuǎn)”到前一個狀態(tài)。簡單地說, Task對象的 生命是一條單行線,一旦上路,就只能往前走,直到生命的終結(jié),期間絕無走回 頭路的可能。Task. Can 1 -rtue*'i th等里列方法如圖19-17所示,Task對象擁有8個狀態(tài),這些狀態(tài)之間可以相互轉(zhuǎn)換。其中,Created 是起始狀態(tài),而 Canceled Faulted 和 RanToCompletion是 3 個終 止?fàn)顟B(tài),其余狀態(tài)都是中間狀態(tài)。通過對Task類特定的方法的調(diào)用,Task對象會自動進(jìn)行狀態(tài)的轉(zhuǎn)換。通常情況 下軟件工程師無需考慮這一轉(zhuǎn)換過程

溫馨提示

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

評論

0/150

提交評論