在早期的操作系統(tǒng)都是以進(jìn)程為獨(dú)立運(yùn)行的基本單位,直到后面,計(jì)算機(jī)科學(xué)家們提出了更小的能獨(dú)立運(yùn)行的基本單位:線程
?
為什么使用線程?
舉個(gè)例子,假設(shè)要編寫一個(gè)視頻播放軟件,那么軟件功能的核心模塊有三個(gè):
- 從視頻文件中讀取數(shù)據(jù)
- 對(duì)讀取的數(shù)據(jù)進(jìn)行解壓縮
- 把壓縮后的視頻數(shù)據(jù)播放出來(lái)
對(duì)于單進(jìn)程的實(shí)現(xiàn)方式:
?對(duì)于單進(jìn)程的這種方式,存在以下問題:
- 播放出來(lái)的畫面和聲音會(huì)不連貫,因?yàn)楫?dāng)CPU能力不夠強(qiáng)的時(shí)候, Read 的時(shí)候可能進(jìn)程就等在這了,這樣就會(huì)導(dǎo)致等半天才進(jìn)行數(shù)據(jù)解壓和播放
- 各個(gè)函數(shù)之間不是并發(fā)執(zhí)行,影響資源的使用效率
那改成多進(jìn)程的方式:
?對(duì)于多進(jìn)程的這種方式,依然會(huì)存在問題:
- 進(jìn)程之間如何通信,共享數(shù)據(jù)?
- 維護(hù)進(jìn)程的系統(tǒng)開銷較大,如創(chuàng)建進(jìn)程時(shí),分配資源、建立PCB;終止進(jìn)程時(shí),回收資源、撤銷PCB;進(jìn)程切換時(shí),保存當(dāng)前進(jìn)程的狀態(tài)信息;
那到底如何解決呢?需要有一種新的實(shí)體,滿足以下特性:
- 實(shí)體之間可以并發(fā)運(yùn)行
- 實(shí)體之間共享相同的地址空間
這個(gè)新的實(shí)體,就是線程(Thread),線程之間可以并發(fā)運(yùn)行且共享相同的地址空間。
什么是線程?
線程是進(jìn)程當(dāng)中的一條執(zhí)行流程。
同一個(gè)進(jìn)程內(nèi)多個(gè)線程之間可以共享代碼段、數(shù)據(jù)段、打開的文件等資源,但每個(gè)線程各自都有一套獨(dú)立的寄存器和棧,這樣可以確保線程的控制流是相對(duì)獨(dú)立的。
?線程的優(yōu)缺點(diǎn)?
線程的優(yōu)點(diǎn):
- 一個(gè)進(jìn)程中可以同時(shí)存在多個(gè)線程
- 各個(gè)線程之間可以并發(fā)執(zhí)行
- 各個(gè)線程之間可以共享地址空間和文件等資源
線程的缺點(diǎn):
- 當(dāng)進(jìn)程中的一個(gè)線程崩潰時(shí),會(huì)導(dǎo)致其所屬進(jìn)程的所有線程崩潰(這里針對(duì)C/C++語(yǔ)言)。
舉個(gè)例子,對(duì)于游戲的用戶設(shè)計(jì),則不應(yīng)該使用多線程的方式,否則一個(gè)用戶掛了,會(huì)影響其他同個(gè)進(jìn)程的線程。
線程和進(jìn)程的比較
線程和進(jìn)程的比較:
- 進(jìn)程是資源(包括內(nèi)存、打開的文件等)分配的單位,線程是CPU調(diào)度的單位
- 進(jìn)程擁有一個(gè)完整的資源平臺(tái),而線程只獨(dú)享必不可少的資源,如寄存器和棧
- 線程同樣具有就緒、阻塞、執(zhí)行三種基本狀態(tài),同樣具有狀態(tài)之間的轉(zhuǎn)換關(guān)系
- 線程能減少并發(fā)執(zhí)行的時(shí)間和空間開銷
對(duì)于線程相比進(jìn)程能減少開銷,體現(xiàn)在:
- 線程的創(chuàng)建時(shí)間比進(jìn)程快,因?yàn)檫M(jìn)程在創(chuàng)建的過(guò)程中還需要資源管理信息,比如內(nèi)存管理信息、文件管理信息,而線程在創(chuàng)建的過(guò)程中,不會(huì)設(shè)計(jì)這些資源管理信息,而是共享它們
- 線程的終止時(shí)間比進(jìn)程快,因?yàn)榫€程釋放的資源相比進(jìn)程要小很多
- 同一個(gè)進(jìn)程內(nèi)的線程切換比進(jìn)程切換快,因?yàn)榫€程具有相同的地址空間(虛擬內(nèi)存空間),這意味著同一個(gè)進(jìn)程的線程都具有同一個(gè)頁(yè)表,那么在切換的時(shí)候就不需要切換頁(yè)表。而對(duì)于進(jìn)程之間的切換,切換的時(shí)候要把頁(yè)表給切換掉,而頁(yè)表的切換過(guò)程開銷是比較大的
- 由于同一進(jìn)程的各線程間共享內(nèi)存和文件資源,那么在線程之間數(shù)據(jù)傳遞的時(shí)候,就不需要經(jīng)過(guò)內(nèi)核了,這就使得線程之間的數(shù)據(jù)交互效率更高了
所以不管是時(shí)間效率還是空間效率,線程都比進(jìn)程高。
線程的上下文切換
在前面我們知道了進(jìn)程與線程最大的區(qū)別在于:線程是調(diào)度的基本單位,而進(jìn)程則是資源擁有的基本單位
所謂操作系統(tǒng)的任務(wù)調(diào)度,實(shí)際上的調(diào)度對(duì)象是線程,而進(jìn)程只是給線程提供了虛擬內(nèi)存、全局變量等資源。
對(duì)于線程和進(jìn)程,可以理解為:
- 當(dāng)進(jìn)程只有一個(gè)線程時(shí),可以認(rèn)為進(jìn)程就等于線程
- 當(dāng)進(jìn)程擁有多個(gè)線程時(shí),這些線程會(huì)共享相同的虛擬內(nèi)存和全局變量等資源,這些資源在上下文切換時(shí)是不需要修改的
另外,線程也有自己的私有數(shù)據(jù),比如棧和寄存器等,這些在上下文切換的時(shí)候也是需要保存的。
線程上下文切換的是什么?
這還得看線程是不是屬于同一個(gè)進(jìn)程:
- 當(dāng)兩個(gè)線程不是屬于同一個(gè)進(jìn)程,則切換的過(guò)程就跟進(jìn)程上下文切換一樣
- 當(dāng)兩個(gè)線程屬于同一個(gè)進(jìn)程,因?yàn)樘摂M內(nèi)存是共享的,所以在切換時(shí),虛擬內(nèi)存這些資源就保持不動(dòng),只需要切換線程的私有數(shù)據(jù)、寄存器等不共享的數(shù)據(jù)
所以,線程的上下文切換要比進(jìn)程開銷小很多。
線程的實(shí)現(xiàn)
主要有三種線程的實(shí)現(xiàn)方式:
- 用戶線程:在用戶空間實(shí)現(xiàn)的線程,不是由內(nèi)核管理的線程,是由應(yīng)用層面的線程庫(kù)來(lái)完成線程的管理,對(duì)于用戶線程的存在,內(nèi)核無(wú)法感知。
- 內(nèi)核線程:在內(nèi)核中實(shí)現(xiàn)的線程,是由內(nèi)核管理的線程
- 輕量級(jí)進(jìn)程:在內(nèi)核中來(lái)支持用戶的線程
用戶線程和內(nèi)核線程的對(duì)應(yīng)關(guān)系
首先,第一種關(guān)系是多對(duì)一的關(guān)系,也就是多個(gè)用戶線程對(duì)應(yīng)同一個(gè)內(nèi)核線程:
?第二種是一對(duì)一的關(guān)系,也就是一個(gè)用戶線程對(duì)應(yīng)一個(gè)內(nèi)核線程:
?第三種是多對(duì)多的關(guān)系,也就是多個(gè)用戶線程對(duì)應(yīng)到多個(gè)內(nèi)核線程:
?用戶線程如何理解?存在什么優(yōu)勢(shì)和缺陷?
用戶線程是基于用戶態(tài)的線程管理庫(kù)來(lái)實(shí)現(xiàn)的,那么線程控制塊(Thread Control Block, TCB)也是在庫(kù)里面來(lái)實(shí)現(xiàn)的,對(duì)于操作系統(tǒng)而言是看不到這個(gè)TCB的,內(nèi)核無(wú)法感知用戶級(jí)線程的存在,它只能看到整個(gè)進(jìn)程的PCB?。
所以,用戶線程的整個(gè)線程管理和調(diào)度,操作系統(tǒng)是不直接參與的,而是由用戶級(jí)線程庫(kù)函數(shù)來(lái)完成線程的管理,包括線程的創(chuàng)建、終止、同步和調(diào)度等。
用戶級(jí)線程的模型,也就類似前面提到的多對(duì)一的關(guān)系,即多個(gè)用戶線程對(duì)應(yīng)同一個(gè)內(nèi)核線程,如下圖所示:
?用戶線程的優(yōu)點(diǎn):
- 每個(gè)進(jìn)程都需要有它私有的線程控制塊(TCB)列表,用來(lái)跟蹤記錄它各個(gè)線程狀態(tài)信息(PC、棧指針、寄存器),TCB由用戶級(jí)線程庫(kù)函數(shù)來(lái)維護(hù),可用于不支持線程技術(shù)的操作系統(tǒng);
- 用戶線程的切換也是由線程庫(kù)函數(shù)完成的,無(wú)需用戶態(tài)和內(nèi)核態(tài)的切換,所以速度特別快;
用戶線程的缺點(diǎn):
- 由于操作系統(tǒng)不參與線程的調(diào)度,如果一個(gè)線程發(fā)起了系統(tǒng)調(diào)用而阻塞,那進(jìn)程所包含的用戶線程都不能執(zhí)行了,無(wú)法做到真正意義上的并發(fā)
- 當(dāng)一個(gè)線程開始運(yùn)行后,除非它主動(dòng)交出CPU的使用權(quán),否則它所在的進(jìn)程當(dāng)中的其他線程無(wú)法運(yùn)行,因?yàn)橛脩魬B(tài)的線程沒法打斷當(dāng)前運(yùn)行中的線程,它沒有這個(gè)特權(quán),只有操作系統(tǒng)才有,但是用戶線程不是由操作系統(tǒng)管理的
- 內(nèi)核資源的分配是根據(jù)進(jìn)程分配的,用戶級(jí)線程所在的進(jìn)程可以競(jìng)爭(zhēng)系統(tǒng)的資源,而每個(gè)用戶線程只能競(jìng)爭(zhēng)該進(jìn)程內(nèi)部的資源。對(duì)于一個(gè)進(jìn)程,可能有成千上萬(wàn)個(gè)用戶級(jí)線程,但是它們對(duì)系統(tǒng)的資源沒有影響。
內(nèi)核線程如何理解?存在什么優(yōu)勢(shì)和缺陷?
內(nèi)核線程是由操作系統(tǒng)管理的,線程對(duì)應(yīng)的TCB自然放在操作系統(tǒng)里,這樣線程的創(chuàng)建、終止和管理都是操作系統(tǒng)負(fù)責(zé)。
- 內(nèi)核級(jí)線程可以在全系統(tǒng)內(nèi)進(jìn)行資源的競(jìng)爭(zhēng)
- 內(nèi)核空間內(nèi)為每一個(gè)內(nèi)核支持線程設(shè)置了一個(gè)線程控制塊(TCB),內(nèi)核根據(jù)該控制塊,感知線程的存在,并進(jìn)行控制。
內(nèi)核線程的模型,也就是類似前面提到的一對(duì)一的關(guān)系,即一個(gè)用戶線程對(duì)應(yīng)一個(gè)內(nèi)核線程,如下圖所示:
內(nèi)核線程的優(yōu)點(diǎn):
- 在一個(gè)進(jìn)程當(dāng)中,如果某個(gè)內(nèi)核線程發(fā)起系統(tǒng)調(diào)用而被阻塞,并不會(huì)影響其他內(nèi)核線程的運(yùn)行
- 分配給線程,多線程的進(jìn)程獲得更多的CPU運(yùn)行時(shí)間
內(nèi)核線程的缺點(diǎn):
- 在支持內(nèi)核線程的操作系統(tǒng)中,由內(nèi)核來(lái)維護(hù)進(jìn)程和線程的上下文信息,如PCB和TCB
- 線程的創(chuàng)建、終止和切換都是通過(guò)系統(tǒng)調(diào)用的方式來(lái)進(jìn)行,因此對(duì)于系統(tǒng)來(lái)說(shuō),系統(tǒng)開銷比較大
?輕量級(jí)進(jìn)程如何理解?
輕量級(jí)進(jìn)程(Light-weight process, LWP)是內(nèi)核支持的用戶線程,一個(gè)進(jìn)程可有一個(gè)或多個(gè)LWP,每個(gè)LWP是跟內(nèi)核線程一對(duì)一映射的,也就是LWP都是由一個(gè)內(nèi)核線程支持的,而且LWP是由內(nèi)核管理并像普通進(jìn)程一樣被調(diào)度。
在大多數(shù)系統(tǒng)中,LWP與普通進(jìn)程的區(qū)別在于它只有一個(gè)最小的執(zhí)行上下文和調(diào)度程序所需的統(tǒng)計(jì)信息。一般來(lái)說(shuō),一個(gè)進(jìn)程代表程序的一個(gè)實(shí)例,而LWP代表程序的執(zhí)行線程,因?yàn)橐粋€(gè)執(zhí)行線程不像進(jìn)程那樣需要那么多的狀態(tài)信息,所以LWP也不帶有這樣的信息。
在LWP之上也是可以使用用戶線程的,那么LWP與用戶線程的對(duì)應(yīng)關(guān)系就有三種:
- ?1 : 1 ,即一個(gè)LWP對(duì)應(yīng)一個(gè)用戶線程
- ?N : 1,即一個(gè)LWP對(duì)應(yīng)多個(gè)用戶線程
- ?M : N,即多個(gè)LWP對(duì)應(yīng)多個(gè)用戶線程
? 1 : 1 模式
一個(gè)線程對(duì)應(yīng)到一個(gè)LWP再對(duì)應(yīng)到一個(gè)內(nèi)核線程,如圖的進(jìn)程 4 ,屬于此模型
- 優(yōu)點(diǎn):實(shí)現(xiàn)并行,當(dāng)一個(gè)LWP阻塞,不會(huì)影響其他LWP
- 缺點(diǎn):每一個(gè)用戶線程,就產(chǎn)生一個(gè)內(nèi)核線程,創(chuàng)建線程的開銷較大。
?N : 1 模式
多個(gè)用戶線程對(duì)應(yīng)一個(gè)LWP再對(duì)應(yīng)一個(gè)內(nèi)核線程,如上圖的進(jìn)程 2 ,線程管理是在用戶空間完成的,此模式中用戶的線程對(duì)操作系統(tǒng)不可見
- 優(yōu)點(diǎn):用戶線程要開幾個(gè)都沒問題,且上下文切換發(fā)生在用戶空間,切換的效率較高
- 缺點(diǎn):一個(gè)用戶線程如果阻塞了,則整個(gè)進(jìn)程都將會(huì)阻塞,另外在多核CPU中,沒辦法充分利用CPU
?M : N 模式
該模式提供了兩級(jí)控制,首先多個(gè)用戶線程對(duì)應(yīng)多個(gè)LWP,LWP再 一一對(duì)應(yīng)到內(nèi)核線程,如上圖的進(jìn)程 3 。
- 優(yōu)點(diǎn):綜合了前兩種的優(yōu)點(diǎn),大部分的線程上下文發(fā)生在用戶空間,且多個(gè)線程又可以充分利用多核CPU資源
組合模式文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-632383.html
如上圖的進(jìn)程 5,此進(jìn)程結(jié)合?1:1
?模型和?M:N
?模型。開發(fā)人員可以針對(duì)不同的應(yīng)用特點(diǎn)調(diào)節(jié)內(nèi)核線程的數(shù)目來(lái)達(dá)到物理并行性和邏輯并行性的最佳方案。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-632383.html
到了這里,關(guān)于(學(xué)習(xí)筆記-進(jìn)程管理)線程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!