多核程序設(shè)計(jì)之三_第1頁(yè)
多核程序設(shè)計(jì)之三_第2頁(yè)
多核程序設(shè)計(jì)之三_第3頁(yè)
多核程序設(shè)計(jì)之三_第4頁(yè)
多核程序設(shè)計(jì)之三_第5頁(yè)
已閱讀5頁(yè),還剩67頁(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、1多核程序設(shè)計(jì)吉林大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院包鐵郵箱:2第三章 多線程支持0 進(jìn)程1 多線程的概念2 用戶級(jí)線程和內(nèi)核級(jí)線程3 多線程的映射模型4 線程的生命周期5 線程的同步3多線程技術(shù)運(yùn)用恰當(dāng),多線程技術(shù)就能使硬件資源得到更加充分的利用,提高計(jì)算性能;反之,降低計(jì)算性能,導(dǎo)致應(yīng)用程序發(fā)生一些不可預(yù)測(cè)的行為,甚至出現(xiàn)難以解決的故障。只要正確理解線程的運(yùn)行方式,就可以避免這些可能出現(xiàn)的問題,達(dá)到充分發(fā)揮多線程技術(shù)的優(yōu)勢(shì)、提高計(jì)算性能的目的。 40 進(jìn)程定義:進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于一個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)。可表示成四元組(P, C, D, S),其中P是程序代碼,C是進(jìn)程的控制狀態(tài),D

2、是進(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)等。5狀態(tài)間轉(zhuǎn)換狀態(tài)間轉(zhuǎn)換當(dāng)一個(gè)就緒進(jìn)程獲得處理機(jī)時(shí), 其狀態(tài)由就緒變?yōu)檫\(yùn)行;當(dāng)一個(gè)運(yùn)行進(jìn)程被剝奪處理機(jī)時(shí), 其狀態(tài)由運(yùn)行變?yōu)榫途w;當(dāng)一個(gè)運(yùn)行進(jìn)程因某事件受阻時(shí), 如所申請(qǐng)資源被占用, 啟動(dòng)I/O傳輸未完成, 其狀態(tài)由運(yùn)行變?yōu)榈却? 當(dāng)所

3、等待事件發(fā)生時(shí), 如得到申請(qǐng)資源, I/O傳輸完成, 其狀態(tài)由等待變?yōu)榫途w. 6進(jìn)程控制塊進(jìn)程控制塊(Process Control Block,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)場(chǎng)信息家族聯(lián)系程序地址當(dāng)前打開文件消息隊(duì)列指針資源使用情況進(jìn)程隊(duì)列指針7進(jìn)程的組成進(jìn)程的組成 進(jìn)程控制塊:由于進(jìn)程控制塊中包含程序的地址信息,通過它可以找到程序在內(nèi)存或外存的存放地址,也就找到了整個(gè)進(jìn)程. PCB存于系統(tǒng)空間,只有操作系統(tǒng)能夠?qū)ζ浯嫒?,用戶程序不能訪問. 實(shí)際上用戶甚至感覺不到PCB的存在;程序:進(jìn)程的“軀體”,其中包括代碼和數(shù)

4、據(jù)兩個(gè)部分. 現(xiàn)代操作系統(tǒng)都支持程序共享的功能,這就要求代碼是“純”的,即在運(yùn)行期間不修改自身。數(shù)據(jù)一般包括靜態(tài)變量、動(dòng)態(tài)堆和動(dòng)態(tài)棧。8進(jìn)程的表示PCB程序PCB代碼數(shù)據(jù)+堆棧系統(tǒng)空間用戶空間(a)(b)9進(jìn)程的隊(duì)列進(jìn)程的隊(duì)列:為實(shí)現(xiàn)對(duì)進(jìn)程的管理,系統(tǒng)需要按照某種策略將進(jìn)程排成若干隊(duì)列,由于PCB是進(jìn)程的代表,因而進(jìn)程隊(duì)列實(shí)際上是由進(jìn)程PCB構(gòu)成的隊(duì)列. 因?yàn)樵撽?duì)列通常由鏈的形式實(shí)現(xiàn)的,所以也稱PCB鏈 。系統(tǒng)中的進(jìn)程隊(duì)列分為如下三類:就緒隊(duì)列 、等待隊(duì)列、運(yùn)行隊(duì)列。10進(jìn)程的隊(duì)列就緒隊(duì)列整個(gè)系統(tǒng)一個(gè). 所有處于就緒狀態(tài)的進(jìn)程按照某種組織方式排在這一隊(duì)列中.等待隊(duì)列每個(gè)等待事件一個(gè),當(dāng)進(jìn)程等待

5、某一事件時(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)行指示字.11進(jìn)程的類型進(jìn)程的類型系統(tǒng)進(jìn)程 運(yùn)行操作系統(tǒng)程序,完成操作系統(tǒng)的某些功能;用戶進(jìn)程運(yùn)行用戶程序,直接為用戶服務(wù)。特性:并發(fā)性:與其它進(jìn)程一道在宏觀上同時(shí)向前推進(jìn) ;動(dòng)態(tài)性:進(jìn)程是執(zhí)行中的程序. 此外進(jìn)程的動(dòng)態(tài)性還體現(xiàn)在如下兩個(gè)方面:首先,進(jìn)程是動(dòng)態(tài)產(chǎn)生、動(dòng)態(tài)消亡的;其次,在進(jìn)程的生存期內(nèi),其狀態(tài)處于經(jīng)常性的動(dòng)態(tài)變化之中 ;獨(dú)立性:進(jìn)程是調(diào)度的

6、基本單位,它可以獲得處理機(jī)并參與并發(fā)執(zhí)行 ;交互性:進(jìn)程在運(yùn)行過程中可能會(huì)與其它進(jìn)程發(fā)生直接或間接的相互作用 ;異步性:每個(gè)進(jìn)程都以其相對(duì)獨(dú)立、不可預(yù)知的速度向前推進(jìn) ;結(jié)構(gòu)性:每個(gè)進(jìn)程有一個(gè)控制塊PCB 。 12進(jìn)程間相互聯(lián)系與相互作用多道系統(tǒng)中同時(shí)運(yùn)行的并發(fā)進(jìn)程一般有多個(gè),在邏輯上,這些進(jìn)程之間可能存在某種聯(lián)系,也可能相對(duì)獨(dú)立 相關(guān)進(jìn)程:在邏輯上具有某種聯(lián)系的進(jìn)程稱作相關(guān)進(jìn)程;無關(guān)進(jìn)程:在邏輯上沒有任何聯(lián)系的進(jìn)程稱作無關(guān)進(jìn)程;并發(fā)進(jìn)程之間存在相互制約的關(guān)系,這種相互制約的關(guān)系稱作進(jìn)程間的相互作用. 進(jìn)程間相互作用的方式有兩種:即直接相互作用和間接相互作用直接相互作用:進(jìn)程之間不需要通過中間

7、媒介而發(fā)生的相互作用,這種相互作用通常是有意識(shí)的;間接相互作用:進(jìn)程之間需要通過某種中間媒介而發(fā)生的相互作用,這種相互作用通常是無意識(shí)的。13進(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)行善后處理 。141 多線程的概念線程(thread

8、)進(jìn)程上下文中執(zhí)行的代碼序列輕量級(jí)進(jìn)程(light weight process)在支持多線程的系統(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)和棧15進(jìn)程與線程進(jìn)程和線程的區(qū)別:進(jìn)程 - 是指程序在一個(gè)數(shù)據(jù)集合上運(yùn)行的過程,是系統(tǒng)進(jìn)行資源分配和調(diào)度運(yùn)行的一個(gè)獨(dú)立單位,有時(shí)也稱為活動(dòng)、路徑或任務(wù)。 如果說在操作系統(tǒng)中引入進(jìn)程的目的,是為了使多個(gè)程序并發(fā)執(zhí)行,以改善資源利用率及提高系統(tǒng)的吞吐量;那么,在操作系統(tǒng)中再引

9、入線程則是為了減少程序并發(fā)執(zhí)行時(shí)所付出的時(shí)空開銷,使操作系統(tǒng)具有更好的并發(fā)性。進(jìn)程是資源的分配單位 。線程 是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)調(diào)度和分配的基本單元。每個(gè)程序至少包含一個(gè)線程,那就是主線程。線程自己只擁有很少的系統(tǒng)資源(如程序計(jì)數(shù)器、一組寄存器和棧),但它可與同屬一個(gè)進(jìn)程的其他線程共享所屬進(jìn)程所擁有的全部資源,同一進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行,從而更好地改善了系統(tǒng)資源的利用率。線程是CPU的調(diào)度單位 。16進(jìn)程與線程 線程是“進(jìn)程中的一條執(zhí)行路徑或線索”或“進(jìn)程中的一個(gè)可調(diào)度實(shí)體”。17線程應(yīng)用特點(diǎn)可以獲得快速的用戶響應(yīng)如在C/S模式下,web server為每個(gè)用戶連接運(yùn)行一個(gè)線

10、程;RPC服務(wù)器中,RPC服務(wù)進(jìn)程會(huì)開啟多個(gè)線程服務(wù)于每個(gè)RPC request進(jìn)程是擁有資源的基本單位(CPU,地址空間,I/O資源),進(jìn)程中的線程可以共享這些資源一些應(yīng)用程序可以分成若干相對(duì)獨(dú)立的部分,每一部分用一個(gè)線程來實(shí)現(xiàn)線程間通信無需內(nèi)核干預(yù),需要進(jìn)行線程間同步18多線程的優(yōu)點(diǎn)傳統(tǒng)優(yōu)點(diǎn):創(chuàng)建一個(gè)線程比創(chuàng)建一個(gè)進(jìn)程的代價(jià)要小終止一個(gè)線程比終止一個(gè)進(jìn)程的代價(jià)要小線程的切換比進(jìn)程間的切換代價(jià)小 如 solaris中創(chuàng)建線程比進(jìn)程快30倍,線程切換比進(jìn)程切換快5倍多核充分利用多處理器 數(shù)據(jù)共享 數(shù)據(jù)共享使得線程之間的通信比進(jìn)程間的通信更高效 快速響應(yīng)特性 在系統(tǒng)繁忙的情況下,進(jìn)程通過獨(dú)立的線

11、程及時(shí)響應(yīng)用戶輸入19調(diào)度調(diào)度在傳統(tǒng)的操作系統(tǒng)中,CPU調(diào)度和分派的基本單位是進(jìn)程。而在引入線程的操作系統(tǒng)中,則把線程作為CPU調(diào)度和分派的基本單位,進(jìn)程則作為資源擁有的基本單位,從而使傳統(tǒng)進(jìn)程的兩個(gè)屬性分開,線程便能輕裝運(yùn)行,這樣可以顯著地提高系統(tǒng)的并發(fā)性。同一進(jìn)程中線程的切換不會(huì)引起進(jìn)程切換,從而避免了昂貴的系統(tǒng)調(diào)用。但是在由一個(gè)進(jìn)程中的線程切換到另一進(jìn)程中的線程時(shí),依然會(huì)引起進(jìn)程切換。20并發(fā)性并發(fā)性 在引入線程的操作系統(tǒng)中,不僅進(jìn)程之間可以并發(fā)執(zhí)行,而且在一個(gè)進(jìn)程中的多個(gè)線程之間也可以并發(fā)執(zhí)行,因而使操作系統(tǒng)具有更好的并發(fā)性,從而能更有效地使用系統(tǒng)資源和提高系統(tǒng)的吞吐量。例如,在一個(gè)未

12、引入線程的單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)?shù)谝粋€(gè)線程等待時(shí),文件服務(wù)進(jìn)程中的第二個(gè)線程可以繼續(xù)運(yùn)行;當(dāng)?shù)诙€(gè)線程封鎖時(shí),第三個(gè)線程可以繼續(xù)執(zhí)行,從而顯著地提高了文件服務(wù)的質(zhì)量以及系統(tǒng)的吞吐量。21系統(tǒng)開銷系統(tǒng)開銷 不論是引入了線程的操作系統(tǒng),還是傳統(tǒng)的操作系統(tǒng),進(jìn)程都是擁有系統(tǒng)資源的一個(gè)獨(dú)立單位,它可以擁有自己的資源。一般地說,線程自己不擁有系統(tǒng)資源(也有一點(diǎn)必不可少的資源), 但它可以訪問其所屬進(jìn)程的資源。亦即一個(gè)進(jìn)程的代碼段、數(shù)據(jù)段以及系統(tǒng)資源(

13、如已打開的文件、I/O設(shè)備等),可供同一進(jìn)程的其他所有線程共享。22資源管理?yè)碛匈Y源 由于在創(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)也變得比較容易。在有的系統(tǒng)中,線程的切換、同步和通信都無需操作系

14、統(tǒng)內(nèi)核的干預(yù)。23線程結(jié)構(gòu)24線程控制塊線程控制塊(Thread Control Block,TCB) :線程控制塊是標(biāo)志線程存在的數(shù)據(jù)結(jié)構(gòu),其中包含系統(tǒng)對(duì)于線程進(jìn)行管理所需要的全部信息 。25多線程程序設(shè)計(jì)多核處理器的基本結(jié)構(gòu)是共享存儲(chǔ)的,多線程程序設(shè)計(jì)技術(shù)被認(rèn)為是能夠充分挖掘共享存儲(chǔ)系統(tǒng)性能潛力的最有效的技術(shù)。多線程機(jī)制的優(yōu)點(diǎn)包括以下幾個(gè)方面:創(chuàng)建一個(gè)線程比創(chuàng)建一個(gè)進(jìn)程代價(jià)要小 ;線程之間的切換比進(jìn)程間的切換代價(jià)小 ;充分利用多處理器 ;數(shù)據(jù)共享 ;快速響應(yīng)特性 ;多線程編程可以使程序更加更加模塊化,簡(jiǎn)化程序邏輯 。26多線程機(jī)制應(yīng)用場(chǎng)景-在多處理器系統(tǒng)上,如果一個(gè)應(yīng)用具有如下特征,就可以

15、利用多線程技術(shù)達(dá)到目標(biāo): 前臺(tái)后臺(tái)操作; 異步處理; 需要加速執(zhí)行; 模塊化程序結(jié)構(gòu)。 27線程的應(yīng)用許多任務(wù)在邏輯上涉及多個(gè)控制流,控制流具有內(nèi)在的并發(fā)性,當(dāng)其中一些控制流被阻塞時(shí),另外一些控制流仍可繼續(xù). 在沒有線程支持的條件下,只能采用單進(jìn)程或多進(jìn)程模式,單進(jìn)程不能表達(dá)多控制流,多進(jìn)程開銷大而且在無共享存儲(chǔ)空間的條件下進(jìn)程間交往困難. 采用多線程一方面可以提高應(yīng)用程序的并行性,另一方面也使程序設(shè)計(jì)簡(jiǎn)潔明晰。例如:Word文字編輯工具、Web服務(wù)器等。282 用戶級(jí)線程和內(nèi)核級(jí)線程用戶級(jí)線程(用戶空間實(shí)現(xiàn))有關(guān)線程的所有管理工作都由在用戶級(jí)實(shí)現(xiàn)的線程庫(kù)來支持 用戶級(jí)線程特征用戶級(jí)線程的創(chuàng)建

16、和管理等操作無須內(nèi)核參與,操作更快 并行性不高,一個(gè)線程被系統(tǒng)阻塞后,整個(gè)進(jìn)程被阻塞29用戶級(jí)線程用戶級(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)的線程庫(kù)來支持。用戶級(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)行 。30內(nèi)核級(jí)線程內(nèi)核級(jí)線程內(nèi)核級(jí)線程的所有管理操作都是由操作系統(tǒng)內(nèi)核完成的 特點(diǎn)并行性高,多個(gè)線程可被同時(shí)調(diào)度充分利用多處理器創(chuàng)建和管理代價(jià)

17、高 31內(nèi)核級(jí)線程核心級(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)開銷比較大. 323 多線程的映射模型對(duì)于實(shí)現(xiàn)了用戶級(jí)線程和內(nèi)核級(jí)線程的操作系統(tǒng),用戶級(jí)線程和內(nèi)核級(jí)線程之間的可以有不同的映射方式:多對(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ì)一模型。33多線程的映射模型多對(duì)一模型34一對(duì)一模型一對(duì)一模型把每個(gè)用戶級(jí)線程

18、映射到一個(gè)內(nèi)核級(jí)線程(純核心級(jí)線程) 。當(dāng)一個(gè)線程阻塞時(shí),其他線程仍然可以運(yùn)行。內(nèi)核資源會(huì)限制系統(tǒng)中線程的數(shù)目。例如:Windows 95/98/NT/2000,OS/235多對(duì)多模型多對(duì)多模型將m個(gè)用戶級(jí)線程映射到n個(gè)內(nèi)核級(jí)線程,mn。用戶可以創(chuàng)建所需要的用戶級(jí)線程,通過分配適當(dāng)數(shù)目的內(nèi)核級(jí)線程獲得并發(fā)執(zhí)行的優(yōu)勢(shì)并節(jié)省系統(tǒng)資源。例如:Solaris 2 36線程池多線程問題重復(fù)創(chuàng)建和銷毀線程,如:網(wǎng)絡(luò)服務(wù)器大量的創(chuàng)建線程可能會(huì)耗盡系統(tǒng)資源解決方式:線程池一組被創(chuàng)建的線程的集合,需要線程時(shí)從池中取出,使用結(jié)束后歸還線程池。線程池中的線程數(shù)目可以依據(jù)系統(tǒng)的內(nèi)存、處理器數(shù)目、待處理的任務(wù)數(shù)目來確定

19、,或者動(dòng)態(tài)地依據(jù)系統(tǒng)當(dāng)前資源和系統(tǒng)負(fù)載進(jìn)行調(diào)整。374 線程的生命周期線程的標(biāo)識(shí)通常用一個(gè)整數(shù)來標(biāo)識(shí)一個(gè)線程 線程的創(chuàng)建自動(dòng)創(chuàng)建從main函數(shù)開始的主線程調(diào)用pthread函數(shù)庫(kù)接口創(chuàng)建一個(gè)新的線程(pthread_create) 線程的終止執(zhí)行完畢,或者調(diào)用了pthread_exit 主線程退出導(dǎo)致整個(gè)進(jìn)程會(huì)終止 38線程的狀態(tài)線程的狀態(tài)就緒(ready):線程等待可用的處理器。運(yùn)行(running):線程正在被執(zhí)行。阻塞(blocked):線程正在等待某個(gè)事件的發(fā)生(比如I/O的完成,試圖加鎖一個(gè)被上鎖的互斥量)。終止(terminated):線程從起始函數(shù)中返回或者調(diào)用pthread_e

20、xit。39線程狀態(tài)的轉(zhuǎn)換40多線程環(huán)境下的進(jìn)程控制語(yǔ)義單線程環(huán)境下的進(jìn)程控制接口在多線程環(huán)境下語(yǔ)義可能會(huì)發(fā)生變化,包括進(jìn)程創(chuàng)建、進(jìn)程終止、進(jìn)程執(zhí)行、信號(hào)處理等操作。 進(jìn)程創(chuàng)建創(chuàng)建進(jìn)程的系統(tǒng)調(diào)用完成后,被創(chuàng)建的新進(jìn)程復(fù)制調(diào)用進(jìn)程的內(nèi)容,當(dāng)進(jìn)程的一個(gè)線程中創(chuàng)建一個(gè)子進(jìn)程,新的進(jìn)程可以復(fù)制整個(gè)進(jìn)程(包括所有線程)也可以只復(fù)制調(diào)用線程的內(nèi)容;執(zhí)行新的程序 在進(jìn)程中執(zhí)行新的程序,函數(shù)的語(yǔ)義在多線程環(huán)境下沒有發(fā)生大的變化。Exec將會(huì)終止所有的線程,用新的程序覆蓋進(jìn)程的地址空間,并開始執(zhí)行新的程序;41多線程環(huán)境下的進(jìn)程控制語(yǔ)義進(jìn)程結(jié)束 在任何一個(gè)線程中調(diào)用exit將會(huì)結(jié)束整個(gè)進(jìn)程,另外從主線程返回也等

21、同于調(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)。 425 線程的同步由于線程共享同一進(jìn)程的內(nèi)存空間,多個(gè)線程可能需要同時(shí)訪問同一個(gè)數(shù)據(jù)。對(duì)共享數(shù)據(jù)的并發(fā)訪問可能導(dǎo)致數(shù)據(jù)的不一致性如果沒有正確的保護(hù)措施,對(duì)共享數(shù)據(jù)的訪問會(huì)造成數(shù)據(jù)的不一致和錯(cuò)誤。競(jìng)爭(zhēng)條件若干進(jìn)程并發(fā)地訪問并且操縱共享數(shù)據(jù)的情況。共享數(shù)據(jù)的值取決于哪個(gè)進(jìn)程最后完成防止競(jìng)爭(zhēng)條件,并發(fā)進(jìn)

22、程必須被同步43線程Producer:counter+register1=counter;register1=register1+1;counter=register1;線程Consumer:counter-register2=counter;register2=register2-1;counter=register2;假定counter的原始值是5,則可能的執(zhí)行結(jié)果: Producer: register1=counter register1=5 Producer: register1=register1+1 register1=6 Consumer: register2=counter

23、register1=5 Consumer: register2=register2-1 register1=4 Producer: counter=register1 counter=6 Consumer: counter=register2 counter=444順序程序順序程序,程序的順序性包括內(nèi)部順序性和外部順序性。內(nèi)部順序性:對(duì)于一個(gè)進(jìn)程來說, 它的所有指令是按序執(zhí)行的;外部順序性, 對(duì)于多個(gè)進(jìn)程來說, 所有進(jìn)程是依次執(zhí)行的。P1活動(dòng): a1 a2 a3 a4,P2活動(dòng): b1 b2 b3 b4 順序執(zhí)行時(shí), 有如下兩種情形: 情形1: a1 a2 a3 a4 b1 b2 b3 b4

24、情形2: b1 b2 b3 b4 a1 a2 a3 a4 45順序程序順序程序的特性:順序性:處理機(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é)果. 46并發(fā)程序程序的并發(fā)性含義: 內(nèi)部并發(fā)性, 對(duì)于一個(gè)進(jìn)程來說, 它的所有指令可能按序執(zhí)行,也可能不按次序執(zhí)行; 外部并發(fā)性: 對(duì)于多個(gè)進(jìn)程來說, 所有進(jìn)程是交叉(interleave)執(zhí)行的.

25、例如, 對(duì)于上面P1和P2兩個(gè)進(jìn)程來說, 只考慮外部并發(fā)性,具有許多情形 :情形1: a1 b1 b2 a2 a3 b3 a4 b4 情形2: b1 b2 a1 a2 a3 b3 b4 a4 并發(fā)進(jìn)程在其執(zhí)行過程中, 出現(xiàn)哪種交叉情形是不可預(yù)知的, 這就是并發(fā)程序帶來的不確定性 47并發(fā)程序并發(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)不同的交叉,因而不能期望重新

26、運(yùn)行的程序能夠再現(xiàn)上次運(yùn)行的結(jié)果 48例:一個(gè)圖書館管理系統(tǒng), 連有兩個(gè)終端, 用戶可通過終端借書. 為簡(jiǎn)化問題, 假設(shè)所有用戶借閱的圖書是相同的. 設(shè)x代表圖書的剩余數(shù)量, 為兩個(gè)終端用戶服務(wù)的程序 49常用的同步機(jī)制互斥量(mutex)臨界區(qū)(critical section)信號(hào)量(simphore)管程(monitor)50進(jìn)程互斥定義:兩個(gè)或兩個(gè)以上的進(jìn)程,不能同時(shí)進(jìn)入關(guān)于同一組共享變量的臨界區(qū)域, 否則可能發(fā)生與時(shí)間有關(guān)的錯(cuò)誤, 這種現(xiàn)象被稱作進(jìn)程互斥。進(jìn)程互斥是進(jìn)程之間所發(fā)生的一種間接性相互作用, 這種相互作用是進(jìn)程本身不希望的,也是運(yùn)行進(jìn)程感覺不到的。進(jìn)程互斥可能發(fā)生在相關(guān)進(jìn)程

27、之間,也可能發(fā)生在不相關(guān)進(jìn)程之間. 51互斥量(mutex) Pthread線程庫(kù)對(duì)一個(gè)互斥量的加鎖操作是:int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t *mutex); pthread_mutex_unlock(pthread_mutex_t *mutex);/釋放producer對(duì)counter變量的操作要先加鎖互斥量,完成對(duì)counter的操作之后釋放互斥量 pthread_mutex_lock(&counter_mutex); counter+; pth

28、read_mutex_unlock(&counter_mutex); 52臨界區(qū)有些變量, 兩個(gè)進(jìn)程或兩個(gè)以上的進(jìn)程均需要訪問它們, 這些變量被稱作共享變量, 也稱公共變量,訪問共享變量的程序段稱作臨界區(qū)域(critical region), 也稱為臨界段(critical section) 定義:多個(gè)進(jìn)程均需要訪問的變量稱為公共變量(shared variable) ;定義:訪問共享變量的程序段稱作臨界區(qū)域(critical region), 也稱為臨界段(critical section) 共享變量可能屬于操作系統(tǒng)空間,也可能屬于用戶進(jìn)程空間. 對(duì)于前者, 其臨界區(qū)域亦屬于操作系統(tǒng)空間,而

29、對(duì)于后者, 其臨界區(qū)域則屬于用戶進(jìn)程空間. 53臨界區(qū)所有n 個(gè)進(jìn)程競(jìng)爭(zhēng)使用一些共享的數(shù)據(jù)。每個(gè)進(jìn)程有一個(gè)代碼段(臨界區(qū)), 在那里共享數(shù)據(jù)被訪問。保證當(dāng)一個(gè)進(jìn)程正在臨界區(qū)執(zhí)行時(shí),沒有另外的進(jìn)程進(jìn)入臨界區(qū)執(zhí)行解決臨界區(qū)問題需滿足互斥:假定進(jìn)程Pi在其臨界區(qū)內(nèi)執(zhí)行,其他任何進(jìn)程將被排斥在自己的臨界區(qū)之外.有空讓進(jìn):臨界區(qū)雖沒有進(jìn)程執(zhí)行,但有些進(jìn)程需要進(jìn)入臨界區(qū),不能無限期地延長(zhǎng)下一個(gè)要進(jìn)入臨界區(qū)進(jìn)程的等待時(shí)間.有限等待。在一個(gè)進(jìn)程提出進(jìn)入臨界區(qū)的請(qǐng)求和該請(qǐng)求得到答復(fù)的時(shí)間內(nèi),其他進(jìn)程進(jìn)入臨界區(qū)前的等待時(shí)間必須是有限的.假定每個(gè)進(jìn)程都以非零的的速率執(zhí)行. 沒有任何關(guān)于這n個(gè)進(jìn)程相對(duì)執(zhí)行速率的假定5

30、4一個(gè)典型進(jìn)程 Pi 的結(jié)構(gòu) process Pi (other process Pj) do entry section 進(jìn)入?yún)^(qū)critical section 臨界區(qū) exit section 退出區(qū)reminder section 剩余區(qū) while (1);進(jìn)程為了同步彼此間的行為會(huì)共享一些變量。55臨界區(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ū)域. 當(dāng)然, 如果容許, 則有可能發(fā)生錯(cuò)誤, 亦有可能不發(fā)生錯(cuò)誤, 這與各個(gè)進(jìn)程

31、并發(fā)執(zhí)行時(shí)的推進(jìn)速度有關(guān).這是保證正確性的要求, 但這件事的實(shí)現(xiàn)應(yīng)當(dāng)由操作系統(tǒng)以及并發(fā)程序的設(shè)計(jì)者在編寫程序時(shí)來保證, 而這需要有必要的互斥機(jī)制. 56臨界區(qū)臨界區(qū)域可以嵌套 57具體實(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)展性原則:當(dāng)臨界區(qū)空閑時(shí),競(jìng)爭(zhēng)進(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í), 一

32、個(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)入.58解釋: 使用臨界區(qū)的原則每次只允許一個(gè)進(jìn)程處于它的臨界區(qū)(CS)中若有多個(gè)進(jìn)程同時(shí)想進(jìn)入CS,應(yīng)在有限時(shí)間內(nèi)讓其中一個(gè)進(jìn)程進(jìn)入CS,以免阻塞進(jìn)程在CS內(nèi)只能逗留有限時(shí)間不應(yīng)使要進(jìn)入CS的進(jìn)程無限期地等待在CS之外在CS之外的進(jìn)程不可以阻止其他進(jìn)程進(jìn)入CS不要預(yù)期和假定進(jìn)程進(jìn)展的相對(duì)速度以及可用的處理器數(shù)目,因?yàn)檫@是不可預(yù)期的

33、。59信號(hào)量Semaphores信號(hào)量被定義為一個(gè)整數(shù)變量,用兩個(gè)原子的操作wait和signal來操作信號(hào)量wait:當(dāng)執(zhí)行wait時(shí),如果信號(hào)量的值大于0,wait操作把信號(hào)量的值減1并返回;如果當(dāng)前信號(hào)量的值為非正數(shù)則wait會(huì)等待。signalsignal操作對(duì)信號(hào)量的值加1,并喚醒哪些等待的進(jìn)程 60 僅能通過兩個(gè)不可分割的原子操作訪問wait (S): ( P-操作 )while S 0 ; /do no-opS-;signal (S): ( V-操作)S+;61Multual-exclusion with semaphoresShared data: semaphore mute

34、x; /initially mutex = 1Process Pi: do wait(mutex); critical section signal(mutex); remainder section while (1); 62條件變量要等待某個(gè)條件成立(如xy),當(dāng)其他線程改變了共享變量的值時(shí),線程應(yīng)重新測(cè)試該條件 改變共享變量值的線程,給阻塞在條件變量上的線程發(fā)信號(hào),喚醒該線程。典型的條件變量測(cè)試x=y的方法如下(mut為互斥量):1 pthread_mutex_lock(&mut);2 while(x=y)3 pthread_cond_wait(&cond, &mut);45 pthread_mutex_unlock(&mut);63鎖的粒度鎖的粒度鎖的粒度是上鎖后保護(hù)的共享數(shù)據(jù)的多少,當(dāng)一個(gè)線程加鎖并訪問這些數(shù)據(jù)期間,其它線程無法訪問。減小鎖的粒度可以提高對(duì)共享數(shù)據(jù)訪問的并行性,可以更加充分利用并行處理能力。例如:對(duì)樹的訪問64鎖的粒度65鎖的粒度和死鎖死鎖兩個(gè)線程分別擁有鎖,并等待對(duì)方的鎖死鎖避免線程以相同的次序進(jìn)行加鎖 非阻塞的加鎖操作 餓死饑餓 無限期地阻塞進(jìn)程可能永遠(yuǎn)無法從它等待的信號(hào)量隊(duì)列中移去當(dāng)?shù)却龝r(shí)間給進(jìn)程推進(jìn)和響應(yīng)帶來明顯影響當(dāng)饑餓到一定程度的進(jìn)程所賦予的任務(wù)即使完成也不再具有實(shí)際意義時(shí)稱

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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)論