CCR源码分析-CCR架构
CCR,并發(fā)與協(xié)調(diào)運行時(Concurrency and Coordination Runtime)。從名字里我們就可以知道,這個東東是用來簡化并發(fā)程序設(shè)計的。為何要并發(fā)呢?因為我們有多個任務(wù)需要處理,如果能同時做就會充分利用硬 件而減少處理的時間。自然的,CCR也是以“任務(wù)”為核心進行設(shè)計的,CCR中的代碼也可以分為如下幾個功能:描述任務(wù)、生成任務(wù)、調(diào)度任務(wù)和執(zhí)行任務(wù)。
描述任務(wù)
對于計算機來說一個任務(wù)就是一段需要執(zhí)行的代碼,于是CCR有一個對任務(wù)的最抽象描述:ITask接口
任務(wù)被封裝在ITask實例中,當(dāng)CCR調(diào)度這個任務(wù)實例去執(zhí)行之后,CCR會調(diào)用ITask.Execute方法來執(zhí)行該任務(wù)。在ITask接口之下,派生出來各種各樣的Task
本節(jié)討論的是CCR的整體結(jié)構(gòu),后面我們會具體討論這些classes。
?
生成任務(wù)
對 于計算機來說,任務(wù)都是類似的:按給定的參數(shù)執(zhí)行一個給定的方法。但是對于程序員來說,往往并非這么簡單。從時序上來講,任務(wù)可以分為這么幾種情況:算法 和參數(shù)都已經(jīng)齊備的、已知算法等待參數(shù)的和已知參數(shù)等待算法的。對于第一種情況,直接使用Thread或者ThreadPool也可以很方便的解決問題, 當(dāng)然CCR也提供了相應(yīng)的支持。對于后面兩種情況,CCR使用了計算過程與參數(shù)分離描述的方法來解決。計算機的程序的作用就是處理流程相對固定的事務(wù),往 往計算邏輯是有限的而參數(shù)是變化無窮的。于是CCR將計算過程與參數(shù)分離開來,調(diào)用者不需要知道如何處理這些參數(shù),甚至不需要知道是誰何時來進行處理,它 只需要把要計算的數(shù)據(jù)發(fā)送到一個特定的地方即可,而這些數(shù)據(jù)會被可信賴的得以處理。當(dāng)計算過程接收到適當(dāng)?shù)膮?shù)的時候,也就生成了任務(wù)。CCR中Port 和PortSet類型就是這樣的參數(shù)存儲器。ReceiverTask及其子類則是封裝計算過程的類型,Port可以被注冊到相應(yīng)的 ReceiverTask中,當(dāng)有其他用戶向Port中投遞元素時,就會生成任務(wù)并放入相應(yīng)的DispatcherQueue中等待調(diào)度。
?
?
調(diào)度任務(wù)
需 要執(zhí)行的任務(wù)是有先來后到、輕重緩急的,同時計算機的CPU資源是有限度,每個核(包括超線程的邏輯核)在同一時間只能處理一個線程。這時候就需要進行一 定的調(diào)度。為了充分利用CPU,自然是要使用多線程來執(zhí)行任務(wù)。如果不使用CCR,我們也可以用.net內(nèi)置的Thread和ThreadPool都可以 用的并行任務(wù)調(diào)度,其中又?jǐn)?shù)ThreadPool用起來比較簡單,直接把要執(zhí)行的方法丟進去就好了。但是這簡單的背后也存在問題,雖然是解決了任務(wù)的先來 后到,但是沒辦法分輕重緩急了,ThreadPool堅持認(rèn)定CPU面前人人平等的原則,晚來的就是要侯著等先到底執(zhí)行完。直接用Thread也有問題, 就是無法很容易的控制線程的數(shù)量以及重用線程,而線程本身又是一個比較重型的資源,反反復(fù)復(fù)的創(chuàng)建和銷毀很影響效率。為了解決這些問題CCR提出了自己的 任務(wù)調(diào)度方案。DispatcherQueue。
DispatcherQueue 本質(zhì)上就是一個任務(wù)隊列,它使得任務(wù)按照先來后到的順序執(zhí)行。但是你可以創(chuàng)建多個DispatcherQueue,比如把高優(yōu)先級的任務(wù)放入一個隊列,把 普通優(yōu)先級的放入另外一個,那么高優(yōu)先級的任務(wù)不需要等待前面所有普通優(yōu)先級任務(wù)都執(zhí)行完畢才得到執(zhí)行。
執(zhí)行任務(wù)
Dispatcher是CCR的執(zhí)行單元,也是一個線程池的實現(xiàn)。既然是線程池,那么就必然有它所要管理的工作線程,TaskExecutionWorker類封裝了Dispatcher中工作線程所要執(zhí)行的方法以及一些必要的處理。
?
總結(jié)
以上是生活随笔為你收集整理的CCR源码分析-CCR架构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python脚本——Excel处理
- 下一篇: HTML 个人简历源码