intel公司內(nèi)部教材多核多線程技術(shù)_第1頁
intel公司內(nèi)部教材多核多線程技術(shù)_第2頁
intel公司內(nèi)部教材多核多線程技術(shù)_第3頁
intel公司內(nèi)部教材多核多線程技術(shù)_第4頁
intel公司內(nèi)部教材多核多線程技術(shù)_第5頁
已閱讀5頁,還剩353頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

多核程序設(shè)計(jì)

參考資料:1.多核系列教材編寫組.多核程序設(shè)計(jì).清華大學(xué)出版社,2007.92.DavidB.Kirk,Wen-meiW.Hwu著.陳曙暉,熊淑華譯.大規(guī)模并行處理器編程實(shí)踐.清華大學(xué)出版社,2010.93.MauriceHerlihy,NirShavit著.金海,胡侃譯.多處理器編程的藝術(shù).機(jī)械工業(yè)出版社,2009.84.RichardGerber,AartJ.C.Bik,KevinB.Smith等著,王濤,單久龍,孫廣中譯.軟件優(yōu)化技術(shù)——IA-32平臺(tái)的高性能手冊(第2版)

.電子工業(yè)出版社,2007.4intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第1頁!多核程序設(shè)計(jì)

電子書及

el./zh-cn/articles/32067intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第2頁!多核程序設(shè)計(jì)

章多核技術(shù)導(dǎo)論intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第3頁!微處理器發(fā)展史1945年,世界上臺(tái)全自動(dòng)電子數(shù)字計(jì)算機(jī)ENIAC計(jì)算機(jī)的發(fā)展按照硬件工藝可以分為代(1946~1958):電子管數(shù)字計(jì)算機(jī)。第二代(1958~1964):晶體管數(shù)字計(jì)算機(jī)。第三代(1964~1971):集成電路數(shù)字計(jì)算機(jī)。第四代(1971年以后):大規(guī)模集成電路數(shù)字計(jì)算機(jī)。微處理器代微處理器(4位):英特爾4004,8008第二代微處理器(8位):采用NMOS工藝,采用匯編語言、BASIC、Fortran編程,使用單用戶操作系統(tǒng)。如英特爾8080,8085。第三代微處理器(16位):以1978年英特爾的8086出現(xiàn)為起點(diǎn)。第四代微處理器(32位):運(yùn)算模式包括實(shí)模式、保護(hù)模式和“虛擬86”。英特爾80386DX,80486,Pentium4…intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第4頁!并行計(jì)算機(jī)的弗林分類Flynn根據(jù)指令流和數(shù)據(jù)流的不同組織方式,把計(jì)算機(jī)系統(tǒng)的結(jié)構(gòu)分為以下四類:單指令流單數(shù)據(jù)流(SingleInstructionstreamSingleDatastream,SISD)單指令流多數(shù)據(jù)流(SingleInstructionstreamMultipleDatastream,SIMD)多指令流單數(shù)據(jù)流(MultipleInstructionstreamSingleDatastream,MISD)多指令流多數(shù)據(jù)流(MultipleInstructionstreamMultipleDatastream,MISD)intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第5頁!并行計(jì)算機(jī)從系統(tǒng)結(jié)構(gòu)角度分類分布式存儲(chǔ)器的SIMD處理機(jī)含有多個(gè)同樣結(jié)構(gòu)的處理單元(PE),通過尋徑網(wǎng)絡(luò)以一定方式互相連接。每個(gè)PE有各自的本地存儲(chǔ)器(LM)。向量超級(jí)計(jì)算機(jī)(共享式存儲(chǔ)器SIMD)集中設(shè)置存儲(chǔ)器,共享的多個(gè)并行存儲(chǔ)器通過對(duì)準(zhǔn)網(wǎng)絡(luò)與各處理單元PE相連。在處理單元數(shù)目不太大的情況下很理想。對(duì)稱多處理器(SMP)一個(gè)計(jì)算機(jī)上匯集了一組處理器,各處理器之間共享內(nèi)存子系統(tǒng)以及總線結(jié)構(gòu)。并行向量處理機(jī)(PVP)使用定制的高帶寬網(wǎng)絡(luò)將向量處理器連向共享存儲(chǔ)器模塊使用大量的向量寄存器和指令緩沖器集群計(jì)算機(jī)由許多連在一起的獨(dú)立計(jì)算機(jī)組成,像一個(gè)單獨(dú)集成的計(jì)算機(jī)資源一樣協(xié)同工作,用來解決大型計(jì)算問題。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第6頁!并行計(jì)算機(jī)從系統(tǒng)結(jié)構(gòu)角度分類SMP主要特征對(duì)稱共享存儲(chǔ)系統(tǒng)中任何處理器均可直接訪問任何存儲(chǔ)模塊中的存儲(chǔ)單元和I/O模塊,且訪問的延遲、帶寬和訪問成功的概率是一致的。各個(gè)處理器之間的地位等價(jià),操作系統(tǒng)可在任意處理器上運(yùn)行。單一的操作系統(tǒng)映像全系統(tǒng)只有一個(gè)操作系統(tǒng)駐留在共享存儲(chǔ)器中,它根據(jù)各個(gè)處理器的負(fù)載情況,動(dòng)態(tài)地分配各個(gè)進(jìn)程到各個(gè)處理器,并保持各處理器間的負(fù)載平衡。局部高速緩存cache及其數(shù)據(jù)一致性每個(gè)處理器均配備局部cache,它們可以擁有獨(dú)立的局部數(shù)據(jù),但是這些數(shù)據(jù)必須與存儲(chǔ)器中的數(shù)據(jù)保持一致。低通信延遲各個(gè)進(jìn)程通過讀/寫操作系統(tǒng)提供的共享數(shù)據(jù)緩存區(qū)來完成處理器間的通信,其延遲通常小于網(wǎng)絡(luò)通信的延遲。共享總線帶寬所有處理器共享總線的帶寬,完成對(duì)內(nèi)存模塊和I/O模塊的訪問。支持消息傳遞、共享存儲(chǔ)并行程序設(shè)計(jì)intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第7頁!并行計(jì)算機(jī)從系統(tǒng)結(jié)構(gòu)角度分類分布共享存儲(chǔ)并行機(jī)(DSM)內(nèi)存模塊局部在各個(gè)結(jié)點(diǎn)內(nèi)部,并被所有結(jié)點(diǎn)共享。這樣,可以較好地改善對(duì)稱多處理共享存儲(chǔ)并行機(jī)的可擴(kuò)展能力intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第8頁!并行計(jì)算機(jī)從系統(tǒng)結(jié)構(gòu)角度分類DSM主要特征

基于cache的數(shù)據(jù)一致性:通常采用基于目錄的cache一致性協(xié)議來保證各結(jié)點(diǎn)的局部cache數(shù)據(jù)與存儲(chǔ)器中數(shù)據(jù)的一致性。低通信延遲與高通信帶寬:專用的高性能互聯(lián)網(wǎng)絡(luò)使得結(jié)點(diǎn)間的延遲很小,通信帶寬可以擴(kuò)展。DSM并行機(jī)可擴(kuò)展到數(shù)百個(gè)結(jié)點(diǎn),能提供每秒數(shù)千億次的浮點(diǎn)運(yùn)算性能。支持消息傳遞、共享存儲(chǔ)并行程序設(shè)計(jì)。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第9頁!并行計(jì)算機(jī)從系統(tǒng)結(jié)構(gòu)角度分類大規(guī)模并行機(jī)系統(tǒng)(MPP)大規(guī)模并行機(jī)系統(tǒng)是典型的分布存儲(chǔ)系統(tǒng)。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第10頁!并行計(jì)算機(jī)從系統(tǒng)結(jié)構(gòu)角度分類機(jī)群(cluster)有三個(gè)明顯的特征

系統(tǒng)由商用結(jié)點(diǎn)構(gòu)成,每個(gè)結(jié)點(diǎn)包含2-4個(gè)商用微處理器,結(jié)點(diǎn)內(nèi)部共享存儲(chǔ)。采用商用機(jī)群交換機(jī)連接結(jié)點(diǎn),結(jié)點(diǎn)間分布存儲(chǔ)。在各個(gè)結(jié)點(diǎn)上,采用機(jī)群Linux操作系統(tǒng)、GNU編譯系統(tǒng)和作業(yè)管理系統(tǒng)。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第11頁!典型多核芯片架構(gòu)intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第12頁!芯片組對(duì)多核的支持——固件(續(xù))BIOS(BasicInput/OutputSystem)作為系統(tǒng)硬件和操作系統(tǒng)之間的抽象層,主要用來初始化和配置系統(tǒng)的硬件,啟動(dòng)操作系統(tǒng)以及提供對(duì)系統(tǒng)設(shè)備底層的通訊。BIOS是連接CPU、芯片組和操作系統(tǒng)的固件,是IBM兼容計(jì)算機(jī)中啟動(dòng)時(shí)調(diào)用的固件代碼。由兩部分組成:上電自舉即POST(PowerOnSelfTest)和在線的中斷服務(wù)(主要由legacy操作系統(tǒng)使用)。計(jì)算機(jī)加電時(shí)BIOS從flash、PROM或是EPROM中啟動(dòng)并完成初始化,進(jìn)行加電自檢,對(duì)硬盤,內(nèi)存,顯卡,主板等硬件進(jìn)行掃描檢查,然后它將自己從BIOS內(nèi)存空間中解壓到系統(tǒng)的內(nèi)存空間中,并開始從那里運(yùn)行。正在被以EFI(ExtensibleFirmwareInterface,可擴(kuò)展固件接口)為代表的新一代技術(shù)所取代。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第13頁!EFI對(duì)多核支持在Framework中定義了兩類處理器BSP(bootstrapprocessor),執(zhí)行EFI的初始化代碼,設(shè)置APIC環(huán)境,建立系統(tǒng)范圍的數(shù)據(jù)結(jié)構(gòu),開始并初始化AP。AP(applicationprocessor),在系統(tǒng)上電或重啟之后,AP會(huì)自己進(jìn)行一個(gè)簡單的設(shè)置,然后就等待BSP發(fā)出Startup信號(hào)。Framework在多核計(jì)算機(jī)中初始化過程如下:SEC:從實(shí)模式切換到保護(hù)模式,處理不同的重啟事件、對(duì)每個(gè)處理器進(jìn)行緩存設(shè)置。PEI:做盡量少的硬件初始化,而把更多的留給DXE。DXE:對(duì)所有可用的硬件設(shè)備進(jìn)行初始化,為建立控制臺(tái)和啟動(dòng)操作系統(tǒng)提供必要的服務(wù)。BDS:建立所需的控制臺(tái)設(shè)備,在輸出控制臺(tái)上顯示用戶界面。當(dāng)系統(tǒng)最后選擇啟動(dòng)到操作系統(tǒng)時(shí),EFI需要提交包括處理器在內(nèi)的有關(guān)信息。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第14頁!操作系統(tǒng)對(duì)多核處理器的支持方法intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第15頁!并行和并發(fā)如果某個(gè)系統(tǒng)支持兩個(gè)或多個(gè)動(dòng)作(Action)同時(shí)存在,那么這個(gè)系統(tǒng)就是一個(gè)并發(fā)系統(tǒng)如果某個(gè)系統(tǒng)支持兩個(gè)或多個(gè)動(dòng)作同時(shí)執(zhí)行,那么這個(gè)系統(tǒng)就是一個(gè)并行系統(tǒng)并發(fā)程序可同時(shí)擁有兩個(gè)或多個(gè)線程。如果程序能夠并行執(zhí)行,則一定是運(yùn)行在多核處理器上,每個(gè)線程都將分配到一個(gè)獨(dú)立的處理器核上?!安⑿小备拍钍恰安l(fā)”概念的一個(gè)子集intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第16頁!并行計(jì)算的目的、目標(biāo)并行計(jì)算技術(shù)的主要目的:加速求解問題的速度例如,給定某應(yīng)用,在單處理器上,串行執(zhí)行需要2周,這個(gè)速度對(duì)一般的應(yīng)用而言,是無法忍受的。于是,可以借助并行計(jì)算,使用100臺(tái)處理器,加速50倍,將執(zhí)行時(shí)間縮短為6.72個(gè)小時(shí)。提高求解問題的規(guī)模例如,在單處理器上,受內(nèi)存資源2GB的限制,只能計(jì)算10萬個(gè)網(wǎng)格,但是,當(dāng)前數(shù)值模擬要求計(jì)算千萬個(gè)網(wǎng)格。于是,也可以借助并行計(jì)算,使用100個(gè)處理器,將問題求解規(guī)模線性地?cái)U(kuò)大100倍。并行計(jì)算的主要目標(biāo):在并行機(jī)上,解決具有重大挑戰(zhàn)性計(jì)算任務(wù)的科學(xué)、工程及商業(yè)計(jì)算問題,滿足不斷增長的應(yīng)用問題對(duì)速度和內(nèi)存資源的需求。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第17頁!并行計(jì)算示例N個(gè)數(shù)被分布存儲(chǔ)在P臺(tái)處理器,P臺(tái)處理器并行執(zhí)行N個(gè)數(shù)的累加和。首先,各個(gè)處理器累加它們各自擁有的局部數(shù)據(jù),得到部分和;然后,P臺(tái)處理器執(zhí)行全局通信操作,累加所有部分和,得到全局累加和。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第18頁!多級(jí)存儲(chǔ)體系結(jié)構(gòu)為了解決內(nèi)存墻(memorywall)性能瓶頸問題。在節(jié)點(diǎn)內(nèi)部的cache稱為二級(jí)cache(L2cache)。在處理器內(nèi)部更小的cache稱為一級(jí)cache(L1cache)。L1cache連接CPU寄存器和L2cache,負(fù)責(zé)緩存L2cache中的數(shù)據(jù)到寄存器中。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第19頁!多級(jí)存儲(chǔ)體系結(jié)構(gòu)cache的映射策略指的是內(nèi)存塊和cache線之間如何建立相互映射關(guān)系。直接映射策略(directmappingstrategy)每個(gè)內(nèi)存塊只能被唯一的映射到一條cache線中K-路組關(guān)聯(lián)映射策略(K-waysetassociationmappingstrategy)Cache被分解為V個(gè)組,每個(gè)組由K條cache線組成,內(nèi)存塊按直接映射策略映射到某個(gè)組,但在該組中,內(nèi)存塊可以被映射到任意一條cache線。全關(guān)聯(lián)映射策略(fullassociationmappingstrategy)內(nèi)存塊可以被映射到cache中的任意一條cache線。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第20頁!并行計(jì)算機(jī)訪存模型COMA(Cache-OnlyMemoryAccess)模型各處理器節(jié)點(diǎn)中沒有存儲(chǔ)層次結(jié)構(gòu),全部高速緩存組成了全局地址空間利用分布的高速緩存目錄D進(jìn)行遠(yuǎn)程高速緩存的訪問COMA中的高速緩存容量一般都大于2級(jí)高速緩存容量使用COMA時(shí),數(shù)據(jù)開始時(shí)可以任意分配,因?yàn)樵谶\(yùn)行時(shí)它最終會(huì)被遷移到要用到它的地方NORMA(No-RemoteMemoryAccess)模型所有存儲(chǔ)器都是私有的;絕大多數(shù)NORMA都不支持遠(yuǎn)程存儲(chǔ)器的訪問;在DSM(分布式共享存儲(chǔ))中,NORMA就消失了。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第21頁!并行計(jì)算模型計(jì)算模型是對(duì)計(jì)算機(jī)的抽象計(jì)算模型為設(shè)計(jì)、分析和評(píng)價(jià)算法提供基礎(chǔ)馮·偌依曼機(jī)就是一個(gè)理想的串行計(jì)算模型但現(xiàn)在還沒有一個(gè)通用的并行計(jì)算模型intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第22頁!SIMD同步并行計(jì)算模型SIMD共享存儲(chǔ)模型(PRAM模型)是一種抽象的并行計(jì)算模型,模型中:假定存在著一個(gè)容量無限大的共享存儲(chǔ)器;有有限或無限各功能相同的處理器,且均具有簡單的算術(shù)運(yùn)算和邏輯判斷功能;在任何時(shí)刻各處理器均可以通過共享存儲(chǔ)單元交換數(shù)據(jù)。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第23頁!SIMD同步并行計(jì)算模型SIMD共享存儲(chǔ)模型(PRAM模型)優(yōu)點(diǎn):適合于并行算法的表達(dá)、分析和比較;使用簡單,很多諸如處理器間通信、存儲(chǔ)管理和進(jìn)程同步等并行計(jì)算機(jī)的低級(jí)細(xì)節(jié)均隱含于模型中;易于設(shè)計(jì)算法和稍加修改便可運(yùn)行在不同的并行計(jì)算機(jī)上;有可能加入一些諸如同步和通信等需要考慮的方面。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第24頁!MIMD同步并行計(jì)算模型MIMD-PRAM模型控制器1P1LMP2LMPnLM互連網(wǎng)絡(luò)全局共享存儲(chǔ)器控制器2控制器nintel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第25頁!MIMD異步計(jì)算模型——BSP模型大同步并行BSP(BulkSynchronousParallel)模型作為計(jì)算機(jī)語言和體系結(jié)構(gòu)之間的橋梁,由以下述三個(gè)參數(shù)描述分布存儲(chǔ)的并行計(jì)算機(jī)模型:處理器/存儲(chǔ)器模塊(下文簡稱處理器)處理器模塊之間點(diǎn)到點(diǎn)信息傳遞的路由器執(zhí)行以時(shí)間間隔L為周期的路障同步器特點(diǎn):將處理器和路由器分開,強(qiáng)調(diào)了計(jì)算任務(wù)和通信任務(wù)的分開,而路由器僅施行點(diǎn)到點(diǎn)的消息傳遞,不提供組合、復(fù)制或廣播等功能,這樣做既掩蓋了具體的互聯(lián)網(wǎng)絡(luò)拓?fù)?,又簡化了通信協(xié)議采用路障方式的以硬件實(shí)現(xiàn)的全局同步是在可控的粗粒度級(jí),從而提供了執(zhí)行緊耦合同步式并行算法的有效方式,而程序員并無過分的負(fù)擔(dān)在分析BSP模型的性能時(shí),假定局部操作可在一個(gè)時(shí)間步內(nèi)完成,而在每一超級(jí)步中,一個(gè)處理器至多發(fā)送或接受h條消息(h-relation)intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第26頁!MIMD異步計(jì)算模型——LogP模型揭示了分布存儲(chǔ)并行計(jì)算機(jī)的性能瓶頸,用L、o、g三個(gè)參數(shù)刻畫了通信網(wǎng)絡(luò)的特性,但屏蔽了網(wǎng)絡(luò)拓?fù)?、選路算法和通信協(xié)議等具體細(xì)節(jié)參數(shù)g反映了通信帶寬在任何時(shí)刻,最多只能有[L/g]條消息從一個(gè)處理器傳到另一個(gè)處理器,這就是網(wǎng)絡(luò)容限,當(dāng)一臺(tái)處理機(jī)發(fā)送的消息達(dá)到這個(gè)容限時(shí),在發(fā)送的消息就會(huì)被阻塞;在網(wǎng)絡(luò)容限范圍內(nèi),點(diǎn)到點(diǎn)傳送一條消息的時(shí)間為(2*o+L)。設(shè)想LogP模型中的L、o、g都為0,那么LogP模型就等同于PRAM模型intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第27頁!各種計(jì)算模型比較模型屬性PRAMAPRAMBSPLogPC3體系結(jié)構(gòu)SIMD-SMMIMD-SMMIMD-DMMIMD-DMMIMD-DM計(jì)算模式同步異步異步異步異步同步方式自動(dòng)同步路障同步路障同步隱式同步路障同步模型參數(shù)單位時(shí)間步d,讀/寫時(shí)間B,同步時(shí)間p,處理器數(shù)g,帶寬因子l,同步間隔L,通信延遲o,額外開銷g,帶寬因子P,處理器數(shù)l,信包長度s,發(fā)送建立時(shí)間h,通信延遲計(jì)算粒度細(xì)粒度/中粒度中粒度/粗粒度中粒度/粗粒度中粒度/粗粒度粗粒度通信方式讀/寫共享變量讀/寫共享變量發(fā)送/接收消息發(fā)送/接收消息發(fā)送/接收消息地址空間全局地址空間單地址空間單/多地址空間單/多地址空間多地址空間intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第28頁!并行算法分類并行算法根據(jù)運(yùn)算基本對(duì)象的不同可分為:數(shù)值并行算法主要為數(shù)值計(jì)算方法而設(shè)計(jì)的并行算法;非數(shù)值并行算法主要為符號(hào)運(yùn)算而設(shè)計(jì)的并行算法,如圖論算法、遺傳算法等。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第29頁!并行算法分類根據(jù)各進(jìn)程承擔(dān)的計(jì)算任務(wù)粒度的不同,可分為:細(xì)粒度并行算法通常指基于向量和循環(huán)級(jí)并行的算法;中粒度并行算法通常指基于較大的循環(huán)級(jí)并行;大粒度并行算法通常指基于子任務(wù)級(jí)并行的算法,例如通常的基于區(qū)域分解的并行算法,它們是當(dāng)前并行算法設(shè)計(jì)的主流。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第30頁!并行編程環(huán)境比較流行的并行編程環(huán)境主要有3類:消息傳遞、共享存儲(chǔ)和數(shù)據(jù)并行特征消息傳遞共享存儲(chǔ)數(shù)據(jù)并行典型代表MPI,PVMOpenMPHPF可移植性所有主流并行計(jì)算機(jī)SMP,DSMSMP,DSM,MPP并行粒度進(jìn)程級(jí)大粒度線程級(jí)細(xì)粒度進(jìn)程級(jí)細(xì)粒度并行操作方式異步異步松散同步數(shù)據(jù)存儲(chǔ)模式分布式存儲(chǔ)共享存儲(chǔ)共享存儲(chǔ)數(shù)據(jù)分配方式顯式隱式半隱式學(xué)習(xí)入門難度較難容易偏易可擴(kuò)展性好較差一般intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第31頁!編程語言與編譯器自動(dòng)并行始于20世紀(jì)70年代的自動(dòng)向量化。20世紀(jì)80年代中期,基于依賴分析的向量化工具成熟,成為向量機(jī)的標(biāo)準(zhǔn)。自動(dòng)化并行本身不足以解決并行程序設(shè)計(jì)問題。此領(lǐng)域的研究重點(diǎn)逐步轉(zhuǎn)向基于語言的策略研究,即從用戶那里獲得更多的信息,同時(shí)利用自動(dòng)并行化技術(shù)來減輕程序設(shè)計(jì)的負(fù)擔(dān)。依賴分析:搜索確定對(duì)同一數(shù)據(jù)結(jié)構(gòu)的哪些引用是訪問同一存儲(chǔ)單元的intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第32頁!編程語言與編譯器共享存儲(chǔ)并行編程:OpenMP1997年由SiliconGraphics領(lǐng)導(dǎo)的工業(yè)協(xié)會(huì)推出了OpenMP是一個(gè)與Fortran77和C語言綁定的并行編程接口OpenMP指令在單機(jī)編譯器上被當(dāng)作注釋而忽略通過parallelsection指令獲得任務(wù)并行#pragmaompparallelfor…提供了鎖變量用于線程間細(xì)粒度同步是適合于具有一致性訪存的共享存儲(chǔ)計(jì)算機(jī)的編程接口intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第33頁!并行計(jì)算性能評(píng)測并行程序執(zhí)行時(shí)間對(duì)各個(gè)進(jìn)程,墻上時(shí)間可進(jìn)一步分解為計(jì)算CPU時(shí)間、通信CPU時(shí)間、同步開銷時(shí)間、同步導(dǎo)致的進(jìn)程空閑時(shí)間計(jì)算CPU時(shí)間:進(jìn)程指令執(zhí)行所花費(fèi)的CPU時(shí)間,包括程序本身的指令執(zhí)行占用的時(shí)間(用戶時(shí)間)和系統(tǒng)指令花費(fèi)的時(shí)間;通信CPU時(shí)間:進(jìn)程通信花費(fèi)的CPU時(shí)間;同步開銷時(shí)間:進(jìn)程同步花費(fèi)的時(shí)間;進(jìn)程空閑時(shí)間:進(jìn)程空閑時(shí)間是指并行程序執(zhí)行過程中,進(jìn)程所有空閑時(shí)間總和(如進(jìn)程阻塞式等待其他進(jìn)程的消息時(shí)。此時(shí)CPU通常是空閑的,或者處于等待狀態(tài))intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第34頁!并行計(jì)算性能評(píng)測并行加速比與效率在處理器資源獨(dú)享的前提下,假設(shè)某個(gè)串行應(yīng)用程序在某臺(tái)并行機(jī)單處理器上的執(zhí)行時(shí)間為TS,而該程序并行化后,P個(gè)進(jìn)程在P個(gè)處理器并行執(zhí)行所需要的時(shí)間為TP

,則該并行程序在該并行機(jī)上的加速比SP

可定義為:效率定義為:intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第35頁!并行計(jì)算性能評(píng)測Amdahl定律告訴我們:可并行計(jì)算量占主要比重通過并行化,增加的額外計(jì)算量所占比重有限:這些計(jì)算量由各個(gè)處理器/執(zhí)行內(nèi)核分?jǐn)傄凶銐虻牟⑿卸?并行子任務(wù)數(shù)量),實(shí)現(xiàn)負(fù)載均衡:問題規(guī)模越大,并行度也越大數(shù)據(jù)并行大規(guī)模數(shù)據(jù)處理數(shù)據(jù)規(guī)模與處理器/執(zhí)行內(nèi)核的規(guī)模比率要適當(dāng)只有上述三個(gè)特征都滿足了,采用并行處理技術(shù)才有意義intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第36頁!程序性能優(yōu)化串行程序性能優(yōu)化調(diào)用高性能庫許多著名的高性能數(shù)學(xué)程序庫如優(yōu)化的BLAS、FFTW等,由于經(jīng)過廠商或第三方針對(duì)特定處理機(jī)進(jìn)行的專門優(yōu)化,其性能一般大大優(yōu)于用戶自行編寫的同樣功能的程序段或子程序。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第37頁!程序性能優(yōu)化串行程序性能優(yōu)化調(diào)用高性能庫

FFTW(TheFastestFourierTransformintheWest)是一個(gè)免費(fèi)的快速富氏變換(FFT)軟件包,開發(fā)者是麻省理工學(xué)院的MatteoFrigo和StevenG.Johnson,下載網(wǎng)址:http://.

該軟件包用C語言開發(fā),其核心技術(shù)(編碼生成器)采用面向?qū)ο笳Z言Caml編寫。FFTW能自動(dòng)適應(yīng)系統(tǒng)硬件,可移植性很強(qiáng)。它能計(jì)算一維和多維離散傅立葉變換,其數(shù)據(jù)類型可以是實(shí)型、復(fù)型或半復(fù)型。該軟件通過方案(plan)和執(zhí)行器(executor)與用戶進(jìn)行接口,內(nèi)部結(jié)構(gòu)及其復(fù)雜性對(duì)用戶透明,速度快。內(nèi)部編譯器、代碼生成器利用AST(AbstractSyntaxTree)在運(yùn)行時(shí)生成適合所運(yùn)行的機(jī)器的代碼并自我優(yōu)化。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第38頁!程序性能優(yōu)化串行程序性能優(yōu)化合理定義數(shù)組維數(shù)在進(jìn)行連續(xù)數(shù)據(jù)訪問時(shí)應(yīng)該使得地址的增量與內(nèi)存體數(shù)的最大公約數(shù)盡量小,特別要避免地址增量正好是體數(shù)的倍數(shù)。注意嵌套循環(huán)的順序,盡量改善數(shù)據(jù)訪問的局部性通用的原則就是盡量使最內(nèi)層循環(huán)的數(shù)據(jù)訪問連續(xù)進(jìn)行intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第39頁!程序性能優(yōu)化串行程序性能優(yōu)化循環(huán)展開是另一個(gè)非常有效的程序優(yōu)化技術(shù)。它除了能夠改善數(shù)據(jù)訪問的時(shí)間和空間局部性外,還由于增加了每步循環(huán)中的指令與運(yùn)算的數(shù)目,亦有助于CPU多個(gè)運(yùn)算部件的充分利用。DOI=1,ND=D+A(I)ENDDO將它進(jìn)行4步循環(huán)展開的代碼如下:DOI=1,MOD(N,4)D=D+A(I)ENDDODOI=MOD(N,4)+1,N,4D=D+A(I)+A(I+1)+A(I+2)+A(I+3)ENDDO上面的代碼中個(gè)循環(huán)用于處理N除以4的余數(shù),第二個(gè)循環(huán)是展開后的循環(huán)。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第40頁!程序性能優(yōu)化并行程序性能優(yōu)化最主要的是選擇好的并行算法和通信模式減少通信量、提高通信粒度提高通信粒度的有效方法就是減少通信次數(shù),盡可能將可以一次傳遞的數(shù)據(jù)合并起來一起傳遞全局通信盡量利用高效集合通信算法對(duì)于標(biāo)準(zhǔn)的集合通信,如廣播、規(guī)約、數(shù)據(jù)散發(fā)與收集等,盡量調(diào)用MPI標(biāo)準(zhǔn)庫函數(shù)挖掘算法的并行度,減少CPU空閑等待具有數(shù)據(jù)相關(guān)性的計(jì)算過程會(huì)導(dǎo)致并行運(yùn)行的部分進(jìn)程空閑等待.在這種情況下,可以考慮改變算法來消除數(shù)據(jù)相關(guān)性intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第41頁!程序性能優(yōu)化并行程序:求小于N的全部素?cái)?shù)pThread_primeintel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第42頁!并行編譯器并行編譯過程intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第43頁!并行編譯器代碼優(yōu)化代碼向量化(CodeVectorization):把標(biāo)量程序中的由一種可向量化循環(huán)完成的操作變換成向量操作。代碼并行化(CodeParallelization):并行代碼的優(yōu)化是將一個(gè)程序展開成多線程以同時(shí)供多臺(tái)處理機(jī)并行執(zhí)行,其目的是要減少總的執(zhí)行時(shí)間。代碼生成并行代碼生成(CodeGeneration)涉及到將優(yōu)化后的中間形式的代碼轉(zhuǎn)換程可執(zhí)行的具體的機(jī)器目標(biāo)代碼。包括執(zhí)行次序、指令選擇、寄存器分配、負(fù)載平衡、并行粒度、代碼調(diào)度以及后優(yōu)化(Postoptimization)等問題。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第44頁!進(jìn)程定義:進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于一個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)??杀硎境伤脑M(P,C,D,S),其中P是程序代碼,C是進(jìn)程的控制狀態(tài),D是進(jìn)程的數(shù)據(jù),S是進(jìn)程的執(zhí)行狀態(tài)。狀態(tài):運(yùn)行態(tài)(Run):進(jìn)程占有處理機(jī)資源,正在運(yùn)行;就緒態(tài)(Ready):進(jìn)程本身具備運(yùn)行條件,但由于處理機(jī)的個(gè)數(shù)少于可運(yùn)行進(jìn)程的個(gè)數(shù),暫未投入運(yùn)行;等待態(tài)(Wait):

進(jìn)程本身不具備運(yùn)行條件,即使分給它處理機(jī)也不能運(yùn)行.進(jìn)程正等待某一個(gè)事件的發(fā)生,如等待某一資源被釋放,等待與該進(jìn)程相關(guān)的I/O傳輸?shù)耐瓿尚盘?hào)等。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第45頁!進(jìn)程進(jìn)程控制塊(ProcessControlBlock,PCB):標(biāo)志進(jìn)程存在的數(shù)據(jù)結(jié)構(gòu),其中包含系統(tǒng)對(duì)進(jìn)程管理需要的全部信息。進(jìn)程標(biāo)識(shí)用戶標(biāo)識(shí)進(jìn)程狀態(tài)調(diào)度參數(shù)現(xiàn)場信息家族聯(lián)系程序地址當(dāng)前打開文件消息隊(duì)列指針資源使用情況進(jìn)程隊(duì)列指針intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第46頁!進(jìn)程進(jìn)程的表示PCB程序PCB代碼數(shù)據(jù)+堆棧系統(tǒng)空間用戶空間(a)(b)intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第47頁!進(jìn)程進(jìn)程的隊(duì)列就緒隊(duì)列整個(gè)系統(tǒng)一個(gè)。所有處于就緒狀態(tài)的進(jìn)程按照某種組織方式排在這一隊(duì)列中。等待隊(duì)列每個(gè)等待事件一個(gè),當(dāng)進(jìn)程等待某一事件時(shí),進(jìn)入與該事件相關(guān)的等待隊(duì)列中;當(dāng)某事件發(fā)生時(shí),與該事件相關(guān)的一個(gè)或多個(gè)進(jìn)程離開相應(yīng)的等待隊(duì)列,進(jìn)入就緒隊(duì)列。運(yùn)行隊(duì)列在單CPU系統(tǒng)中只有一個(gè),在多CPU系統(tǒng)中每個(gè)CPU各有一個(gè),每個(gè)隊(duì)列中只有一個(gè)進(jìn)程,指向運(yùn)行隊(duì)列頭部的指針被稱作運(yùn)行指示字。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第48頁!進(jìn)程兩個(gè)特征資源特征,包括程序執(zhí)行所必需的計(jì)算資源,例如程序代碼、內(nèi)存地址空間、文件系統(tǒng)、I/O設(shè)備、程序計(jì)數(shù)器、寄存器、??臻g等執(zhí)行特征,包括在進(jìn)程執(zhí)行過程中動(dòng)態(tài)改變的特征,例如指令路徑(即進(jìn)程執(zhí)行的指令序列)、進(jìn)程的控制與執(zhí)行狀態(tài)等。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第49頁!進(jìn)程的創(chuàng)建與撤銷

進(jìn)程創(chuàng)建

建立一個(gè)PCB,并對(duì)其內(nèi)容進(jìn)行初始化;為該進(jìn)程分配必要的存儲(chǔ)空間,并加載所要執(zhí)行的程序(在UNIX系統(tǒng)中需要通過另外一個(gè)系統(tǒng)調(diào)用execl實(shí)現(xiàn));將PCB送入就緒隊(duì)列。進(jìn)程撤銷完成使命的進(jìn)程需要終止自己并告知操作系統(tǒng),系統(tǒng)將對(duì)進(jìn)程進(jìn)行善后處理(收集進(jìn)程狀態(tài)信息、通知其父進(jìn)程等),之后將收回進(jìn)程所占有的所有資源(打開文件、內(nèi)存等),最后撤銷其PCB。,非正常終止也將進(jìn)入操作系統(tǒng)進(jìn)行善后處理。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第50頁!線程的概念在支持多線程的系統(tǒng)中:進(jìn)程成為資源分配和保護(hù)的實(shí)體線程是被調(diào)度執(zhí)行的基本單元。進(jìn)程的資源包括進(jìn)程的地址空間,打開的文件和I/O等屬于同一個(gè)進(jìn)程的線程共享該進(jìn)程的代碼段和數(shù)據(jù)段,打開的文件,信號(hào)等還包含各自的線程ID,線程執(zhí)行狀態(tài),CPU寄存器狀態(tài)和棧intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第51頁!線程是“進(jìn)程中的一條執(zhí)行路徑或線索”或“進(jìn)程中的一個(gè)可調(diào)度實(shí)體”線程的概念intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第52頁!線程的概念線程的優(yōu)點(diǎn)上下文切換速度快:由同一進(jìn)程中的一個(gè)線程切換到另一個(gè)線程只需改變寄存器和棧,包括程序和數(shù)據(jù)在內(nèi)的地址空間不變;系統(tǒng)開銷?。簞?chuàng)建線程比創(chuàng)建進(jìn)程所需完成的工作少,因而對(duì)于客戶請(qǐng)求,服務(wù)器動(dòng)態(tài)創(chuàng)建線程比動(dòng)態(tài)創(chuàng)建進(jìn)程具有更高的響應(yīng)速度;通訊容易:由于同一進(jìn)程中的多個(gè)線程地址空間共享,一個(gè)線程寫到數(shù)據(jù)空間的信息可以直接被該進(jìn)程中的另一線程讀取,方便快捷;終止一個(gè)線程比終止一個(gè)進(jìn)程的代價(jià)要小。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第53頁!線程的概念并發(fā)性

在引入線程的操作系統(tǒng)中,不僅進(jìn)程之間可以并發(fā)執(zhí)行,而且在一個(gè)進(jìn)程中的多個(gè)線程之間也可以并發(fā)執(zhí)行,因而使操作系統(tǒng)具有更好的并發(fā)性,從而能更有效地使用系統(tǒng)資源和提高系統(tǒng)的吞吐量。例:在一個(gè)未引入線程的單CPU操作系統(tǒng)中,若僅設(shè)置一個(gè)文件服務(wù)進(jìn)程,當(dāng)它由于某種原因被封鎖時(shí),便沒有其他的文件服務(wù)進(jìn)程來提供服務(wù)。在引入了線程的操作系統(tǒng)中,可以在一個(gè)文件服務(wù)進(jìn)程中設(shè)置多個(gè)服務(wù)線程。當(dāng)個(gè)線程等待時(shí),文件服務(wù)進(jìn)程中的第二個(gè)線程可以繼續(xù)運(yùn)行;當(dāng)?shù)诙€(gè)線程封鎖時(shí),第三個(gè)線程可以繼續(xù)執(zhí)行,從而顯著地提高了文件服務(wù)的質(zhì)量以及系統(tǒng)的吞吐量。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第54頁!線程的概念擁有資源

由于在創(chuàng)建或撤消進(jìn)程時(shí),系統(tǒng)都要為之分配或回收資源,如內(nèi)存空間、I/O設(shè)備等。因此,操作系統(tǒng)所付出的開銷將顯著地大于在創(chuàng)建或撤消線程時(shí)的開銷。在進(jìn)行進(jìn)程切換時(shí),涉及到整個(gè)當(dāng)前進(jìn)程CPU環(huán)境的保存環(huán)境的設(shè)置以及新被調(diào)度運(yùn)行的進(jìn)程的CPU環(huán)境的設(shè)置。線程切換只需保存和設(shè)置少量寄存器的內(nèi)容,并不涉及存儲(chǔ)器管理方面的操作。因此進(jìn)程切換的開銷遠(yuǎn)大于線程切換的開銷。由于同一進(jìn)程中的多個(gè)線程具有相同的地址空間,致使它們之間的同步和通信的實(shí)現(xiàn)也變得比較容易。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第55頁!線程的概念線程控制塊(ThreadControlBlock,TCB):線程控制塊是標(biāo)志線程存在的數(shù)據(jù)結(jié)構(gòu),其中包含系統(tǒng)對(duì)于線程進(jìn)行管理所需要的全部信息intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第56頁!用戶級(jí)線程和內(nèi)核級(jí)線程用戶級(jí)線程庫是用于用戶級(jí)線程管理的例程包,支持線程的創(chuàng)建、終止,以及調(diào)度線程的執(zhí)行并保存和恢復(fù)線程的上下文,這些操作都在用戶空間進(jìn)行,無需內(nèi)核的支持。內(nèi)核級(jí)線程所有管理操作都是由操作系統(tǒng)內(nèi)核完成的。內(nèi)核保存線程的狀態(tài)和上下文信息,當(dāng)一個(gè)線程執(zhí)行了引起阻塞的系統(tǒng)調(diào)用時(shí),內(nèi)核可以調(diào)度該進(jìn)程的其他線程執(zhí)行。在多處理器系統(tǒng)上,內(nèi)核可以分派屬于同一進(jìn)程的多個(gè)線程在多個(gè)處理器上運(yùn)行,提高進(jìn)程執(zhí)行的并行度。組合模式有的操作系統(tǒng)提供了組合的線程模式,在Solaris中,用戶創(chuàng)建的多個(gè)用戶級(jí)線程被映射到一些內(nèi)核線程上,內(nèi)核線程的數(shù)目可能少于用戶級(jí)線程的數(shù)目。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第57頁!用戶級(jí)線程優(yōu)點(diǎn):線程不依賴于操作系統(tǒng),可以采用與問題相關(guān)的調(diào)度策略,靈活性好;同一進(jìn)程中的線程切換不需進(jìn)入操作系統(tǒng),因而實(shí)現(xiàn)效率較高;有關(guān)線程的所有管理工作都由在用戶級(jí)實(shí)現(xiàn)的線程庫來支持。用戶級(jí)線程缺點(diǎn):同一進(jìn)程中的多個(gè)線程不能真正并行;由于線程對(duì)操作系統(tǒng)不可見,調(diào)度在進(jìn)程級(jí)別,某進(jìn)程中的一個(gè)線程通過系統(tǒng)調(diào)用進(jìn)入操作系統(tǒng)受阻,該進(jìn)程的其它線程也不能運(yùn)行。用戶級(jí)線程特征:戶級(jí)線程的創(chuàng)建和管理等操作無須內(nèi)核參與,操作更快并行性不高,一個(gè)線程被系統(tǒng)阻塞后,整個(gè)進(jìn)程被阻塞用戶級(jí)線程和內(nèi)核級(jí)線程intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第58頁!核心級(jí)別線程的優(yōu)點(diǎn)是并發(fā)性好,在多CPU環(huán)境中同一進(jìn)程中的多個(gè)線程可以真正并行執(zhí)行

核心級(jí)別線程的缺點(diǎn)是線程控制和狀態(tài)轉(zhuǎn)換需要進(jìn)入操作系統(tǒng)完成,系統(tǒng)開銷比較大.

特點(diǎn)并行性高,多個(gè)線程可被同時(shí)調(diào)度充分利用多處理器創(chuàng)建和管理代價(jià)高用戶級(jí)線程和內(nèi)核級(jí)線程intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第59頁!多線程的映射模型多對(duì)一模型多對(duì)一模型把多個(gè)用戶級(jí)線程映射到一個(gè)內(nèi)核級(jí)線程。線程的管理在用戶空間實(shí)現(xiàn),所以效率高。當(dāng)一個(gè)線程因調(diào)用系統(tǒng)調(diào)用被阻塞時(shí),整個(gè)進(jìn)程被阻塞。用戶級(jí)線程不能在多處理器上并發(fā)執(zhí)行,不支持內(nèi)核級(jí)線程的操作系統(tǒng)使用多對(duì)一模型。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第60頁!多對(duì)多模型多對(duì)多模型將m個(gè)用戶級(jí)線程影射到n個(gè)內(nèi)核級(jí)線程,m≥n。用戶可以創(chuàng)建所需要的用戶級(jí)線程,通過分配適當(dāng)數(shù)目的內(nèi)核級(jí)線程獲得并發(fā)執(zhí)行的優(yōu)勢并節(jié)省系統(tǒng)資源。ExamplesSolaris2

多線程的映射模型intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第61頁!線程狀態(tài)的轉(zhuǎn)換線程的狀態(tài)就緒(ready):線程等待可用的處理器。運(yùn)行(running):線程正在被執(zhí)行。阻塞(blocked):線程正在等待某個(gè)事件的發(fā)生(比如I/O的完成,試圖加鎖一個(gè)被上鎖的互斥量)。終止(terminated):線程從起始函數(shù)中返回或者調(diào)用pthread_el公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第62頁!多線程程序設(shè)計(jì)為什么要多線程程序設(shè)計(jì)某些應(yīng)用具有內(nèi)在的多個(gè)控制流結(jié)構(gòu),這些控制流具有合作性質(zhì),需要共享內(nèi)存,采用多線程易于對(duì)問題建模,從而得到最自然的解決算法;在需要多控制流的應(yīng)用中,多線程比多進(jìn)程在速度上具有絕對(duì)優(yōu)勢,統(tǒng)計(jì)測試表明,線程的建立速度比進(jìn)程的建立速度快100倍,進(jìn)程內(nèi)線程間的切換速度與進(jìn)程間切換速度也有數(shù)量級(jí)之差;采用多線程可以提高處理機(jī)與設(shè)備之間的并行性.在單控制流情形下,啟動(dòng)設(shè)備的進(jìn)程進(jìn)入核心后將被阻塞,此時(shí)該進(jìn)程的其它代碼也不能執(zhí)行.若此時(shí)無其它可運(yùn)行程序,處理機(jī)將被閑置.多線程結(jié)構(gòu)在一個(gè)線程等待時(shí),其它線程可以繼續(xù)執(zhí)行,從而使設(shè)備和處理機(jī)并行工作;在多核環(huán)境下,多線程可以并行執(zhí)行,既可提高資源利用效率,又可提高進(jìn)程推進(jìn)速度。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第63頁!多線程機(jī)制在多處理器系統(tǒng)上,如果一個(gè)應(yīng)用具有如下特征,就可以利用多線程技術(shù)達(dá)到目標(biāo):前臺(tái)后臺(tái)操作;異步處理;需要加速執(zhí)行;模塊化程序結(jié)構(gòu)。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第64頁!多線程環(huán)境下的進(jìn)程控制語義進(jìn)程結(jié)束在任何一個(gè)線程中調(diào)用exit將會(huì)結(jié)束整個(gè)進(jìn)程,另外從主線程返回也等同于調(diào)用exit而導(dǎo)致進(jìn)程結(jié)束。如果要從線程中退出則調(diào)用專用的線程退出函數(shù)。

信號(hào)處理信號(hào)是unix中系統(tǒng)通知進(jìn)程的重要機(jī)制。信號(hào)可能是同步的也可能是異步的。發(fā)送給進(jìn)程的信號(hào)在多線程環(huán)境下有多種選擇:發(fā)送給引發(fā)信號(hào)的線程;發(fā)送給所有的線程;發(fā)送個(gè)特定的線程;指定一個(gè)線程處理所有的信號(hào)。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第65頁!線程的同步例:如果一個(gè)進(jìn)程有一個(gè)共享變量counter,兩個(gè)線程producer和consumer,線程producer執(zhí)行counter++,線程consumer執(zhí)行counter--,這兩個(gè)操作都需要多個(gè)機(jī)器指令來完成,Counter=5counter++counter--register1=counterregister2=counterregister1=register1+1register2=register2-1counter=register1counter=register2可能的序列:Producer:register1=counter(register1=5)Producer:register1=register1+1(register1=6)Consumer:register2=counter(register2=5)Consumer:register2=register2-1(register2=6)Producer:counter=register1(counter=6)Consumer:counter=register2(counter=4)intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第66頁!順序程序的特性順序性:處理機(jī)嚴(yán)格按照指令次序依次執(zhí)行,即僅當(dāng)一條指令執(zhí)行完后才開始執(zhí)行下一條指令;封閉性:程序在執(zhí)行過程中獨(dú)占系統(tǒng)中的全部資源,該程序的運(yùn)行環(huán)境只與其自身動(dòng)作有關(guān),不受其它程序及外界因素影響;可再現(xiàn)性:程序的執(zhí)行結(jié)果與執(zhí)行速度無關(guān),而只與初始條件有關(guān),給定相同的初始條件,程序的任意多次執(zhí)行一定得到相同的執(zhí)行結(jié)果.線程的同步intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第67頁!并發(fā)程序特性交叉性:程序并發(fā)執(zhí)行對(duì)應(yīng)某一種交叉,不同的交叉可能導(dǎo)致不同的計(jì)算結(jié)果,操作系統(tǒng)應(yīng)當(dāng)保證只產(chǎn)生導(dǎo)致正確結(jié)果的交叉,去除那些可能導(dǎo)致不正確結(jié)果的交叉;非封閉性:一個(gè)進(jìn)程的運(yùn)行環(huán)境可能被其它進(jìn)程所改變,從而相互影響;不可再現(xiàn)性:由于交叉的隨機(jī)性,并發(fā)程序的多次執(zhí)行可能對(duì)應(yīng)不同的交叉,因而不能期望重新運(yùn)行的程序能夠再現(xiàn)上次運(yùn)行的結(jié)果。線程的同步intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第68頁!線程的同步常用的同步機(jī)制臨界區(qū)(criticalsection)信號(hào)量(simphore)互斥量(mutex)管程(monitor)鎖的粒度死鎖intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第69頁!互斥量(Mutex)

Pthread線程庫對(duì)一個(gè)互斥量的加鎖操作是:intpthread_mutex_lock(pthread_mutex_t*mutex);intpthread_mutex_trylock(pthread_mutex_t*mutex);

pthread_mutex_unlock(pthread_mutex_t*mutex);//釋放producer對(duì)counter變量的操作要先加鎖互斥量,完成對(duì)counter的操作之后釋放互斥量

pthread_mutex_lock(&counter_mutex);

counter++;pthread_mutex_unlock(&counter_mutex);

intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第70頁!可能的輸出:AHellooneBHellooneBHellotwoAHellotwointel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第71頁!鎖的粒度鎖的粒度是上鎖后保護(hù)的共享數(shù)據(jù)的多少。假設(shè)多個(gè)線程需要存取一棵樹,如果設(shè)定一個(gè)互斥量以保證對(duì)數(shù)的互斥訪問,當(dāng)一個(gè)線程加鎖并訪問該樹期間,則其他線程無法訪問。另一種方法是對(duì)樹的每個(gè)節(jié)點(diǎn)設(shè)置一個(gè)互斥量,當(dāng)訪問不同的節(jié)點(diǎn)時(shí),加鎖不同的互斥量,除非兩個(gè)線程試圖訪問同一個(gè)節(jié)點(diǎn),多個(gè)線程可以同時(shí)訪問樹的不同節(jié)點(diǎn),在多CPU或多核系統(tǒng)中可以充分地利用并行處理能力。

intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第72頁!臨界區(qū)有些變量,兩個(gè)進(jìn)程或兩個(gè)以上的進(jìn)程均需要訪問它們,這些變量被稱作共享變量,也稱公共變量,訪問共享變量的程序段稱作臨界區(qū)(criticalregion),也稱為臨界段(criticalsection)定義:多個(gè)進(jìn)程均需要訪問的變量稱為公共變量(sharedvariable);定義:訪問共享變量的程序段稱作臨界區(qū)域(criticalregion),也稱為臨界段(criticalsection)共享變量可能屬于操作系統(tǒng)空間,也可能屬于用戶進(jìn)程空間.對(duì)于前者,其臨界區(qū)域亦屬于操作系統(tǒng)空間,而對(duì)于后者,其臨界區(qū)域則屬于用戶進(jìn)程空間.intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第73頁!臨界區(qū)與進(jìn)程互斥

兩個(gè)或兩個(gè)以上的進(jìn)程不能同時(shí)進(jìn)入關(guān)于同一組共享變量的臨界區(qū),其中有兩層含意:

不容許多個(gè)進(jìn)程同時(shí)進(jìn)入關(guān)于同一組共享變量的相同的臨界區(qū);不容許多個(gè)進(jìn)程同時(shí)進(jìn)入關(guān)于同一組共享變量的不同的臨界區(qū)域.如果容許,則有可能發(fā)生錯(cuò)誤,亦有可能不發(fā)生錯(cuò)誤,這與各個(gè)進(jìn)程并發(fā)執(zhí)行時(shí)的推進(jìn)速度有關(guān).這是保證正確性的要求,但這件事的實(shí)現(xiàn)應(yīng)當(dāng)由操作系統(tǒng)以及并發(fā)程序的設(shè)計(jì)者在編寫程序時(shí)來保證,而這需要有必要的互斥機(jī)制.

intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第74頁!互斥的實(shí)現(xiàn)

應(yīng)當(dāng)滿足下面三個(gè)管理原則::正確性原則(correctness):任意時(shí)刻至多只能有一個(gè)進(jìn)程處于關(guān)于同一組共享變量的臨界區(qū)域之中;公平性原則(fairness):一個(gè)請(qǐng)求進(jìn)入臨界區(qū)的進(jìn)程應(yīng)當(dāng)在有限等待時(shí)間內(nèi)獲得進(jìn)入該臨界區(qū)的機(jī)會(huì);進(jìn)展性原則(progress):當(dāng)臨界區(qū)空閑時(shí),競爭進(jìn)入臨界區(qū)的多個(gè)進(jìn)程在有限時(shí)間之內(nèi)確定下一個(gè)進(jìn)入臨界區(qū)的進(jìn)程.臨界區(qū)域的管理應(yīng)當(dāng)滿足如下調(diào)度原則:

當(dāng)關(guān)于某一組共享變量的所有臨界區(qū)域均為空閑時(shí),一個(gè)要求進(jìn)入該組共享變量某一臨界區(qū)域的進(jìn)程應(yīng)當(dāng)能夠立即進(jìn)入;當(dāng)關(guān)于某一組共享變量的某一臨界區(qū)域被占用時(shí),一個(gè)要求進(jìn)入該組共享變量某一臨界區(qū)域的進(jìn)程應(yīng)當(dāng)?shù)却?當(dāng)一個(gè)進(jìn)程離開關(guān)于某一組共享變量的某一臨界區(qū)域時(shí),應(yīng)當(dāng)容許某一個(gè)等待進(jìn)入關(guān)于該組共享變量某一臨界區(qū)域的進(jìn)程進(jìn)入.intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第75頁!同步

同步:一組進(jìn)程(線程),為了協(xié)調(diào)其推進(jìn)速度,在某些點(diǎn)處需要相互等待與相互喚醒,進(jìn)程之間這種相互制約的關(guān)系稱作進(jìn)程同步,簡稱同步(synchronization).進(jìn)程同步是進(jìn)程之間直接的相互作用形式,是合作進(jìn)程之間有意識(shí)的行為,這種相互作用只發(fā)生在相關(guān)的進(jìn)程之間。進(jìn)程合作(cooperation)

:一組進(jìn)程,如果它們單獨(dú)不能正常進(jìn)行,但并發(fā)可以正常進(jìn)行,稱這種現(xiàn)象為進(jìn)程合作,參與合作的進(jìn)程稱作合作進(jìn)程(cooperatingprocess)。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第76頁!進(jìn)程同步機(jī)制

同步機(jī)制:用于實(shí)現(xiàn)進(jìn)程間同步的工具稱作同步機(jī)制,亦稱同步設(shè)施(synchronizationmechanism)同步機(jī)制應(yīng)當(dāng)滿足如下幾個(gè)基本要求:描述能力夠用:即用此種同步機(jī)制應(yīng)當(dāng)能夠描述操作系統(tǒng)及并發(fā)程序設(shè)計(jì)中所遇到的各種同步問題;可以實(shí)現(xiàn);效率高;使用方便。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第77頁!結(jié)論:當(dāng)s≥0時(shí),

s等待隊(duì)列為空;當(dāng)s<0時(shí),│s│為s隊(duì)列中等待進(jìn)程的個(gè)數(shù);當(dāng)s的初值為1時(shí),可以用來實(shí)現(xiàn)進(jìn)程互斥,這只需在進(jìn)入臨界區(qū)時(shí)執(zhí)行一次P操作,在離開臨界區(qū)時(shí)執(zhí)行一次V操作;當(dāng)s的初值為正整數(shù)時(shí),可以用來管理同種組合資源(具有多個(gè)實(shí)例的同種類資源,如5臺(tái)打印機(jī)),申請(qǐng)時(shí)執(zhí)行一次P操作,歸還時(shí)執(zhí)行一次V操作。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第78頁!進(jìn)程通訊的模式進(jìn)程通訊主要有兩種模式:共享內(nèi)存模式和消息模式。共享內(nèi)存模式相互通訊的進(jìn)程之間需要有公共內(nèi)存,一組進(jìn)程向該公共內(nèi)存中寫,另一組進(jìn)程由該公共內(nèi)存中讀,如此便實(shí)現(xiàn)了進(jìn)程之間的信息傳遞。需要解決兩個(gè)問題:為相互通訊的進(jìn)程之間提供公共內(nèi)存;為訪問公共內(nèi)存提供必要的同步機(jī)制。信息傳遞模式(通訊通過兩個(gè)基本的系統(tǒng)調(diào)用命令,即發(fā)送命令和接收命令)直接方式間接方式intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第79頁!間接方式:是指相互通訊的進(jìn)程之間在通訊時(shí)不是直呼對(duì)方名字,而是指明一個(gè)中間媒體,即信箱,進(jìn)程之間通過信箱來實(shí)現(xiàn)相互間的通訊.此時(shí),系統(tǒng)所提供的高級(jí)通訊原語以信箱取代進(jìn)程.發(fā)送和接收原語如下:send(MB,M):將消息M發(fā)送到信箱MB;receive(MB,N):由信箱MB中接收消息至N。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第80頁!死鎖的類型

競爭資源引起的死鎖——由于進(jìn)程爭奪使用系統(tǒng)中有限的資源而引起;進(jìn)程通訊引起的死鎖其它原因引起的死鎖死鎖的條件資源獨(dú)占;不可剝奪;保持申請(qǐng);循環(huán)等待。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第81頁!有序資源分配將每個(gè)資源類按一定原則編號(hào),進(jìn)程對(duì)資源的申請(qǐng)應(yīng)嚴(yán)格按照資源編號(hào)由小到大的次序來進(jìn)行,即,當(dāng)進(jìn)程不占有任何資源時(shí),它可以申請(qǐng)任何資源類ri中的任意多個(gè)資源實(shí)例,但此后它可以申請(qǐng)另外一個(gè)資源類rj中的若干資源實(shí)例的充要條件是:f(ri)<f(rj);(函數(shù)f就是給資源序號(hào)的)若進(jìn)程需要同一資源類中的若干個(gè)資源實(shí)例,這些應(yīng)用有可能分散在進(jìn)程的各個(gè)地方,但它必須在一個(gè)申請(qǐng)命令中同時(shí)發(fā)出請(qǐng)求。使用該預(yù)防死鎖的策略時(shí),資源類的編號(hào)應(yīng)當(dāng)仔細(xì)考慮,為了提高資源的利用率,通常應(yīng)當(dāng)按照大多數(shù)進(jìn)程使用資源的次序來給資源類編號(hào),即先使用的或經(jīng)常使用的排在前面,后使用的或不經(jīng)常使用的排在后面。

intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第82頁!多核程序設(shè)計(jì)

第四章Windows多線程編程及調(diào)優(yōu)intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第83頁!使用win32線程APIWin32函數(shù)庫中提供了操作多線程的函數(shù),包括創(chuàng)建線程、管理線程、終止線程、線程同步等接口。線程必須從一個(gè)指定的函數(shù)開始執(zhí)行,該函數(shù)稱為“線程函數(shù)”。函數(shù)原型:DWORDWINAPIThreadFunc(LPVOIDlpvThreadParm);intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第84頁!使用win32線程APILPSECURITY_ATTRIBUTESlpThreadAttributes,指向LPSECURITY_ATTRIBUTES結(jié)構(gòu)的指針,該結(jié)構(gòu)制訂了線程的安全屬性,默認(rèn)值NULLSIZE_TdwStackSize,棧大小一般設(shè)置為0LPTHREAD_START_ROUTINElpStartAddress,新線程開始執(zhí)行時(shí),線程函數(shù)的入口地址。必須是將要被新線程執(zhí)行的函數(shù)地址,不能為NULLintel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第85頁!示例#include"stdafx.h"#include<windows.h>#include<iostream>usingnamespacestd;DWORDWINAPIFunOne(LPVOIDparam){ while(1){ Sleep(1000); cout<<"ThisisFunOne"<<endl; }return1;}DWORDWINAPIFunTwo(LPVOIDparam){ while(1){ Sleep(1000); cout<<"ThisisFunTwo"<<endl; }return1;}intmain(intargc,char*argv[]){ DWORDlp1=0,lp2=0; HANDLEhand1=CreateThread(NULL,0,FunOne,NULL,CREATE_SUSPENDED,&LP1);HANDLEhand1=CreateThread(NULL,0,FunOne,NULL,CREATE_SUSPENDED,&LP1);system(“pause"); ResumeThread(hand1); ResumeThread(hand2);system(“pause"); return0;}intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第86頁!示例#include"stdafx.h"#include<windows.h>#include<process.h>#include<iostream>#include<fstream>usingnamespacestd;voidThreadFunc1(PVOIDparam){ while(1){ Sleep(1000); cout<<"ThisisThreadFunc1"<<endl; }}voidThreadFunc2(PVOIDparam){ while(1){ Sleep(1000); cout<<"ThisisThreadFunc2"<<endl; }}intmain(){ inti=0; _beginthread(ThreadFunc1,0,NULL); _beginthread(ThreadFunc2,0,NULL); Sleep(3000); cout<<"end"<<endl; return0;}intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第87頁!線程管理線程的掛起與恢復(fù)進(jìn)程中的每個(gè)線程都有掛起計(jì)數(shù)器(suspendcount)。當(dāng)掛起計(jì)數(shù)器值為0時(shí),線程被執(zhí)行;當(dāng)掛起計(jì)數(shù)器值大于0時(shí),調(diào)度器不去調(diào)度該線程。不能夠直接訪問現(xiàn)成的掛起計(jì)數(shù)器,可以通過調(diào)用API函數(shù)來改變它的值,兩個(gè)函數(shù):DWORDSuspendThread(HANDLEhThread):掛起操作,如果函數(shù)執(zhí)行成功,線程中止執(zhí)行,調(diào)用一次,線程掛起計(jì)數(shù)器值增1;DWORDResumeThread(HANDLEhThread):用于結(jié)束線程的掛起狀態(tài)操作,每次調(diào)用該函數(shù),線程掛起計(jì)數(shù)器值減1,若掛起計(jì)數(shù)器值為0,則不會(huì)再減。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第88頁!Win32多線程的實(shí)現(xiàn)下面這個(gè)程序首先創(chuàng)建兩個(gè)線程,當(dāng)輸入為1時(shí),執(zhí)行線程,否則掛起線程。#include<windows.h>#include<iostream>usingnamespacestd;

DWORDWINAPIFunOne(LPVOIDparam){while(true){Sleep(1000);cout<<"hello!";}return0;}DWORDWINAPIFunTwo(LPVOIDparam){while(true){Sleep(1000);cout<<"world!";}return0;}intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第89頁!線程執(zhí)行和資源存取線程之間通信的兩個(gè)基本問題是互斥和同步線程同步是指線程之間所具有的一種制約關(guān)系,一個(gè)線程的執(zhí)行依賴另一個(gè)線程的消息,當(dāng)它沒有得到另一個(gè)線程的消息時(shí)應(yīng)該等待,直到消息到達(dá)時(shí)才被喚醒。線程互斥是指對(duì)于共享資源,在各線程訪問時(shí)的排它性。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第90頁!Win32線程同步的實(shí)現(xiàn)全局變量進(jìn)程中的所有線程均可以訪問所有的全局變量,因而全局變量成為Win32多線程通信的最簡單方式。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第91頁!Win32線程同步的實(shí)現(xiàn)事件設(shè)置分類:手動(dòng)設(shè)置:這種對(duì)象只能用程序來手動(dòng)設(shè)置,在需要該事件或者事件發(fā)生時(shí),采用SetEvent及ResetEvent來進(jìn)行設(shè)置。SetEvent只有一個(gè)參數(shù),該參數(shù)指定了時(shí)間對(duì)象的句柄值,若事件成功激發(fā),返回TRUE;ResetEvent函數(shù)將事件對(duì)象恢復(fù)到最初的非激發(fā)狀態(tài),只有一個(gè)參數(shù),成功后返回真。自動(dòng)恢復(fù):一旦事件發(fā)生并被處理后,將自動(dòng)恢復(fù)到?jīng)]有事件狀態(tài),因此不需要再次設(shè)置。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第92頁!Win32線程同步的實(shí)現(xiàn)臨界區(qū)一種防止多個(gè)線程同時(shí)執(zhí)行一個(gè)特定代碼段的機(jī)制,適用于多個(gè)線程操作之間沒有先后順序但要求互斥的同步。多個(gè)線程訪問同一個(gè)臨界區(qū)的原則:一次最多只能一個(gè)線程停留在臨界區(qū)內(nèi)

不能讓一個(gè)線程無限地停留在臨界區(qū)內(nèi),否則其他線程將不能進(jìn)入該臨界區(qū)intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第93頁!intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第94頁!Win32線程同步的實(shí)現(xiàn)互斥量創(chuàng)建函數(shù):HANDLECreateMutex(LPSECURITY_ATTRIBUTESlpMutexAttributes,BOOLbInitialOwner,LPCTSTRlpName);相關(guān)的API操作CreateMutex創(chuàng)建一個(gè)互斥量,返回對(duì)象句柄OpenMutex打開并返回一個(gè)已存在的互斥對(duì)象句柄,使之后續(xù)訪問。ReleaseMutex釋放對(duì)互斥量的占用,使之成為可用。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第95頁!Win32線程同步的實(shí)現(xiàn)信號(hào)量信號(hào)量是一個(gè)核心對(duì)象,擁有一個(gè)計(jì)數(shù)器,可用來管理大量有限的系統(tǒng)資源。當(dāng)計(jì)數(shù)值大于零時(shí),信號(hào)量為有信號(hào)狀態(tài);當(dāng)計(jì)數(shù)值為零時(shí),信號(hào)量處于無信號(hào)狀態(tài)。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第96頁!信號(hào)量釋放信號(hào)量

BOOLReleaseSemaphore(HANDLEhSemaphore,LONGlReleaseCount,LPLONGlpPreviousCount);打開信號(hào)量

HANDLEOpenSemaphore(DWORDdwDesiredAccess,

BOOLbInheritHandle,

LPCTSTRlpName);Win32線程同步的實(shí)現(xiàn)intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第97頁!MFC線程同步的實(shí)現(xiàn)MFC通過全局函數(shù)AfxBeginThread()來創(chuàng)建一個(gè)CWinThread對(duì)象。CWinThread::CreateThread()函數(shù)用來啟動(dòng)新的線程MFC同步類CCriticalSection

只允許當(dāng)前進(jìn)程中的一個(gè)線程訪問某個(gè)對(duì)象的同步類CMutes

只允許系統(tǒng)中一個(gè)進(jìn)程內(nèi)的一個(gè)線程訪問某個(gè)對(duì)象的同步類CSymaphore

只允許一到某個(gè)指定數(shù)目個(gè)線程同時(shí)訪問某個(gè)對(duì)象的同步類CEvent

當(dāng)某個(gè)事件發(fā)生時(shí)通知一個(gè)應(yīng)用程序的同步類intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第98頁!intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第99頁!.NETframework提供了很多的類和數(shù)據(jù)類型來控制對(duì)共享資源的訪問。Monitor類WaitHandle類Mutex類AutoResetEvent類InterLocked類.NET框架下線程同步的實(shí)現(xiàn)intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第100頁!intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第101頁!POSIX線程庫Pthreads介紹IEEEPOSIX標(biāo)準(zhǔn)

p1003.1c(Pthreads)定義了處理線程的一系列C語言類型的API。在Linux中,線程一般被認(rèn)為是“輕量級(jí)的進(jìn)程”。Linux創(chuàng)建進(jìn)程所使用的函數(shù)是fork()或者vfork()。而對(duì)線程的創(chuàng)建和管理Linux可以使用POSIX的線程庫pthreads提供的APIs。使用fork()創(chuàng)建進(jìn)程和使用POSIX線程庫差別:使用fork()創(chuàng)建進(jìn)程的特點(diǎn):代價(jià)昂貴,通常子進(jìn)程需要拷貝父進(jìn)程的整個(gè)上下文,比如數(shù)據(jù)等。進(jìn)程間的通信方式比較復(fù)雜,比如使用管道、消息、共享內(nèi)存等方法。操作系統(tǒng)在實(shí)現(xiàn)進(jìn)程間的切換比線程切換更費(fèi)時(shí)。使用POSIXpthreads庫創(chuàng)建線程的特點(diǎn):線程可使用存在于進(jìn)程中的資源,因此創(chuàng)建進(jìn)程比創(chuàng)建線程更快。線程間的通信方式更容易,比如通過進(jìn)程中的變量,可以讓多個(gè)線程共享數(shù)據(jù)。操作系統(tǒng)對(duì)線程的切換比對(duì)進(jìn)程的切換更容易和快速。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第102頁!POSIXpthreads庫(續(xù))等待線程結(jié)束pthread_join()函數(shù)會(huì)掛起創(chuàng)建線程的線程的執(zhí)行,直到等待到想要等待的子線程。intpthread_join(pthread_tth,void**thread_return);線程的分離主線程創(chuàng)建子線程,且子線程本身自己有自我回收內(nèi)存資源的能力。intpthread_detach(pthread_tth);獲得當(dāng)前線程標(biāo)志使用pthread_self()函數(shù)可以獲得當(dāng)前線程的標(biāo)志,pthread_self()的返回值就是當(dāng)前線程的標(biāo)志。pthread_tpthread_self(void);intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第103頁!使用Pthreads編寫的程序例子(續(xù))intmain(intargc,char*argv[]){inti;intret_val;int*retval_hello[2];

pthread_tpt[THREAD_NUMBER];

constchar*arg[THREAD_NUMBER];arg[0]="helloworldfromthread1";arg[1]="helloworldfromthread2";printf("Begintocreatethreads...\n");

ret_val=pthread_create(&pt[0],NULL,hello1,(void*)arg[0]);if(ret_val!=0){printf("pthread_createerror!\n");exit(1);

intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第104頁!線程的屬性屬性名意義detachstate選擇被創(chuàng)建的線程是處于可加入的狀態(tài)還是分離狀態(tài)。可加入狀態(tài)值是PTHREAD_CREATE_JOINABLE;分離狀態(tài)值是PTHREAD_CREATE_DETACHED。缺省狀態(tài)值是PTHREAD_CREATE_JOINABLE。pthread_attr_setdetachstate()可設(shè)置線程為加入或者分離狀態(tài);pthread_attr_getdetachstate()可以獲得當(dāng)前線程是否是加入的或者是分離的狀態(tài)。

schedpolicy為被創(chuàng)建的線程選擇調(diào)度策略。被創(chuàng)建的線程的狀態(tài)可以是SCHED_OTHER(一般的,非實(shí)時(shí)調(diào)度)、SCHED_RR(實(shí)時(shí),輪轉(zhuǎn)調(diào)度)或者SCHED_FIFO(實(shí)時(shí),先進(jìn)先出調(diào)度)。缺省值是SCHED_OTHER。實(shí)時(shí)調(diào)度SCHED_RR和

SCHED_FIFO只能用于有超級(jí)用戶權(quán)限的進(jìn)程使用。

pthread_attr_setschedpolicy()和

pthread_attr_getschedpolicy()函數(shù)可以設(shè)置和獲得線程的調(diào)度屬性。schedparam為被創(chuàng)建的線程選擇調(diào)度參數(shù)。這里的調(diào)度參數(shù)指的是線程的調(diào)度優(yōu)先級(jí)。缺省優(yōu)先級(jí)是0。這個(gè)屬性對(duì)于SCHED_OTHER是不重要的;它只對(duì)SCHED_RR和SCHED_FIFO兩個(gè)和實(shí)時(shí)調(diào)度相關(guān)的調(diào)度方式有效。pthread_attr_setschedparam()和pthread_attr_getschedparam()兩個(gè)函數(shù)可以分別對(duì)線程的優(yōu)先級(jí)進(jìn)行設(shè)置和獲取。inheritsched選擇對(duì)新創(chuàng)建的線程的調(diào)度策略和調(diào)度參數(shù)是否被schedpolicy和schedparam屬性決定(這時(shí)的值是PTHREAD_EXPLICIT_SCHED)或者是通過父線程繼承而得到的(這時(shí)的值是PTHREAD_INHERIT_SCHED)。缺省的值是PTHREAD_EXPLICIT_SCHED。scope為選擇被創(chuàng)建的線程調(diào)度競爭范圍。缺省值是PTHREAD_SCOPE_SYSTEM,表示線程和系統(tǒng)的所有的其他運(yùn)行在CPU上的進(jìn)程爭奪CPU資源。如果是PTHREAD_SCOPE_PROCESS,表示調(diào)度的競爭只發(fā)生在運(yùn)行于同一進(jìn)程空間的線程之間,線程的優(yōu)先級(jí)只在同一進(jìn)程空間的線程之間有效,和其他進(jìn)程無關(guān)。intel公司內(nèi)部教材多核多線程技術(shù)共363頁,您現(xiàn)在瀏覽的是第105頁!線程互斥和同步——條件變量條件標(biāo)量是線程的同步設(shè)備。在線程間使用條件變量可以使得一個(gè)線程在執(zhí)行過程中,因滿足某個(gè)條件而發(fā)出信號(hào)通知另一個(gè)線程;而另一個(gè)線程可以處于掛起狀態(tài),等待某個(gè)條件的滿足后,才繼續(xù)執(zhí)行。條件變量必須和mutex一起使用來避免競爭情況。pthread_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論