版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1第三章 線程的基本概念小節(jié)章節(jié)重點(diǎn)內(nèi)容3.1多線程的概念進(jìn)程?線程?多線程機(jī)制的優(yōu)勢?3.2用戶級線程和內(nèi)核級線程誰來管理多線程?3.3多線程的映射模型用戶級線程 內(nèi)核級線程3.4線程的生命周期創(chuàng)建、終止、狀態(tài)3.5多線程環(huán)境下的進(jìn)程控制語義進(jìn)程創(chuàng)建、終止、執(zhí)行、信號處理3.6線程的同步同步機(jī)制、鎖23.1 多線程的概念Multi ? 許多任務(wù)在邏輯上涉及多個(gè)控制流,控制流具有內(nèi)在的并發(fā)性,當(dāng)其中一些控制流被阻塞時(shí),另外一些控制流仍可繼續(xù). 例如:Word文字編輯工具、Web服務(wù)器等。33.1 多線程的概念Multi process V.S. Multi thread?進(jìn)程 - 是指程序在一
2、個(gè)數(shù)據(jù)集合上運(yùn)行的過程,是系統(tǒng)進(jìn)行資源分配和調(diào)度運(yùn)行的一個(gè)獨(dú)立單位,有時(shí)也稱為活動(dòng)、路徑或任務(wù)。 如果說在操作系統(tǒng)中引入進(jìn)程的目的,是為了在多道程序系統(tǒng)中正確的描述程序并發(fā)的執(zhí)行過程;那么,在操作系統(tǒng)中再引入線程則是為了減少程序并發(fā)執(zhí)行時(shí)所付出的時(shí)空開銷,使操作系統(tǒng)具有更好的并發(fā)性。進(jìn)程是資源的分配單位 。線程 是進(jìn)程中的一個(gè)執(zhí)行流,是處理機(jī)調(diào)度的基本單元。每個(gè)程序至少包含一個(gè)線程,那就是主線程。線程自己只擁有很少的系統(tǒng)資源(如程序計(jì)數(shù)器、一組寄存器和棧),但它可與同屬一個(gè)進(jìn)程的其他線程共享所屬進(jìn)程所擁有的全部資源,同一進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行,從而更好地改善了系統(tǒng)資源的利用率。 43
3、.1 多線程的概念線程(thread)進(jìn)程上下文中執(zhí)行的代碼序列輕量級進(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ù)段,打開的文件,信號等還包含各自的線程ID,線程執(zhí)行狀態(tài),CPU寄存器狀態(tài)和棧進(jìn)程與線程5 線程是“進(jìn)程中的一條執(zhí)行路徑或線索”或“進(jìn)程中的一個(gè)可調(diào)度實(shí)體”。多線程的應(yīng)用特點(diǎn)某些應(yīng)用需要處理幾個(gè)相似或者并行的幾個(gè)任務(wù),創(chuàng)建進(jìn)程需要給每個(gè)進(jìn)程分配資源,用多進(jìn)程來實(shí)現(xiàn)上述工作很不經(jīng)濟(jì),響應(yīng)時(shí)間長。如在C/S模式下,
4、web server為每個(gè)用戶連接運(yùn)行一個(gè)線程;RPC服務(wù)器中,RPC服務(wù)進(jìn)程會(huì)開啟多個(gè)線程服務(wù)于每個(gè)RPC request某些應(yīng)用可以分成若干相對獨(dú)立的部分,每一部分用一個(gè)線程來實(shí)現(xiàn)在多處理器系統(tǒng)上,如果一個(gè)應(yīng)用具有如下特征,就可以利用多線程技術(shù)達(dá)到目標(biāo): 前臺后臺操作; 異步處理; 需要加速執(zhí)行; 模塊化程序結(jié)構(gòu)6多線程的優(yōu)點(diǎn)傳統(tǒng)優(yōu)點(diǎn):創(chuàng)建一個(gè)線程比創(chuàng)建一個(gè)進(jìn)程的代價(jià)要小如 solaris中創(chuàng)建線程比進(jìn)程快30倍,線程的切換比進(jìn)程間的切換代價(jià)小由同一進(jìn)程中的一個(gè)線程切換到另一個(gè)線程只需改變寄存器和棧,包括程序和數(shù)據(jù)在內(nèi)的地址空間不變;如 solaris線程切換比進(jìn)程切換快5倍充分利用多處理
5、器提高了程序執(zhí)行并行度,降低了并行粒度數(shù)據(jù)共享由于同一進(jìn)程中的多個(gè)線程地址空間共享,一個(gè)線程寫到數(shù)據(jù)空間的信息可以直接被該進(jìn)程中的另一線程讀取,方便快捷 快速響應(yīng)特性 多核處理器的基本結(jié)構(gòu)是共享存儲的,多線程程序設(shè)計(jì)技術(shù)被認(rèn)為是能夠充分挖掘共享存儲系統(tǒng)性能潛力的最有效的技術(shù)。7總結(jié):為什么要多線程程序設(shè)計(jì)某些應(yīng)用具有內(nèi)在的多個(gè)控制流結(jié)構(gòu),這些控制流具有合作性質(zhì),需要共享內(nèi)存,采用多線程易于對問題建模,從而得到最自然的解決算法 ;在需要多控制流的應(yīng)用中,多線程比多進(jìn)程在速度上具有絕對優(yōu)勢,統(tǒng)計(jì)測試表明,線程的建立速度比進(jìn)程的建立速度快100倍,進(jìn)程內(nèi)線程間的切換速度與進(jìn)程間切換速度也有數(shù)量級之差
6、; 采用多線程可以提高處理機(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)速度 。3.2 用戶級線程和內(nèi)核級線程用戶級線程(用戶空間實(shí)現(xiàn))有關(guān)線程的所有管理工作都由在用戶級實(shí)現(xiàn)的線程庫來支持 用戶級線程特征用戶級線程的創(chuàng)建和管理等操作無須內(nèi)核參與,操作更快 并行性不高,一個(gè)線程被系統(tǒng)阻塞后,整個(gè)進(jìn)程被阻塞9用戶級線程用戶級別線程優(yōu)點(diǎn):線程不依
7、賴于操作系統(tǒng),不必采用標(biāo)準(zhǔn)的調(diào)度策略,可以采用與問題相關(guān)的調(diào)度策略,靈活性好;同一進(jìn)程中的線程切換不需進(jìn)入操作系統(tǒng),因而實(shí)現(xiàn)效率較高; 有關(guān)線程的所有管理工作都由在用戶級實(shí)現(xiàn)的線程庫來支持。用戶級別線程缺點(diǎn):同一進(jìn)程中的多個(gè)線程不能真正并行;由于線程對操作系統(tǒng)不可見,調(diào)度在進(jìn)程級別,某進(jìn)程中的一個(gè)線程通過系統(tǒng)調(diào)用進(jìn)入操作系統(tǒng)受阻,該進(jìn)程的其它線程也不能運(yùn)行 。10內(nèi)核級線程內(nèi)核級線程內(nèi)核級線程的所有管理操作都是由操作系統(tǒng)內(nèi)核完成的 特點(diǎn)并行性高,多個(gè)線程可被同時(shí)調(diào)度充分利用多處理器創(chuàng)建和管理代價(jià)高 11內(nèi)核級線程核心級別線程的優(yōu)點(diǎn)是并發(fā)性好,在多CPU環(huán)境中同一進(jìn)程中的多個(gè)線程可以真正并行執(zhí)行
8、 核心級別線程的缺點(diǎn)是線程控制和狀態(tài)轉(zhuǎn)換需要進(jìn)入操作系統(tǒng)完成,系統(tǒng)開銷比較大. 12133.3 多線程的映射模型對于實(shí)現(xiàn)了用戶級線程和內(nèi)核級線程的操作系統(tǒng),用戶級線程和內(nèi)核級線程之間的可以有不同的映射方式:143.3多線程的映射模型多對一模型 多對一模型把多個(gè)用戶級線程映射到一個(gè)內(nèi)核級線程。用戶級線程的管理在用戶空間實(shí)現(xiàn),所以效率高。當(dāng)一個(gè)線程因調(diào)用系統(tǒng)調(diào)用被阻塞時(shí),整個(gè)進(jìn)程被阻塞。另外,用戶級線程不能在多處理器上并發(fā)執(zhí)行,不支持內(nèi)核級線程的操作系統(tǒng)使用多對一模型。一對一模型一對一模型把每個(gè)用戶級線程映射到一個(gè)內(nèi)核級線程(純核心級線程) 。當(dāng)一個(gè)線程阻塞時(shí),其他線程仍然可以運(yùn)行。內(nèi)核資源會(huì)限制
9、系統(tǒng)中線程的數(shù)目。例如:Windows 95/98/NT/2000,OS/215多對多模型多對多模型將m個(gè)用戶級線程映射到n個(gè)內(nèi)核級線程,mn。用戶可以創(chuàng)建所需要的用戶級線程,通過分配適當(dāng)數(shù)目的內(nèi)核級線程獲得并發(fā)執(zhí)行的優(yōu)勢并節(jié)省系統(tǒng)資源。例如:Solaris 2 16線程池多線程編程的問題重復(fù)創(chuàng)建和銷毀線程,如:網(wǎng)絡(luò)服務(wù)器,長時(shí)間重復(fù)該過程要耗費(fèi)大量的處理器時(shí)間為每個(gè)請求創(chuàng)建一個(gè)線程,大量的創(chuàng)建線程可能會(huì)耗盡系統(tǒng)資源解決方式:線程池一組被創(chuàng)建的線程的集合,需要線程時(shí)從池中取出,使用結(jié)束后歸還線程池。當(dāng)線程池中沒有可用線程時(shí),創(chuàng)建線程的請求必須等待,保護(hù)系統(tǒng)資源不被耗盡。線程池中的線程數(shù)目可以依
10、據(jù)系統(tǒng)的內(nèi)存、處理器數(shù)目、待處理的任務(wù)數(shù)目來確定,或者動(dòng)態(tài)地依據(jù)系統(tǒng)當(dāng)前資源和系統(tǒng)負(fù)載進(jìn)行調(diào)整。17183.4 線程的生命周期線程的標(biāo)識通常用一個(gè)整數(shù)來標(biāo)識一個(gè)線程在Pthred線程庫中,以pthread_t類型來標(biāo)識一個(gè)線程。 線程的創(chuàng)建(c程序)首先運(yùn)行的是從main函數(shù)開始的主線程或初始線程在pthread函數(shù)庫中調(diào)用pthread_create創(chuàng)建一個(gè)新的線程線程的終止線程的啟動(dòng)函數(shù)執(zhí)行完畢,或者調(diào)用了pthread_exit 導(dǎo)致線程終止主線程退出導(dǎo)致整個(gè)進(jìn)程會(huì)終止 ,主線程一般會(huì)在其它線程退出后再結(jié)束。線程的狀態(tài)線程的狀態(tài)就緒(ready):線程等待可用的處理器。運(yùn)行(runnin
11、g):線程正在被執(zhí)行。阻塞(blocked):線程正在等待某個(gè)事件的發(fā)生(比如I/O的完成,試圖加鎖一個(gè)被上鎖的互斥量)。終止(terminated):線程從起始函數(shù)中返回或者調(diào)用pthread_exit。19線程狀態(tài)的轉(zhuǎn)換203.5多線程環(huán)境下的進(jìn)程控制語義21單線程環(huán)境下的進(jìn)程控制接口在多線程環(huán)境下語義可能會(huì)發(fā)生變化,包括進(jìn)程創(chuàng)建、進(jìn)程終止、進(jìn)程執(zhí)行、信號處理等操作。 進(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ù)的語義在多線程
12、環(huán)境下沒有發(fā)生大的變化。Exec將會(huì)終止所有的線程,用新的程序覆蓋進(jìn)程的地址空間,并開始執(zhí)行新的程序;3.5多線程環(huán)境下的進(jìn)程控制語義22進(jìn)程結(jié)束 在任何一個(gè)線程中調(diào)用exit將會(huì)結(jié)束整個(gè)進(jìn)程,另外從主線程返回也等同于調(diào)用exit而導(dǎo)致進(jìn)程結(jié)束。如果要從線程中退出則調(diào)用專用的線程退出函數(shù)。 信號處理信號是unix中系統(tǒng)通知進(jìn)程的重要機(jī)制。信號可能是同步的也可能是異步的。發(fā)送給進(jìn)程的信號在多線程環(huán)境下有多種選擇:-發(fā)送給引發(fā)信號的線程; -發(fā)送給所有的線程; -發(fā)送給特定的線程; -指定一個(gè)線程處理所有的信號。 如何遞送一個(gè)信號取決于信號的類型。 233.6 線程的同步由于線程共享同一進(jìn)程的內(nèi)存
13、空間,多個(gè)線程可能需要同時(shí)訪問同一個(gè)數(shù)據(jù)。對共享數(shù)據(jù)的并發(fā)訪問如果沒有正確的報(bào)數(shù)措施,可能導(dǎo)致數(shù)據(jù)的不一致性和錯(cuò)誤為避免不確定的錯(cuò)誤結(jié)果出現(xiàn),在兩個(gè)線程訪問共享數(shù)據(jù)的時(shí)候需要同步機(jī)制競爭條件若干進(jìn)程并發(fā)地訪問并且操縱共享數(shù)據(jù)的情況。共享數(shù)據(jù)的值取決于哪個(gè)進(jìn)程最后完成防止競爭條件,并發(fā)進(jìn)程必須被同步24線程Producer:counter+register1=counter;register1=register1+1;counter=register1;線程Consumer:counter-register2=counter;register2=register2-1;counter=regis
14、ter2;假定counter的原始值是5,則可能的執(zhí)行結(jié)果: Producer: register1=counter register1=5 Producer: register1=register1+1 register1=6 Consumer: register2=counter register1=5 Consumer: register2=register2-1 register1=4 Producer: counter=register1 counter=6 Consumer: counter=register2 counter=43.5 線程的同步常用的同步機(jī)制臨界區(qū)(critic
15、al section)互斥量(mutex)信號量(simphore)管程(monitor)互斥量互斥量作為一種互斥設(shè)備,有兩個(gè)狀態(tài):上鎖和空閑對于一個(gè)已經(jīng)被加鎖的互斥量,當(dāng)一個(gè)線程試圖對它加鎖時(shí),該線程會(huì)被阻塞,直到該互斥量被釋放?;コ饬吭赑thread線程庫中被定義為pthread_mutex_t類型。26互斥量(mutex) Pthread線程庫對一個(gè)互斥量的加鎖操作是:int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t *mutex); producer對cou
16、nter變量的操作要先加鎖互斥量,完成對counter的操作之后釋放互斥量 pthread_mutex_lock(&counter_mutex); counter+; pthread_mutex_unlock(&counter_mutex); 27互斥量(mutex)這兩個(gè)函數(shù)都可以對一個(gè)互斥量加鎖,如果互斥量當(dāng)前是空閑的則被加鎖,調(diào)用線程持有該互斥量并立即返回。如果該互斥量已經(jīng)被其他線程加鎖,調(diào)用 pthread_mutex_lock的線程被阻塞,直到持有該互斥量的線程釋放互斥量。釋放互斥量:pthread_mutex_unlock(pthread_mutex_t *mutex)信號量Sem
17、aphores信號量被定義為一個(gè)整型變量,用兩個(gè)原子的操作wait和signal來操作信號量wait:當(dāng)執(zhí)行wait時(shí),如果信號量的值大于0,wait操作把信號量的值減1并返回;如果當(dāng)前信號量的值為非正數(shù)則執(zhí)行wait操作的線程會(huì)等待。signalsignal操作對信號量的值加1,并喚醒哪些等待的進(jìn)程 29Multual-exclusion with semaphoresShared data: semaphore mutex; /initially mutex = 1Process Pi: do wait(mutex); critical section signal(mutex); rem
18、ainder section while (1); 30信號量與互斥量對于初始值為1的信號量,成對的wait和signal操作與互斥量的加鎖、解鎖的功能相似,可以實(shí)現(xiàn)多個(gè)線程對共享數(shù)據(jù)的安全訪問。和互斥量相比,信號量更加靈活,當(dāng)信號量的初值大于1時(shí),允許多個(gè)線程通過wait操作;信號量的值可以代表某類資源的數(shù)目,創(chuàng)建資源的線程調(diào)用signal,消耗資源的線程調(diào)用wait。32條件變量要等待某個(gè)條件成立(如xy),當(dāng)其他線程改變了共享變量的值時(shí),線程應(yīng)重新測試該條件 條件變量提供了阻塞線程和喚醒其他線程的方法改變共享變量值的線程,給阻塞在條件變量上的線程發(fā)信號,喚醒該線程。條件變量的用法是先測試謂詞,若不成立則調(diào)用pthread_cond_wait阻塞在該條件變量上。Pthread定義的條件變量類型為pthread_cond_t,在某個(gè)條件變量上等待的操作是:int pthread_cond_wait (pthread_cond_t*cond,pthread_mutex_t*mutex); int pthread_cond_s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025河北省建筑安全員-A證考試題庫附答案
- 2025海南省安全員考試題庫
- 電表內(nèi)阻的測量課件
- 丑小鴨繪本故事
- 《心率失常的護(hù)理》課件
- 《員工健康生活指南》課件
- 山東省濱州市惠民縣2024-2025學(xué)年七年級上學(xué)期1月期末道德與法治試題(含答案)
- 《pos機(jī)的使用方法》課件
- 單位管理制度展示合集員工管理篇
- 船用錨機(jī)絞纜機(jī)課件
- 叉車租賃合同模板
- 住房公積金稽核審計(jì)工作方案例文(4篇)
- 口腔門診醫(yī)療風(fēng)險(xiǎn)規(guī)避
- Unit 2 My Schoolbag ALets talk(說課稿)-2024-2025學(xué)年人教PEP版英語四年級上冊
- 《基于杜邦分析法的公司盈利能力研究的國內(nèi)外文獻(xiàn)綜述》2700字
- 2024年國家公務(wù)員考試《行測》真題(行政執(zhí)法)
- 煙花爆竹安全生產(chǎn)管理人員考試題庫附答案(新)
- 國有企業(yè)外派董監(jiān)事、高管人員管理辦法
- 春聯(lián)課件教學(xué)課件
- 北師大版五年級上冊脫式計(jì)算400道及答案
- 安徽省蕪湖市2023-2024學(xué)年高一上學(xué)期期末考試 地理試題
評論
0/150
提交評論