• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            xiaoguozi's Blog
            Pay it forword - 我并不覺的自豪,我所嘗試的事情都失敗了······習慣原本生活的人不容易改變,就算現狀很糟,他們也很難改變,在過程中,他們還是放棄了······他們一放棄,大家就都是輸家······讓愛傳出去,很困難,也無法預料,人們需要更細心的觀察別人,要隨時注意才能保護別人,因為他們未必知道自己要什么·····

            以下為截止2009321日前發布在本人博客中的多核相關的文章匯總,這些文章大部分摘自于我寫的《多核計算與程序設計》一書?,F將這些文章分類匯總,方便大家閱讀。

            后續如果博客中繼續發布了多核相關的文章,那么本文章將會被更新。如果對多核編程技術非常感興趣的話,可以考慮將這篇文章加入您的瀏覽器收藏夾中,也歡迎您將這篇文章推薦給您的朋友。

            一、基礎篇

            1多核編程的幾個難題及其應對策略

            主要講解多核編程時的串行化方面的難題及其應對策略。閱讀全文

            2、多核編程中的鎖競爭難題

            鎖競爭會導致加速系數隨CPU核數增多而下降的現象。核數增加到128時,加速系數只有0.78,還不如在單核CPU上運行的速度。 S(p) = (t +1)/ (p + t/p) = p*(t+1) / (p*p+t) (鎖競爭下的加速系數公式) 。閱讀全文

            3多核編程中的負載平衡難題

            負載平衡的難度與CPU的核數成正比,CPU核數越多,負載劃分的難度就越大。 閱讀全文 

            二、OpenMP專題

            1、OpenMP并行程序設計(一)

            介紹OpenMP程序在并行計算時的效率,在雙核CPU上效率增加了整整一倍。 閱讀全

            2OpenMP并行程序設計(二)

            1、fork/join并行執行模式的概念 2OpenMP指令和庫函數介紹 3、parallel 指令的用法 4、for指令的使用方法 5 sectionssection指令的用法。閱讀全文

            3、OpenMP中的數據處理子句

            本文主要介紹了OpenMP中的private、firstprivatelastprivatethreadprivate、reduction、copyin、copyprivate等數據處理子句的用法。 閱讀全文

            4OpenMP中的任務調度

            本文主要介紹了OpenMP中任務調度子句schedule的使用方法。閱讀全文

            5OpenMP創建線程中的鎖及原子操作性能比較

            主要比較了原子操作,Windows CriticalSection, OpenMP庫帶的鎖在單任務運行情況下和多任務運行情況下的性能情況,在多核CPU上,多任務的鎖競爭花費的時間是單任務時的鎖運行花費時間的18倍。鎖競爭帶來的效率下降完全出乎意料之外,由此也可見多核編程和單核多任務編程是有很大區別的。 閱讀全文

            6OpenMP程序設計的兩個小技巧

            講述了如何動態設置線程數量以適應硬件和軟件的擴展性,如何將嵌套循環并行化的技巧。 閱讀全文

            三、性能篇

            1、雙核CPU上的快速排序效率

            在雙核CPU上運行后,打印出花費的時間為 234 ms , 單任務版的快速排序函數約需406ms左右,并行運行效率為:406/2×234 = 86.7% 左右。運行速度快了172ms。 閱讀全文

            2、多核系統中三種典型鎖競爭的加速比分析

            本文主要討論了固定式鎖競爭、隨機鎖競爭、分布式鎖競爭三種典型鎖競爭情況下的加速比,并分析了任務粒度因子和鎖粒度因子對加速比的影響。結論: 分布式鎖競爭加速比隨CPU核數成正比,可以達到和單核多任務時相當的性能,是多核編程的發展方向。 閱讀全文

            3、無鎖編程與分布式編程那個更適合多核CPU?

            本文重點比較了無鎖編程和分布式鎖競爭的性能,無鎖(原子操作)實際上是一種細粒度鎖。然后又從實現的功能,程序員掌握難易程度,現有軟件的移植等方面進行了比較,得出結論:無鎖編程遠不如分布式編程。分布式編程更適合多核CPU系統。 閱讀全文

            四、多核編程模式專題

            1、多核編程中的線程分組競爭模式

            討論了使用任務分組鎖競爭方式來消除鎖競爭導致的CPU饑餓現象,隊列池就是任務分組競爭的一個非常好的實踐任務分組競爭模式相對于無鎖編程具有更好的優勢。 閱讀全文

            2多核編程中的線程隨機競爭模式的概率分析

            本文主要分析了多個任務在隨機分布式鎖競爭的情況下,有不少于CPU核數個數的任務在運行的概率。然后將隨機競爭和無鎖編程的性能進行了理論上的比較。閱讀全文

            3多核編程中的條件同步模式

            本文講解了一種減少鎖使用的方法,將每次都加鎖改為滿足一定條件時才加鎖,非常適合具有狀態機性質的場合使用。 閱讀全文

            五、多核數據結構與算法專題

            1多核分布式隊列的實現:偷與自私的運用

            本文講述了多核系統中分布式隊列的實現方法,所謂分布式隊列指的是每個線程除了可以訪問線程池外還自動擁有一個本地隊列。實現分布式隊列的基本方法就是自私。 閱讀全文

            2、多核查找-順序查找也瘋狂

            用 數組進行查找,由于其插入和刪除需要按順序進行,需要移動較多的數據,對于大數據量的查找是無法使用的。然而,在多核時代,一切都改變了,大數據量的查找 結構也可以用數組來實現。并且用數組實現的大數據量查找結構有著比其他查找結構更明顯的優勢:效率高、內存占用少、并且容易避免偽共享問題。 閱讀全文

            3多核中的并行前綴和計算

            前綴和計算在并行計算中很有用,因為在處理負載平衡問題時,經常需要將若干段數據重新平分,而計算前綴和通常是一種有效的將數據平分的方法。 閱讀全文

            六、多核編程思想專題

            1、多核新觀念-象使用內存一樣使用CPU?

            象使用內存一樣使用CPU? 閱讀全文

            2老子”是偉大的多核計算科學家

            本文主要論述道家的小國寡民無為”“大道自然等思想與多核計算中使用的思想的異曲同工之處,給出了道家思想在多核計算中的實踐實例分析。大道自然,貪心,自私,偷竊這些大自然賦給人類的自然力量,在多核計算中得到了廣泛的使用。 閱讀全文

            3、多核編程的四層境界

            從先天方法策略、目標需求評價、本質根源保障、算法實現執行四個層面闡述多核計算的含義    閱讀全文

            4、高房價與多核分布式計算

            本文主要從多核計算的角度來論述高房價問題及其對社會的影響,并給出了高房價問題的最終解決措施。 閱讀全文

            5、道家·老子的算法思想分析

            將 道家老子的思想與軟件中的思想進行對比分析,得出結論,道家追求穩定可靠性。所以歷代在撥亂反正時期,用的都是道家思想。歷史上最典型的三個朝代漢、唐、 明為例,漢朝時張良等人都是好黃老之術(也就是道家思想),唐朝的宰相魏征也是道家人物,明朝的劉伯溫也是屬于道家人物。 閱讀全文

            6、屈原·漁父的算法追求

            屈原與漁父兩種不同的思想,相當于軟件中的兩種不同算法思想。世人皆濁,眾人皆醉可以理解為軟件運行的場景。  閱讀全文

             

            更多的多核相關的資源,可以訪問:

            1Intel軟件社區多核論壇:http://forum.csdn.net/Intel/IntelMulti-core/

            2Intel的博客:http://softwareblogs-zho.intel.com/

            關于多核相關的書籍介紹可以參考下面這篇文章:

            多核編程高處并不”,文章地址: http://news.csdn.net/n/20081107/120632.html

            這篇文章里有我對現在市面上有關多核編程和并行計算書籍的一個點評。可以給大家購買書籍作為一個參考。

            多核相關的開源項目介紹:

            1、Intel 開源項目TBB庫,鏈接:http://www.threadingbuildingblocks.org/

            這是一個專門針對多核的開源項目,包含一些常見的多核數據結構與算法,如分段鎖的哈希表、分布式內存管理、動態任務調度器等,其中最重要的一個是動態任務調度器,可以使用動態任務調度器將串行算法自動變成并行算法,免去程序員學習并行算法之苦。

            TBB開源項目的使用方法詳見O’Reilly出版的James Reinders的《Intel Threading Building Blocks》一書,如果要了解它的實現原理和方法,可以參考我寫的《多核計算與程序設計》一書。

            2Capi開源項目,鏈接:http://gforge.osdn.net.cn/projects/capi 

            這個項目是我開發的一個針對多核的數據結構與算法庫,提供了許多實用的適應多核系統的數據結構與算法,主要的功能有以下一些:

            1)各種并行算法,如并行歸并排序、并行基數排序等并行排序算法;并行順序搜索及終止檢測算法、并行Dijikstra最短路徑算法等并行搜索算法;并行前綴和、并行矩陣乘法等并行數值算法;等等。

            2)分布式查找算法,如分段鎖的哈希表、動態分布式哈希數組、動態哈希AVL樹等。

            3)搶奪式內存管理算法,即使在分配和釋放共享內存時,也幾乎不需要使用鎖。

            4)基于偷取和自私的分布式隊列,用分布式隊列實現的兩種動態任務調度器、以及用動態嵌套任務調度器實現的Parallel_For()功能,用Parallel_For()實現的并行快速排序算法、并行歸并算法等。

            5)任務圖調度器,可以用來實現對有依賴關系的執行塊的并行計算。

            這個開源項目和TBB相比起來各有特色,TBB庫的優勢在于它是商業化的開源項目,代碼經過優化和相對完善的測試。CAPI的代碼專門為學習而設計,代碼沒有經過優化,代碼簡單易懂,易于學習,并且實現了比TBB庫更多的數據結構與算法容器,有一些創新的數據結構與算法在里面。其缺點是,現在發布的版本為0.2版本,如果進行商業使用需要自行增加測試用例進行更完善的測試和優化。

            CAPI開源項目的實現原理和使用方法詳見我寫的《多核計算與程序設計》一書。

            posted @ 2011-03-20 14:46 小果子 閱讀(588) | 評論 (0)編輯 收藏

            進入多核時代后,必須使用多線程編寫程序才能讓各個CPU核得到利用。在單核時代,通常使用操作系統提供的API來創建線程,然而,在多核系統中,情況發生了很大的變化, 如果仍然使用操作系統API來創建線程會遇到一些問題。具體來說,有以下三個問題:

            1)CPU核數擴展性問題

            多 核編程需要考慮程序性能隨CPU核數的擴展性,即硬件升級到更多核后,能夠不修改程序就讓程序性能增長,這要求程序中創建的線程數量需要隨CPU核數變 化,不能創建固定數量的線程,否則在CPU核數超過線程數量上的機器上運行,將無法完全利用機器性能。雖然通過一定方法可以使用操作系統API創建可變化 數量的線程,但是比較麻煩,不如OpenMP方便。

            2)方便性問題

            在 多核編程時,要求計算均攤到各個CPU核上去,所有的程序都需要并行化執行,對計算的負載均衡有很高要求。這就要求在同一個函數內或同一個循環中,可能也 需要將計算分攤到各個CPU核上,需要創建多個線程。操作系統API創建線程時,需要線程入口函數,很難滿足這個需求,除非將一個函數內的代碼手工拆成多 個線程入口函數,這將大大增加程序員的工作量。使用OpenMP創建線程則不需要入口函數,非常方便,可以將同一函數內的代碼分解成多個線程執行,也可以 將一個for循環分解成多個線程執行。

            3)可移植性問題

            目前各個主流操作系統的線程API互不兼容,缺乏事實上的統一規范,要滿足可移植性得自己寫一些代碼,將各種不同操作系統的api封裝成一套統一的接口。OpenMP是標準規范,所有支持它的編譯器都是執行同一套標準,不存在可移植性問題。

            綜上所述,在多核編程中,使用OpenMP就很有必要,下面列出以前發表在我的CSDN博客中的OpenMP文章,供大家參考。

            1OpenMP并行程序設計(一)

            介紹OpenMP程序在并行計算時的效率,在雙核CPU上效率增加了整整一倍。 閱讀全文

            2、OpenMP并行程序設計(二)

            1、fork/join并行執行模式的概念 2、OpenMP指令和庫函數介紹 3、parallel 指令的用法 4、for指令的使用方法 5 sections和section指令的用法。閱讀全文

            3、OpenMP中的數據處理子句

            本文主要介紹了OpenMP中的private、firstprivate、lastprivate、threadprivate、reduction、copyin、copyprivate等數據處理子句的用法。 閱讀全文

            4OpenMP中的任務調度

            本文主要介紹了OpenMP中任務調度子句schedule的使用方法。閱讀全文

            5OpenMP創建線程中的鎖及原子操作性能比較

            主 要比較了原子操作,Windows CriticalSection, OpenMP庫帶的鎖在單任務運行情況下和多任務運行情況下的性能情況,在多核CPU上,多任務的鎖競爭花費的時間是單任務時的鎖運行花費時間的18倍。 鎖競爭帶來的效率下降完全出乎意料之外,由此也可見多核編程和單核多線程編程是有很大區別的。 閱讀全文

            6、OpenMP程序設計的兩個小技巧

            講述了如何動態設置線程數量以適應硬件和軟件的擴展性,如何將嵌套循環并行化的技巧。 閱讀全文

            上面列出的這些OpenMP知識,屬于初步的入門知識,如果需要進一步深入掌握OpenMP或者了解其實現原理,則需要看更多的參考文獻。下面列出我寫的《多核計算與程序設計》一書的第3章OpenMP程序設計中的參考文獻,供需要深入掌握的人參考。其中的文獻【2】講解了OpenMP的實現原理。

            【1】 Ananth Grama, Anshul Gupta,“并行計算導論”,張武等譯,機械工業出版社,2005.01

            【2】 Barbara Chapman, “How OpenMP is Compiled ”,http://cobweb.ecn.purdue.edu/ParaMount/iwomp2008/documents/chapman-underthehood

            【3】 Bruce McMillin等,“Parallel Algorithm Fundamentals and Analysis”,http://citeseer.ist.psu.edu/mcmillin93parallel.html

            【4】 Common Language Infrastructure (CLI) Partitions I to VI http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-335.pdf

            【5】 Introduction to OpenMP,A Directive-based API for Parallel Processing on Shared-memory Computers,http://scv.bu.edu/documentation/tutorials/OpenMP/

            【6】 Michael J. Quinn, “MPI與OpenMP并行程序設計”,陳文光等譯,清華大學出版社,2004.10

            【7】 Mitsuhisa Sato, Shigehisa Satoh, Kazuhiro Kusano and Yoshio Tanaka, “Design of OpenMP Compiler for an SMP Cluster”,

            http://www.hpcs.is.tsukuba.ac.jp/~msato/pdplab/papers/ewomp99.pdf

            【8】 MSDN幫助材料

            ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vclang/html/652414c5-78ed-4b7f-8283-1a9fe4c5e78d.htm

            【9】 Omni OpenMP compiler, http://phase.hpcc.jp/omni/home.html.

            【10】 OpenMP2.0規范 http://www.openmp.org/

            【11】 OpenMP2.5規范 http://www.openmp.org/

            【12】 OpenMP: Simple, portable, scalable SMP Programming, http://www.OpenMP.org.

            【13】 Rudolf Eigenmann and Timothy G. mattson. “OpenMP tutorial, part 2: Advanced OpenMP.”, http://www.cise.ufl.edu/research/ParallelPatterns/sc01-omp-tut-advanced.ppt.

            【14】 Ruud van der Pas ,“An Introduction Into OpenMP”,http://www.nic.uoregon.edu/iwomp2005/iwomp2005_tutorial_openmp_rvdp.pdf

            【15】 Sanjiv Shah, Grant Haab, Paul Petersen, & Joe Throop,“Flexible Control Structures for Parallelism in OpenMP”,http://www.it.lth.se/ewomp99/papers/grant.pdf

            【16】 Shameem Akhter等,“多核程序設計技術-通過軟件多線程提升性能”,電子工業出版社,2007.03

            【17】 Special issue on OpenMP and its applications. Scientific Programming, 11(2),2003.

            【18】 Y. Charlie Hu, Honghui Lu, Alan L. Cox, and Willy Zwaenepoel. “OpenMP for networks of SMPs”,In Proceedings of 13th International Parallel Processing Symposium and 10th Symposium on Parallel and Distributed Processing, page 302-310. IEEE Computer Society, 1999.

            多核編程相關文章:

            1)用原子操作解決多線程退出問題

            2)原子操作在多核編程中的使用

            3)多核編程偽共享問題及其對策

            4)多核編程鎖競爭問題及其對策

            5)多核分布式隊列的實現:“偷”與“自私”的運用

            6)多核編程中的條件同步模式

            7)多核編程的四層境界

            8)“老子”是偉大的多核計算科學家

            9)程序員的十層樓(1~3層)

            10)多核編程文章匯總

            11)并行順序搜索及終止檢測

            posted @ 2011-03-20 14:44 小果子 閱讀(653) | 評論 (0)編輯 收藏

            1.  安裝VS2010,WDK7.60(GRMWDK_EN_7600_1)

            2.  新建VC 控制臺項目(選擇為空項目)

            1_thumb1

            3.  新建項目配置“driver” ,點擊下拉按鈕-點擊(配置管理器)

            6_thumb5

            輸入名稱(driver)點擊確定就可以了,其他的不要動哦!

            3_thumb3

            完成后的效果!

            2_thumb3

            點擊確定按鈕之后呈現出來的畫面

            4_thumb6

            鼠標右擊新建的driver屬性,會彈出以下窗口!

            5_thumb1
            4.  設置VC++路徑

            <我把wdk安裝在E盤下>
            a.  配置可執行文件目錄:E:\WinDDK\7600.16385.1\bin\x86;
            b.  配置包含目錄:E:\WinDDK\7600.16385.1\inc\ddk 
                                    E:\WinDDK\7600.16385.1\inc\crt
                                    E:\WinDDK\7600.16385.1\inc\api  
            c.  配置庫目錄:    E:\WinDDK\7600.16385.1\lib\win7\i3865

             

            新建C/C++文件 不然無C/C++設置選項

            <剛開始我們創建了一個空的項目所以項目里沒有c++文件,現在要做的就是在空的項目-源文件-添加一個新建項c++文件>

            常規 
            目標文件擴展名:.sys          //必選


            6.  設置C/C++選項
            常規選項卡
            1 調試信息格式(C7 兼容(/Z7)        //可選
            2 警告等級     (2 級(/W2)          //可選
            3 將警告視為錯誤  (是(/wx)         //可選
             
            優化選項卡
            優化(禁用/Od)                          //可選
             
            預處理器
            預處理器定義:WIN32=100;_X86_=1;WINVER=0x501;DBG=1         //必選
             
            代碼生成
                   啟用最小重新生成:否                                        //可選    

                   基本運行時檢查:默認值                                     //可選
                   運行時庫:多線程調試(/MTd)  或  多線程(/MT)                 //建議選 <本人選擇的是多線程調試(/MTd)>
                   緩沖區安全檢查:否                                            //可選
              (可避免出現  LINK : error LNK2001:  無法解析外部符號  __security_cookie)
            高級
                 調用約定  __stdcall(/Gz)                                       //必選
             
            7.  鏈接器設置
            常規
                 啟用增量鏈接:否(/INCREMENTAL:NO)                           //建議 選上
                 忽略導入庫:是                                                  // 可選 
                 ( 設置為此值時,必須在附加庫目錄中加: E:\WinDDK\7600.16385.1\lib\win7\i3865  這樣項目就不會依賴 IDE 環境的設 置) 

                 如果否  (  設置為此值時,將依賴  IDE  的環境的相關設置  )
             
            輸入
            附加依賴項
            ntoskrnl.lib;Hal.lib;wdm.lib;wdmsec.lib;wmilib.lib;ndis.lib;MSVCRT.LIB;LIBCMT.LIB       //必選   

            //NT式驅動  ntoskrnl.lib    WDM式驅動    wdm.lib
            ( HalXXX 函數在Hal.lib, WmiXXX 函數在  wmilib.lib  , NdisXXX函數在  ndis.lib )
            (  必要時需要增加微軟的標準庫  MSVCRT.LIB MSVCRTD.LIB(調試庫) LIBCMT.LIBIBCMTD.LIB(調試庫) )
              (  如果源碼中有  source  文件,那么該文件的  TARGETLIBS  字段會列出該項 目需要的庫  )

            忽略所有默認庫:    是 (/NODEFAULTLIB)                 //必選  

            清單文件
              啟用用戶賬戶控制(UAC)   否  //必選 

            不然會出現  >LINK : fatal error LNK1295: “/MANIFESTUAC”與“/DRIVER”規范不兼容;鏈接時不使用“/MANIFESTUAC”  
             
                 調試
            生成調試信息  是(/DEBUG)                                              //可選
            生成映像文件:是(/MAP)                                               //可選
            映像文件名:$(TargetDir)$(TargetName).map                     //可選
             
                系統(System)
                 子系統:  控制臺(/SUBSYSTEM:CONSOLE)                                //必選
                 堆棧保留大小:4194304                                              //可選
                 堆棧提交大小:  4096                                                //可選
                 驅動程序:    驅動程序(/DRIVER)                                        //必選  
                  高級:
                入口點:DriverEntry                                                    //必選
                隨機基址:清空           //把框里的數據刪掉。(yes也不是no也不是就是要一個干干凈凈的文本框)   //必選
                不然會出現  e:\xxx.sys : fatal error LNK1295:
            “/DYNAMICBASE”與“/DRIVER”規范不兼容;鏈接時不使用“/DYNAMICBASE”


                數據執行保護(DEP):  清空 //把框里的數據刪掉。(yes也不是no也不是就是要一個干干凈凈的文本框) //必選  
                 不然會出現  e:\xxx.sys : fatal error LNK1295:       
            “/NXCOMPAT:NO”與“/DRIVER”規范不兼容;鏈接時不使用“/NXCOMPAT:NO”   

             

            設置效應和:是(/RELEASE)                              //可選

            基址:0x10000                                           //建議選上 
               
             命令行:/SECTION:INIT,D /IGNORE:4078        (建議不要寫進去,會報錯?。?/span>                    

            最后給出一個超級簡單的代碼來測試一下我們配置的是否成功??

            #include "ntddk.h"

            NTSTATUS
            DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
            {
            return STATUS_UNSUCCESSFUL;
            }

             

            如果沒有報錯那么恭喜你配置成功了!

            posted @ 2011-03-19 16:48 小果子 閱讀(26730) | 評論 (20)編輯 收藏

            引言

            服務(Service)的本質就是提供 服務消費者期望的某種功能,服務的價值體現在兩個方面:服務本身的質量和寄宿服務的平臺應付消費者的數量,并發(Concurrency)的關注的是第二 個要素。WCF服務寄宿于資源有限的環境中,要實現服務效用的最大化,需要考慮如何利用現有的資源實現最大的吞吐量(Throughput)。提高吞吐量 就某個寄宿的服務實例(Service Instance)來說,一個重要的途徑就是讓它能夠同時處理來自各個客戶端(服務代理)的并發訪問。WCF實現了一套完整的并發控制體系,為你提供了不 同的并發模式。

            我經常說軟件架構是一門權衡的藝術,需要綜合考慮各種相互矛盾的因素,找到一種最優的組合方式。提高單個服務實例允許的 并發訪問量能夠提高整體吞吐量,這樣的理論依賴于一種假設,那就是服務端所能使用的資源是無限。我們知道,這種假設無論在什么情況下都不會成立。如果我們 并發量超出了服務端所能承受的臨界點,整個服務端將會崩潰。所以,WCF一方面需要允許讓單個服務實例并發處理接收到的多個請求,同時也需要設置一道閘門 控制并發的數量。WCF的流量限制(Throttling)體系為你創建了這道閘門。

            從本篇文章開始,我將發布一系列的文章對WCF并發架構體系進行深入剖析 ,先來看看并發的基本介紹。

            一、同一個服務實例上下文同時處理多個服務調用請求

            并 發的含義就是多個并行的操作同時作用于一個相同的資源或者對象,或者說同一個資源或者對象同時應付多個并行的請求。對于WCF的并發來說,這里將的“資源 或者對象”指的就是承載服務操作最終執行的服務實例(Service Instance)。而WCF將服務實例封裝在一個稱為實例上下文(InstanceContext)對象中,所以WCF中的并發指的是同一個服務實例上下文同時處理多個服務調用請求。

            WCF服務端框架一個主要的任務是將接收到的服務調用請求分發給激活的服務實例,調用相應的服務操作并返回執行結果。也就是說,服務操作的執行最終還是會落實到某個具體的服務實例上。《WCF技術剖析(卷1)》 的第9章對WCF的實例化機制進行了深入的剖析,從中我們知道在WCF服務端框架體系中,激活的服務實例并不是單獨存在的,而是被封裝在一個被稱為實例上 下文(InstanceContext)對象中。WCF提供了三種不同的實例上下模式(Per-Call、Per-Session和Single)實現了 不同的服務實例上下文提供機制。

            所以,WCF并發框架體系解決的是如何有效地處理被分發到同一個服務實例上下文的多個服務調用請求,這些并行的調用請求可能來自不同的客戶端(服務代理),也可能相同的客戶端。WCF并發的本質上可以通過圖1體現。

            clip_image002

            圖1 通過一個InstanceContext對多個并發請求的處理

            由于WCF的并發處理屬于服務本身自身的行為,所以我們通過服務行為(Service Behavior)的形式對采取的并發策略進行控制,而不同的并發策略定義在相應的并發模式(Concurrency Mode)下面。

            二、通過ServiceBehaviorAttribute特性定義并發模式

            WCF為三種典型的并發處理策略定義了三種典型的并發模式,即Single、Reentrant和Multiple。這三種并發模式通過ConcurrencyMode的三個同名的枚舉項表示,ConcurrencyMode定義如下:

               1: public enum ConcurrencyMode
               2: {
               3:     Single,
               4:     Reentrant,
               5:     Multiple
               6: }

            通過ConcurrencyMode枚舉項表示的三種不同的并發模式體現了WCF處理并發請求的三種不同能策略:

            • Single一個封裝了服務實例的InstanceContext對象在某個時刻只能用于對某一個單一請求的處理,或者說針對某個InstanceContext對象的多個并發的請求會以一種串行的方式進行處理。具體來講,當WCF服務端框架接收到多個針對相同InstanceContext的請求時,會先確定該InstanceContext是 否可用(是否正在處理之前的服務調用請求),如何可用,則將接收到的第一個請求分發給它,其它請求則被放入根據抵達的先后順序被放入到一個隊列中。如果之 前的請求被正常處理,隊列中的第一個請求被分發給InsanceContext。如果一個請求在隊列中等待的時間過長,超過了設置好的服務調用的超時實 現,客戶端會跑出TimeoutException異常;
            • Reentrant該模式和Single一樣,InstanceContext對象在某個時刻只能用于對某一個單一請求的處理。不過有一點不同的是,如果服務操作在執行過程中涉及對外調用(Call Out),該InstanceContext可以用于其它服務調用請求的處理;
            • Multiple在該模式下,一個InstanceContext可以同時用于處理多個服務請求,所以Multiple并發模式下針對同一個InstanceContext的多個并發請求能夠得到及時的處理。不過,由于是并行的處理方式,服務操作執行過程中狀態的管理以及多線程的安全問題需要服務開發者自行處理。

            并發模式的采用是服務單邊的選擇,是服務端個人的行為,所以并發模式以服務行為的方式定義,我們只需要在服務類型上應用 ServiceBehaviorAttribute特性,為ConcurrencyMode屬性設置相應的值即 可,ServiceBehaviorAttribute定義如下:

               1: [AttributeUsage(AttributeTargets.Class)]
               2: public sealed class ServiceBehaviorAttribute : Attribute, IServiceBehavior
               3: {
               4:     //其它成員
               5:     public ConcurrencyMode ConcurrencyMode { get; set; }
               6: }

            如果顯示指定服務采用的并發模式,默認使用的是ConcurrencyMode.Single,所以下面兩種服務定義方式是等效的。

               1: public class CalculatorService : ICalculator
               2: {
               3:     //省略成員
               4: }
               5:  
               6: [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]
               7: public class CalculatorService : ICalculator
               8: {
               9:     //省略成員
              10: }

            三、回調(Callback)中的并發

            WCF并發解決的是同一個InstanceContext對象在處理并發請求是采用怎樣的處理策略。我們知道InstanceContext不僅僅是封裝真正服務實例的容器,當我們通過雙向通信的機制從服務端回調客戶端操作時,真正執行回調操作的回調對象也是封裝在InstanceContext中。

            在雙向通信的場景中,如果多個服務端或者同一個客戶端的多個并發的服務調用操作所指定的回調實例上下文(即封裝回調操作的InstanceContext對象),就可能出現針對同一個InstanceContext的并發回調的現象。WCF采用與正常服務調用相同的機制來處理并發回調,實際上WCF采用幾乎一樣的機制來實現正常的服務調用和回調。

            與通過將ServiceBehaviorAttribute特性應用到服務類型并指定采用的并發模式相類似,回調采用的并發模式通過應用在回調類型上的CallbackBehaviorAttribute特性來指定。CallbackBehaviorAttribute中同樣定義了ConcurrencyMode屬性:

               1: [AttributeUsage(AttributeTargets.Class)]
               2: public sealed class CallbackBehaviorAttribute : Attribute, IServiceBehavior
               3: {
               4:     //其它成員
               5:     public ConcurrencyMode ConcurrencyMode { get; set; }
               6: }

            下面的代用中,我們通過在回調類型CalculatorCallbackService上應用CallbackBehaviorAttribute特性,將回調并發模式設置成ConcurrencyMode.Multiple。

               1: [CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
               2: public class CalculatorCallbackService:ICalculatorCallback
               3: {
               4:     //省略成員
               5: }

            四、 事務行為與并發

            相信你還會記得在上面一章介紹事務編程(《上篇》、《中篇》、《下篇》)的時候,可以在服務類型上面應用ServiceBehaviorAttribute特性將ReleaseServiceInstanceOnTransactionComplete屬性設成True,這樣可以讓WCF在事務結束之后將封裝了服務實例的InstanceContext對象釋放掉。不過這樣的設置之后再并發模式為ConcurrencyMode.Single的前提下方才有效,否則在進行服務寄宿的時候將會拋出異常。

            比如說,我們定了如下一個BankingService服務類型,通過ServiceBehaviorAttribute特性指定 ReleaseServiceInstanceOnTransactionComplete為True,并采用 ConcurrencyMode.Multiple并發模式。

               1: [ServiceBehavior(ReleaseServiceInstanceOnTransactionComplete = true,ConcurrencyMode = ConcurrencyMode.Multiple)]
               2: public class BankingService : IBankingService
               3: {
               4:     [OperationBehavior(TransactionScopeRequired = true)]
               5:     public void Transfer(string accountFrom, string accountTo, decimal amount)
               6:     {
               7:        //省略實現
               8:     }
               9: }

            當我們試圖寄宿該BankingService服務的時候,如圖2所示的 InvalidOperationException異常會被拋出,并提示對于已經將 ReleaseServiceInstanceOnTransactionComplete設置成True的服務來說,必須將并發模式設成 ConcurrencyMode.Multiple。

            clip_image004

            圖2 在Multiple+ReleaseServiceInstanceOnTransactionComplete導致的異常 

            WCF提供的三種不同的并發模式,使開發者可以根據具體的情況選擇不同的并發處理的策略。對于這三種并發模式,Multiple采用的并行的執行方 式,而Single和Reentrant則是采用串行的執行方式。串行執行即同步執行,在WCF并發框架體系中,這樣的同步機制是如何實現的呢?請關注下篇文章。

            posted @ 2010-12-26 11:24 小果子 閱讀(1299) | 評論 (0)編輯 收藏
                 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->#include "windows.h"#include <iostream>using namespace std;#define NTSI...  閱讀全文
            posted @ 2010-10-12 17:22 小果子 閱讀(711) | 評論 (0)編輯 收藏
            僅列出標題
            共58頁: First 25 26 27 28 29 30 31 32 33 Last 
            精品国产青草久久久久福利| 久久亚洲精品视频| 99国内精品久久久久久久 | 久久精品人妻一区二区三区| 精品久久久久久国产潘金莲 | 久久不射电影网| 波多野结衣中文字幕久久| 无码人妻精品一区二区三区久久| 久久精品国产亚洲7777| 久久国产精品偷99| 久久久久国产精品嫩草影院| 老司机午夜网站国内精品久久久久久久久| 久久精品国产免费| 国产精品免费久久| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 亚洲国产精品无码久久一区二区| 尹人香蕉久久99天天拍| 国产毛片欧美毛片久久久| 久久丫精品国产亚洲av| 91精品婷婷国产综合久久| 久久人人爽人爽人人爽av| 欧美精品九九99久久在观看| 久久人与动人物a级毛片| 久久久久亚洲AV无码专区体验| 久久久久无码精品国产不卡| 久久国产精品-久久精品| 久久性精品| 久久久精品人妻一区二区三区四| 亚洲国产精品一区二区久久| 免费精品久久久久久中文字幕| 中文字幕无码av激情不卡久久| 日韩乱码人妻无码中文字幕久久 | 国产一区二区久久久| 久久精品九九亚洲精品| 精品国产婷婷久久久| 久久九九兔免费精品6| 久久精品中文字幕久久| 欧美日韩精品久久久免费观看| 精品少妇人妻av无码久久| 久久久久无码中| 久久精品九九亚洲精品天堂|