<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          進(jìn)程、線程與協(xié)程傻傻分不清?一文帶你吃透!

          共 9378字,需瀏覽 19分鐘

           ·

          2021-04-25 10:06

          前言

          歡迎來(lái)到操作系統(tǒng)系列,依然采用圖解 + 大白話的形式來(lái)講解,讓小白也能看懂,幫助大家快速科普入門(mén)

          本篇開(kāi)始介紹進(jìn)程、線程、協(xié)程,相信很多小白們對(duì)這幾個(gè)概念理解的不清晰,這里全部給你們安排的明明白白,我們開(kāi)始進(jìn)入正文吧

          內(nèi)容大綱

          小故事

          小明(操作系統(tǒng))創(chuàng)辦了一家互聯(lián)網(wǎng)小公司,因?yàn)闇?zhǔn)備同時(shí)開(kāi)發(fā)A與B兩個(gè)軟件,所以小明請(qǐng)了兩個(gè)開(kāi)發(fā)團(tuán)隊(duì)來(lái)做這件事情,分別是小王開(kāi)發(fā)團(tuán)隊(duì)與小李開(kāi)發(fā)團(tuán)隊(duì),可是公司特別小,只有一個(gè)房間(C P U),而且房間(C P U)只能容納一個(gè)開(kāi)發(fā)團(tuán)隊(duì),為了能兩個(gè)軟件開(kāi)發(fā)不被耽誤,小明(操作系統(tǒng))決定,上午小王團(tuán)隊(duì)開(kāi)發(fā),下午小李團(tuán)隊(duì)開(kāi)發(fā)(這個(gè)過(guò)程稱為調(diào)度)。

          小李(進(jìn)程)與小王(進(jìn)程)身為團(tuán)隊(duì)負(fù)責(zé)人,他們要操心的事情比較多,需要對(duì)軟件進(jìn)行分析整理,做架構(gòu)設(shè)計(jì),最后再把任務(wù)細(xì)化分配給團(tuán)隊(duì)的每個(gè)開(kāi)發(fā)人員(線程),在團(tuán)隊(duì)交換房間的時(shí)候,還需要把整個(gè)軟件開(kāi)發(fā)進(jìn)度記錄下來(lái),方便下次接著開(kāi)發(fā),相比開(kāi)發(fā)人員就輕松多了,每個(gè)人只負(fù)責(zé)一小塊,需要記錄的也只有一小塊。

          通過(guò)這個(gè)小故事,大伙也看出來(lái)了,一個(gè)進(jìn)程管理著多個(gè)線程,就像團(tuán)隊(duì)負(fù)責(zé)人(進(jìn)程)管理著多個(gè)開(kāi)發(fā)人員(線程)一樣。

          進(jìn)程

          什么是進(jìn)程

          你打開(kāi)網(wǎng)易云音樂(lè)會(huì)產(chǎn)生一個(gè)進(jìn)程 ,你打開(kāi)QQ會(huì)產(chǎn)生一個(gè)進(jìn)程 ,你電腦上運(yùn)行的程序都是進(jìn)程進(jìn)程就是這么簡(jiǎn)單暴力。

          現(xiàn)在我們思考一個(gè)問(wèn)題,有一個(gè)進(jìn)程讀取硬盤(pán)里的文件,這個(gè)文件特別大,需要讀取很長(zhǎng)時(shí)間,如果 C P U 一直傻傻的等硬盤(pán)返回?cái)?shù)據(jù),那 C P U 的利用率是非常低的。

          就像燒開(kāi)水,你會(huì)傻傻等水燒開(kāi)嗎?很明顯,這段時(shí)間完全可以去做其他的事情(比如玩玩賽博朋克2077),水燒開(kāi)了再過(guò)來(lái)把水倒入水杯中,這樣不香嗎?

          C P U 也是一樣,它發(fā)現(xiàn) 進(jìn)程 在讀取硬盤(pán)文件,不需要阻塞等待硬盤(pán)返回?cái)?shù)據(jù),直接去執(zhí)行其他進(jìn)程 ,當(dāng)硬盤(pán)返回?cái)?shù)據(jù)時(shí),C P U 會(huì)收到 中斷 的信號(hào),于是 C P U 再回到之前的 進(jìn)程 繼續(xù)運(yùn)行

          這種多程序 交替執(zhí)行 的方式,就是 C P U 管理多進(jìn)程初步思想。

          可能會(huì)有人問(wèn)了, 交替執(zhí)行會(huì)不會(huì)很慢,這個(gè)不用擔(dān)心,因?yàn)?C P U 的執(zhí)行速度與切換速度非常的快,可能就是幾十或幾百毫秒,超出了人類的感知,一秒鐘內(nèi)可能就交替運(yùn)行了多個(gè)進(jìn)程,所以給我們產(chǎn)生 并行 的錯(cuò)覺(jué),其實(shí)這叫并發(fā)。

          單核 多進(jìn)程交替執(zhí)行 就是并發(fā),多進(jìn)程在多核運(yùn)行就是并行。

          進(jìn)程的控制結(jié)構(gòu)

          創(chuàng)造任何東西的時(shí)候,都要先有形,才有物,你造房子、造汽車(chē)或造其他東西,都要有設(shè)計(jì)圖(結(jié)構(gòu)),再根據(jù)設(shè)計(jì)圖來(lái)創(chuàng)造, 進(jìn)程也不例外,它也有屬于自己的設(shè)計(jì)圖,那就是 進(jìn)程控制塊(process control block,PCB),后面就簡(jiǎn)稱 P C B 好了

          P C B的結(jié)構(gòu)信息

          P C B 進(jìn)程 存在的唯一標(biāo)識(shí),這意味一個(gè) 進(jìn)程 一定會(huì)有對(duì)應(yīng)的PCB,進(jìn)程消失,P C B也會(huì)隨之消失

          • 進(jìn)程描述信息
            • 進(jìn)程唯一的標(biāo)記符,類似唯一id
            • 用戶標(biāo)識(shí)符,進(jìn)程歸屬的用戶,用戶標(biāo)識(shí)符主要為共享和保護(hù)服務(wù)
          • 進(jìn)程控制和管理信息
            • 進(jìn)程當(dāng)前狀態(tài),比如運(yùn)行、就緒、阻塞等,作為處理機(jī)分配調(diào)度的依據(jù)
            • 進(jìn)程優(yōu)先級(jí),描述進(jìn)程搶占處理機(jī)的優(yōu)先級(jí),優(yōu)先級(jí)高的進(jìn)程可以優(yōu)先獲得處理機(jī)
          • 資源分配清單
            • 用于說(shuō)明有關(guān)內(nèi)存地址空間或虛擬地址空間的狀況,所打開(kāi)文件的列表和所使用的輸入/輸出設(shè)備信息
          • CPU 相關(guān)信息
            • C P U 中各寄存器值,當(dāng)進(jìn)程被切換時(shí),C P U狀態(tài)信息都必須保存在相應(yīng)的 P C B 中,以便進(jìn)程重新執(zhí)行時(shí),能再?gòu)臄帱c(diǎn)繼續(xù)執(zhí)行。

          P C B組成的隊(duì)列

          P C B通過(guò)鏈表的方式進(jìn)行組織,把具有相同狀態(tài)的進(jìn)程鏈在一起,組成各種隊(duì)列

          • 將所有處于就緒狀態(tài)的 進(jìn)程 鏈在一起,稱為就緒隊(duì)列

          • 把所有因等待某事件而處于等待狀態(tài)的 進(jìn)程 鏈在一起就組成各種阻塞隊(duì)列

          進(jìn)程的狀態(tài)

          通過(guò)觀察,我們發(fā)現(xiàn)進(jìn)程執(zhí)行的過(guò)程遵循這樣的 運(yùn)行-暫停-運(yùn)行 規(guī)律,雖然看起來(lái)十分簡(jiǎn)單,但是它的背后涉及到了進(jìn)程狀態(tài)的轉(zhuǎn)換

          進(jìn)程三態(tài)

          進(jìn)程的執(zhí)行期間,至少具備三種基本狀態(tài),即運(yùn)行態(tài)、就緒態(tài)、阻塞態(tài)。

          上圖狀態(tài)的意義

          • 運(yùn)行態(tài)(Runing):時(shí)刻進(jìn)程占用 C P U
          • 就緒態(tài)(Ready):可運(yùn)行,但因?yàn)槠渌M(jìn)程正在運(yùn)行而暫停停止
          • 阻塞狀態(tài)(Blocked):該進(jìn)程等待某個(gè)事件(比如IO讀取)停止運(yùn)行,這時(shí),即使給它CPU控制權(quán),它也無(wú)法運(yùn)行

          上圖狀態(tài)轉(zhuǎn)換流程

          1. C P U  調(diào)度緒態(tài)進(jìn)程執(zhí)行,進(jìn)入運(yùn)行狀態(tài),時(shí)間片使用完了,回到就緒態(tài),等待 C P U 調(diào)度
          2. C P U  調(diào)度緒態(tài)進(jìn)程執(zhí)行,進(jìn)入運(yùn)行狀態(tài),執(zhí)行IO請(qǐng)求,進(jìn)入阻塞態(tài),IO請(qǐng)求完成,CPU收到 中斷 信號(hào),進(jìn)入就緒態(tài),等待 C P U 調(diào)度

          進(jìn)程五態(tài)

          在三態(tài)基礎(chǔ)上,做一次細(xì)化,出現(xiàn)了另外兩個(gè)基本狀態(tài),創(chuàng)建態(tài)和結(jié)束態(tài)。

          上圖狀態(tài)的意義

          • 創(chuàng)建態(tài)(new):進(jìn)程正在被創(chuàng)建
          • 就緒態(tài)(Ready):可運(yùn)行,但因?yàn)槠渌M(jìn)程正在運(yùn)行而暫停停止
          • 運(yùn)行態(tài)(Runing):時(shí)刻進(jìn)程占用 C P U
          • 結(jié)束態(tài)(Exit):進(jìn)程正在從系統(tǒng)中消失時(shí)的狀態(tài)
          • 阻塞狀態(tài)(Blocked):該進(jìn)程等待某個(gè)事件(比如IO讀取)停止運(yùn)行,這時(shí),即使給它CPU控制權(quán),它也無(wú)法運(yùn)行

          狀態(tài)的變遷

          • NULL => 創(chuàng)建態(tài)(new):一個(gè)新進(jìn)程被創(chuàng)建時(shí)的第一個(gè)狀態(tài)
          • 創(chuàng)建態(tài)(new) => 就緒態(tài)(Ready):當(dāng)進(jìn)程創(chuàng)建完成,進(jìn)入就緒態(tài)
          • 就緒態(tài)(Ready)=>  運(yùn)行態(tài)(Runing):C P U 從就緒隊(duì)列選擇進(jìn)程執(zhí)行,進(jìn)入運(yùn)行態(tài)
          • 運(yùn)行態(tài)(Runing)=> 結(jié)束態(tài)(Exit):當(dāng)進(jìn)程已經(jīng)運(yùn)行完成或出錯(cuò)時(shí),進(jìn)入結(jié)束狀
          • 運(yùn)行態(tài)(Runing) => 就緒態(tài)(Ready):分配給進(jìn)程的時(shí)間片使用完,進(jìn)入就緒態(tài)
          • 運(yùn)行態(tài)(Runing) => 阻塞狀態(tài)(Blocked):進(jìn)程執(zhí)行等待事件,進(jìn)入阻塞態(tài)
          • 阻塞狀態(tài)(Blocked) => 就緒態(tài)(Ready):進(jìn)程事件完成,C P U 收到 中斷 信號(hào) ,進(jìn)入就緒態(tài)

          進(jìn)程七態(tài)

          其實(shí)進(jìn)程還有一種狀態(tài)叫掛起態(tài),掛起態(tài)代表該進(jìn)程不會(huì)占用內(nèi)存空間,它會(huì)被換出到硬盤(pán)空間保存,當(dāng)需要使用它的時(shí)候,會(huì)被換入,加載到內(nèi)存,掛起態(tài)可以分為下面兩種

          • 阻塞掛起狀態(tài):進(jìn)程在外存(硬盤(pán))并等待某個(gè)事件的出現(xiàn)
          • 就緒掛起狀態(tài):進(jìn)程在外存(硬盤(pán)),但只要進(jìn)入內(nèi)存,即刻立刻運(yùn)行

          結(jié)合上述的兩種掛起態(tài),就組成了進(jìn)程七態(tài)

          從上圖我們發(fā)現(xiàn),創(chuàng)建態(tài)、就緒態(tài)、運(yùn)行態(tài),阻塞掛起態(tài)、阻塞態(tài)都可以轉(zhuǎn)入掛起態(tài),這時(shí)問(wèn)題就產(chǎn)生了,什么情況會(huì)轉(zhuǎn)入 掛起態(tài) ,什么情況又會(huì)從 掛起態(tài) 轉(zhuǎn)入到 非掛起態(tài)(就緒態(tài)與阻塞態(tài)), 操作系統(tǒng)會(huì)根據(jù)當(dāng)前資源狀況和性能要求、進(jìn)程的優(yōu)先級(jí)來(lái)進(jìn)行掛起與激活操作,沒(méi)有固定的說(shuō)法。

          進(jìn)程的上下文切換

          C P U把一個(gè)進(jìn)程切換到另一個(gè)進(jìn)程運(yùn)行的過(guò)程,稱為進(jìn)程上下文切換。

          在說(shuō)進(jìn)程上下文切換之前,先來(lái)聊聊 C P U 上下文切換

          C P U上下文 是指 C P U 寄存器 程序計(jì)數(shù)器

          • C P U 寄存器 C P U 內(nèi)置的容量小,速度極快的緩存
          • 程序計(jì)數(shù)器是用來(lái)存儲(chǔ) 是 C P U 正在執(zhí)行的指令位置或即將執(zhí)行的下一條指令位置

          C P U 上下文切換 就很好理解了,就是把前一個(gè)任務(wù)的 C P U上下文  保存起來(lái),然后在加載當(dāng)前任務(wù)的 C P U上下文,最后再跳轉(zhuǎn)到 程序計(jì)數(shù)器 所指的新位置,運(yùn)行任務(wù)。

          上面說(shuō)到所謂的「任務(wù)」,主要包含進(jìn)程、線程和中斷。所以,可以根據(jù)任務(wù)的不同,把 CPU 上下文切換分成:進(jìn)程上下文切換、線程上下文切換和中斷上下文切換。

          進(jìn)程的上下文是怎么切換的

          首先進(jìn)程是由內(nèi)核管理與調(diào)度的,所以 進(jìn)程上下文切換 發(fā)生在內(nèi)核態(tài),進(jìn)程上下文切換的內(nèi)容包含用戶空間資源(虛擬內(nèi)存、棧、全局變量等)與內(nèi)核空間資源(內(nèi)核堆棧、寄存器等)。

          在做上下文切換的時(shí)候,會(huì)把前一個(gè) 進(jìn)程 的上下文保存到它的 P C B 中,然后加載當(dāng)前 進(jìn)程 P C B 上下文到 C P U 中,使得 進(jìn)程 繼續(xù)執(zhí)行

          發(fā)生進(jìn)程上下文切換的場(chǎng)景

          • 為了保證所有進(jìn)程可以得到公平調(diào)度,CPU 時(shí)間被劃分為一段段的時(shí)間片,這些時(shí)間片再被輪流分配給各個(gè)進(jìn)程。這樣,當(dāng)某個(gè)進(jìn)程的時(shí)間片耗盡了,切換到其它正在等待 CPU 的進(jìn)程運(yùn)行
          • 進(jìn)程在系統(tǒng)資源不足(比如內(nèi)存不足)時(shí),要等到資源滿足后才可以運(yùn)行,這個(gè)時(shí)候進(jìn)程也會(huì)被掛起,并由系統(tǒng)調(diào)度其他進(jìn)程運(yùn)行。
          • 當(dāng)進(jìn)程通過(guò)睡眠函數(shù) sleep 這樣的方法將自己主動(dòng)掛起時(shí),自然也會(huì)重新調(diào)度。
          • 當(dāng)有優(yōu)先級(jí)更高的進(jìn)程運(yùn)行時(shí),為了保證高優(yōu)先級(jí)進(jìn)程的運(yùn)行,當(dāng)前進(jìn)程會(huì)被掛起,由高優(yōu)先級(jí)進(jìn)程來(lái)運(yùn)行
          • 發(fā)生硬件中斷時(shí),CPU 上的進(jìn)程會(huì)被中斷掛起,轉(zhuǎn)而執(zhí)行內(nèi)核中的中斷服務(wù)程序。

          線程

          什么是線程

          在早期操作系統(tǒng)都是以 進(jìn)程 為獨(dú)立運(yùn)行的基本單位,直到后面,計(jì)算機(jī)科學(xué)家又提出了更小的能獨(dú)立運(yùn)行的基本單位,它就是線程

          在現(xiàn)代操作系統(tǒng),進(jìn)程是最小的資源分配單位,線程是最小的運(yùn)行單位,一個(gè)進(jìn)程下面能有一個(gè)或多個(gè)線程,每個(gè)線程都有獨(dú)立一套的寄存器和棧,這樣可以確保線程的控制流是相對(duì)獨(dú)立的。

          線程帶來(lái)的好處有以下幾點(diǎn)

          • 一個(gè)進(jìn)程中可以同時(shí)存在多個(gè)線程
          • 讓進(jìn)程具備多任務(wù)并行處理能力
          • 同進(jìn)程下的各個(gè)線程之間可以共享進(jìn)程資源 (同進(jìn)程內(nèi)的多線程通信十分簡(jiǎn)單高效)
          • 更輕量與高效

          線程帶來(lái)的壞處有以下幾點(diǎn)

          • 因?yàn)檫M(jìn)程資源共享,所以會(huì)產(chǎn)生資源競(jìng)爭(zhēng),需要通過(guò)鎖機(jī)制來(lái)協(xié)同
          • 當(dāng)進(jìn)程中的一個(gè)線程奔潰時(shí),會(huì)導(dǎo)致其所屬進(jìn)程的所有線程奔潰(一般游戲的用戶設(shè)計(jì)不會(huì)采用多線程方式)

          線程與進(jìn)程的對(duì)比

          • 進(jìn)程是最小的資源(包括內(nèi)存、打開(kāi)的文件等)分配單位,線程是最小的運(yùn)行單位
          • 進(jìn)程擁有一個(gè)完整的資源平臺(tái),而線程只獨(dú)享必不可少的資源,如寄存器和棧
          • 線程同樣具有就緒、阻塞、執(zhí)行三種基本狀態(tài),同樣具有狀態(tài)之間的轉(zhuǎn)換關(guān)系(和進(jìn)程大同小異)
          • 線程的創(chuàng)建、終止時(shí)間比進(jìn)程快,因?yàn)檫M(jìn)程在創(chuàng)建的過(guò)程中,還需要資源管理信息,比如內(nèi)存管理信息、文件管理信息,所以線程在創(chuàng)建的過(guò)程中,不會(huì)涉及這些資源管理信息,而是共享它們(線程管理的資源較少)
          • 同一個(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ò)程開(kāi)銷是比較大的
          • 由于同一進(jìn)程的各線程間共享內(nèi)存和文件資源,那么在線程之間數(shù)據(jù)傳遞的時(shí)候,就不需要經(jīng)過(guò)內(nèi)核了,這就使得線程之間的數(shù)據(jù)交互效率更高了

          線程比進(jìn)程不管是時(shí)間效率,還是空間效率都要高

          線程的上下文切換

          當(dāng)進(jìn)程只有一個(gè)線程時(shí),可以認(rèn)為進(jìn)程等于線程,線程上下文的切換分兩種情況

          1. 不同進(jìn)程的線程,切換的過(guò)程就跟進(jìn)程上下文切換一樣
          2. 兩個(gè)線程是屬于同一個(gè)進(jìn)程,因?yàn)樘摂M內(nèi)存是共享的,所以在切換時(shí),虛擬內(nèi)存這些資源就保持不動(dòng),只需要切換線程的私有數(shù)據(jù)、寄存器等不共享的數(shù)據(jù)

          所以線程的上下文切換相比進(jìn)程,開(kāi)銷要小很多

          線程的模型

          在說(shuō)線程模式之前,先介紹3個(gè)概念

          • 內(nèi)核線程:在內(nèi)核空間就實(shí)現(xiàn)的線程,由內(nèi)核管理
          • 用戶線程:在用戶空間實(shí)現(xiàn)的線程,不歸內(nèi)核管理,是由用戶態(tài)通過(guò)線程庫(kù)完成線程的管理(用戶態(tài)是指線程或進(jìn)程在用戶空間運(yùn)行)
          • 輕量級(jí)進(jìn)程:在內(nèi)核中來(lái)支持用戶線程(用戶線程與內(nèi)核線程的中間層,內(nèi)核線程的高度抽象)

          內(nèi)核線程

          因?yàn)閮?nèi)核線程是由內(nèi)核空間管理,所以它的 結(jié)構(gòu)線程控制塊(Thread Control Block, TCB)  在內(nèi)核空間,操作系統(tǒng)對(duì) T C B 是可見(jiàn)的

          內(nèi)核線程

          內(nèi)核線程有什么優(yōu)點(diǎn)

          • 內(nèi)核線程的由內(nèi)核空間管理,線程的創(chuàng)建、銷毀、調(diào)度等,都不用你操心,全自動(dòng)化,屬于智能型
          • 內(nèi)核線程能利用cpu多核的特性,實(shí)現(xiàn)并行執(zhí)行(因?yàn)橛蓛?nèi)核管理,非常智能)
          • 內(nèi)核線程阻塞,不會(huì)影響其他內(nèi)核線程(因?yàn)橛蓛?nèi)核管理,非常智能)

          內(nèi)核線程有什么缺點(diǎn)

          • 因?yàn)槭莾?nèi)核管理,所以內(nèi)核線程的大部分操作都涉及到內(nèi)核態(tài),即需要從用戶態(tài)切換到內(nèi)核態(tài),開(kāi)銷較大
          • 因?yàn)閮?nèi)核資源有限,所以無(wú)法大量創(chuàng)建內(nèi)核線程

          用戶線程

          因?yàn)?span style="color: Blue;"> 用戶線程 在用戶空間,是由 用戶態(tài) 通過(guò)線程庫(kù)來(lái)管理,所以它的 結(jié)構(gòu)線程控制塊(Thread Control Block, TCB) 也是在線程庫(kù)里面,對(duì)于操作系統(tǒng)而言是看不到 T C B 的,它只能看到整個(gè)進(jìn)程的 P C B(內(nèi)核無(wú)法管理用戶線程,也感知不到用戶線程)

          用戶線程有什么優(yōu)點(diǎn)

          • 因?yàn)橛脩艟€程創(chuàng)建、銷毀、調(diào)度等都不走內(nèi)核態(tài),直接在用戶態(tài)進(jìn)行操作,所以速度特別快
          • 不依賴內(nèi)核,可用于不支持線程技術(shù)的操作系統(tǒng)
          • 可以大量創(chuàng)建用戶線程,不消耗內(nèi)核資源

          用戶線程有什么缺點(diǎn)

          • 用戶線程創(chuàng)建、銷毀、調(diào)度等需要自己實(shí)現(xiàn)相應(yīng)線程庫(kù)
          • 用戶線程阻塞會(huì)導(dǎo)致整個(gè)進(jìn)程內(nèi)的其他用戶線程阻塞(整個(gè)進(jìn)程阻塞),因?yàn)閮?nèi)核感知不到用戶線程,所以無(wú)法去調(diào)度其他用戶線程
          • 無(wú)法利用cpu多核特性,還是因?yàn)閮?nèi)核感知不到用戶線程

          輕量級(jí)進(jìn)程(Light-weight process,LWP)

          輕量級(jí)進(jìn)程(Light-weight process,LWP)可以理解成內(nèi)核線程的高級(jí)抽象,一個(gè) 進(jìn)程 可以有一個(gè)或多個(gè)L W P ,因?yàn)槊總€(gè) L W P內(nèi)核線程 一對(duì)一映射,所以 L W P 都是由一個(gè) 內(nèi)核線程 支持(用戶線程關(guān)聯(lián)L W P,即成為內(nèi)核支持的用戶線程)。

          在大多數(shù)系統(tǒng)中,L W P普通進(jìn)程 的區(qū)別也在于它只有一個(gè)最小的執(zhí)行上下文和調(diào)度程序所需的統(tǒng)計(jì)信息。一般來(lái)說(shuō),一個(gè)進(jìn)程 代表程序的一個(gè)實(shí)例,而 L W P 代表程序的執(zhí)行線程,因?yàn)橐粋€(gè) 執(zhí)行線程 不像進(jìn)程那樣需要那么多狀態(tài)信息,所以 L W P 也不帶有這樣的信息。

          一對(duì)一模型(內(nèi)核級(jí)線程模型)

          L W P就是一對(duì)一模型,即 進(jìn)程 只需要?jiǎng)?chuàng)建使用L W P ,因?yàn)橐粋€(gè) L W P 由一個(gè) 內(nèi)核線 程支持,所以最終是內(nèi)核管理線程,可以調(diào)度到其他處理器上(再簡(jiǎn)單點(diǎn)解釋,直接使用內(nèi)核線程

          一對(duì)一模型(1:1)的優(yōu)缺點(diǎn)就不多說(shuō)了,上面介紹內(nèi)核線程的時(shí)候已經(jīng)說(shuō)過(guò)了,但是值得一提的是,jvm采用該模型實(shí)現(xiàn)線程,所以在Java中啟動(dòng)一個(gè)線程需要謹(jǐn)慎

          一對(duì)多模型(用戶級(jí)線程模型)

          一對(duì)多模型,即多個(gè)用 戶級(jí)線程 對(duì)用到同一個(gè) L W P 上實(shí)現(xiàn),因?yàn)槭怯脩魬B(tài)通過(guò)用戶空間的線程庫(kù)對(duì)線程管理,所以速度特別快,不會(huì)涉及到用戶態(tài)與內(nèi)核態(tài)的轉(zhuǎn)換

          一對(duì)多模型(n:1)的優(yōu)點(diǎn)缺點(diǎn)體現(xiàn)在用戶級(jí)線程上面,用戶線程的優(yōu)缺點(diǎn)前面說(shuō)過(guò),這里不做概述,值得一提的是 Python 中的協(xié)程就是通過(guò)該模型實(shí)現(xiàn)。

          多對(duì)多模型(兩級(jí)線程模型)

          多對(duì)多模型是集各家所長(zhǎng)誕生的產(chǎn)物,它充分吸收前兩種線程模型的優(yōu)點(diǎn)且盡量避免它們的缺點(diǎn)。

          首先它區(qū)別于多對(duì)一模型多對(duì)多模型進(jìn)程內(nèi)的 多用戶線程 可以綁定不同的內(nèi)核線程 ,這點(diǎn)與 一對(duì)一模型 類似,其次又區(qū)別于一對(duì)一模型,進(jìn)程內(nèi)的 多用戶線程 與 內(nèi)核線程 不是一對(duì)一綁定,而是動(dòng)態(tài)綁定,當(dāng)某個(gè) 內(nèi)核線程 因綁定的 用戶線程 執(zhí)行阻塞操作,讓出 C P U 時(shí),綁定該 內(nèi)核線程 的其他 用戶線程 可以解綁,重新綁定到其他 內(nèi)核線程 繼續(xù)運(yùn)行。

          所以多對(duì)多模型(m:n),即不是多對(duì)一模型完全靠自己實(shí)現(xiàn)的線程庫(kù)調(diào)度,也不是一對(duì)一模型完全靠操作系統(tǒng)調(diào)度,而是一個(gè)中間態(tài)系統(tǒng)(負(fù)責(zé)自身調(diào)度與操作系統(tǒng)調(diào)度的協(xié)同工作),最后提一句Go語(yǔ)言使用的是多對(duì)多模型,這也是其高并發(fā)的原因,它的線程模型與Java中的ForkJoinPool非常類似。

          多對(duì)多模型優(yōu)點(diǎn)

          • 兼具多對(duì)一模型的輕量
          • 由于對(duì)應(yīng)了多個(gè)內(nèi)核線程,則一個(gè)用戶線程阻塞時(shí),其他用戶線程仍然可以執(zhí)行
          • 由于對(duì)應(yīng)了多個(gè)內(nèi)核線程,則可以實(shí)現(xiàn)較完整的調(diào)度、優(yōu)先級(jí)等;

          多對(duì)多模型缺點(diǎn)

          • 實(shí)現(xiàn)復(fù)雜(因?yàn)檫@種模型的高度復(fù)雜性,操作系統(tǒng)內(nèi)核開(kāi)發(fā)者一般不會(huì)使用,所以更多時(shí)候是作為第三方庫(kù)的形式出現(xiàn))

          調(diào)度

          調(diào)度原則

          CPU 利用率

          • 運(yùn)行程序發(fā)生了I/O 事件的請(qǐng)求,因此阻塞,導(dǎo)致進(jìn)程在等待硬盤(pán)的數(shù)據(jù)返回。這樣的過(guò)程,勢(shì)必會(huì)造成 C P U 突然的空閑。所以為了提高 C P U 利用率,發(fā)生等待事件使 C P U 空閑的情況下,調(diào)度程序需要從就緒隊(duì)列中選擇一個(gè)進(jìn)程來(lái)運(yùn)行。(PS:調(diào)度程序應(yīng)確保 C P U 一直保持匆忙的狀態(tài),可提高 C P U 的利用率)

          系統(tǒng)吞吐量

          • 程序執(zhí)行某個(gè)任務(wù)花費(fèi)的時(shí)間會(huì)比較長(zhǎng),如果這個(gè)程序一直占用著 C P U,會(huì)造成系統(tǒng)吞吐量的降低。所以要提高系統(tǒng)的吞吐率,調(diào)度程序要權(quán)衡長(zhǎng)任務(wù)和短任務(wù)進(jìn)程的運(yùn)行完成數(shù)量。(吞吐量表示的是單位時(shí)間內(nèi) C P U 完成進(jìn)程的數(shù)量,長(zhǎng)作業(yè)的進(jìn)程會(huì)占用較長(zhǎng)的 C P U 資源,因此會(huì)降低吞吐量,相反,短作業(yè)的進(jìn)程會(huì)提升系統(tǒng)吞吐量)

          周轉(zhuǎn)時(shí)間

          • 從進(jìn)程開(kāi)始到結(jié)束的過(guò)程中,實(shí)際上是包含兩個(gè)時(shí)間,分別是進(jìn)程運(yùn)行時(shí)間和進(jìn)程等待時(shí)間,這兩個(gè)時(shí)間總和就稱為周轉(zhuǎn)時(shí)間。進(jìn)程的周轉(zhuǎn)時(shí)間越小越好,如果進(jìn)程的等待時(shí)間很長(zhǎng),而運(yùn)行時(shí)間很短,那周轉(zhuǎn)時(shí)間就很長(zhǎng),調(diào)度程序應(yīng)該避免這種情況發(fā)生。(周轉(zhuǎn)時(shí)間是進(jìn)程運(yùn)行和阻塞時(shí)間總和,一個(gè)進(jìn)程的周轉(zhuǎn)時(shí)間越小越好)

          等待時(shí)間

          • 處于就緒隊(duì)列的進(jìn)程,也不能等太久,希望這個(gè)等待的時(shí)間越短越好,因?yàn)榭梢允惯M(jìn)程更快的在 C P U 中執(zhí)行。所以就緒隊(duì)列中,進(jìn)程的等待時(shí)間,也是調(diào)度程序所需要考慮的原則(這個(gè)等待時(shí)間不是阻塞狀態(tài)的時(shí)間,而是進(jìn)程處于就緒隊(duì)列的時(shí)間,等待時(shí)間越長(zhǎng),用戶越不滿意)。

          響應(yīng)時(shí)間

          • 對(duì)于鼠標(biāo)、鍵盤(pán)這種交互式比較強(qiáng)的應(yīng)用,我們當(dāng)然希望它的響應(yīng)時(shí)間越快越好,否則就會(huì)影響用戶體驗(yàn)了。所以,對(duì)于交互式比較強(qiáng)的應(yīng)用,響應(yīng)時(shí)間也是調(diào)度程序需要考慮的原則( 用戶提交請(qǐng)求到系統(tǒng)第一次產(chǎn)生響應(yīng)所花費(fèi)的時(shí)間,在交互式系統(tǒng)中,響應(yīng)時(shí)間是衡量調(diào)度算法好壞的主要標(biāo)準(zhǔn))。

          總之就是 要快!

          調(diào)度算法

          不同的算法適用不同的場(chǎng)景,下面介紹幾個(gè)單核中常見(jiàn)的調(diào)度算法

          先來(lái)先服務(wù)算法(First Come First Severd, FCFS)

          先來(lái)先服務(wù)算法簡(jiǎn)稱 F C F S,顧名思義,誰(shuí)先來(lái),誰(shuí)先被 C P U 執(zhí)行,后到的就乖乖排隊(duì)等待,十分簡(jiǎn)單的算法,C P U每次調(diào)度 就緒隊(duì)列 的第一個(gè)進(jìn)程,直到進(jìn)程退出或阻塞,才會(huì)把該進(jìn)程入隊(duì)到隊(duì)尾,然后接著繼續(xù)調(diào)度第一個(gè)進(jìn)程,依此類推。

          F C F S算法看似很公平,但是當(dāng)一個(gè)長(zhǎng)作業(yè)先運(yùn)行了,后面的短作業(yè)等待的時(shí)間就會(huì)很長(zhǎng),所以不利于短作業(yè),會(huì)降低系統(tǒng)吞吐量

          F C F S對(duì)長(zhǎng)作業(yè)有利,適用于 C P U 繁忙型作業(yè)的系統(tǒng),而不適用于 I/O 繁忙型作業(yè)的系統(tǒng)。

          最短作業(yè)優(yōu)先算法(Shortest Job First, SJF)

          同樣也是顧名思義,它會(huì)優(yōu)先選擇運(yùn)行時(shí)間最短的進(jìn)程,有助于提高系統(tǒng)吞吐量。但是對(duì)長(zhǎng)作業(yè)不利,所以很容易造成一種極端現(xiàn)象。比如,一個(gè) 長(zhǎng)作業(yè) 在就緒隊(duì)列等待運(yùn)行,而這個(gè)就緒隊(duì)列有非常多的短作業(yè),最終使得 長(zhǎng)作業(yè) 不斷的往后推,周轉(zhuǎn)時(shí)間變長(zhǎng),致使長(zhǎng)作業(yè)長(zhǎng)期不會(huì)被運(yùn)行(適用于 I/O 繁忙型作業(yè)的系統(tǒng))。

          高響應(yīng)比優(yōu)先算法 (Highest Response Ratio Next, HRRN)

          因?yàn)榍懊娴?span style="color: Blue;">「先進(jìn)先出算法」和「最短作業(yè)優(yōu)先算法」都沒(méi)有很好的權(quán)衡短作業(yè)和長(zhǎng)作業(yè),所以高響應(yīng)比優(yōu)先算法主要是權(quán)衡了短作業(yè)和長(zhǎng)作業(yè)。

          每次進(jìn)行進(jìn)程調(diào)度時(shí),先計(jì)算「響應(yīng)比優(yōu)先權(quán)」,然后把「響應(yīng)比優(yōu)先權(quán)」最高的進(jìn)程投入運(yùn)行。

          從上面的公式,可以發(fā)現(xiàn):

          如果兩個(gè)進(jìn)程的「等待時(shí)間」相同時(shí),「要求的服務(wù)時(shí)間」越短,「優(yōu)先權(quán)」就越高,這樣短作業(yè)的進(jìn)程容易被選中運(yùn)行(如果等待時(shí)間較短,進(jìn)程的運(yùn)行時(shí)間越短,優(yōu)先權(quán)就會(huì)越高 =>  等待時(shí)間較短的短作業(yè)進(jìn)程)

          如果兩個(gè)進(jìn)程「要求的服務(wù)時(shí)間」相同時(shí),「等待時(shí)間」越長(zhǎng),「優(yōu)先權(quán)」就越高,這就兼顧到了長(zhǎng)作業(yè)進(jìn)程,因?yàn)檫M(jìn)程的響應(yīng)比可以隨時(shí)間等待的增加而提高,當(dāng)其等待時(shí)間足夠長(zhǎng)時(shí),其響應(yīng)比便可以升到很高,從而獲得運(yùn)行的機(jī)會(huì)(如果要求服務(wù)時(shí)間比較長(zhǎng),進(jìn)程的等待時(shí)間越長(zhǎng),優(yōu)先權(quán)就會(huì)越高 => 等待時(shí)間較長(zhǎng)的長(zhǎng)作業(yè)進(jìn)程)

          時(shí)間片輪轉(zhuǎn)(Round Robin, RR)算法

          時(shí)間片輪轉(zhuǎn)是最古老、最簡(jiǎn)單、最公平且使用最廣的算法,給每個(gè)進(jìn)程分配相同時(shí)間片(Quantum),允許進(jìn)程在該時(shí)間段中運(yùn)行。

          • 如果時(shí)間片用完,進(jìn)程還在運(yùn)行,將會(huì)把此進(jìn)程放入就緒隊(duì)列,并繼續(xù)調(diào)度另外一個(gè)進(jìn)程,依此類推
          • 如果該進(jìn)程在時(shí)間片結(jié)束前阻塞或結(jié)束,則調(diào)度另外一個(gè)進(jìn)程
          • 進(jìn)程時(shí)間片用完,需要被重新分配時(shí)間片

          需要注意的是,如果時(shí)間片設(shè)置的太短,會(huì)導(dǎo)致CPU上下文切換態(tài)頻繁,太長(zhǎng)又可能引起對(duì)短作業(yè)進(jìn)程的響應(yīng)時(shí)間變長(zhǎng),所以時(shí)間片設(shè)為 20ms~50ms 通常是一個(gè)比較合理的折中值

          最高優(yōu)先級(jí)(Highest Priority First,HPF)算法

          前面的「時(shí)間片輪轉(zhuǎn)算法」讓所有的進(jìn)程同等重要,不偏袒誰(shuí),大家的運(yùn)行時(shí)間都一樣。但是,對(duì)于多用戶計(jì)算機(jī)系統(tǒng)就有不同的看法了,它們希望調(diào)度是有優(yōu)先級(jí)的,希望調(diào)度程序能從就緒隊(duì)列中選擇最高優(yōu)先級(jí)的進(jìn)程運(yùn)行,這就是最高優(yōu)先級(jí)(Highest Priority First,HPF)算法。

          進(jìn)程的優(yōu)先級(jí)可以分為:

          • 靜態(tài)優(yōu)先級(jí):創(chuàng)建進(jìn)程時(shí)候,已經(jīng)確定優(yōu)先級(jí),整個(gè)運(yùn)行時(shí)間優(yōu)先級(jí)都不會(huì)變化
          • 動(dòng)態(tài)優(yōu)先級(jí):根據(jù)進(jìn)程的動(dòng)態(tài)變化調(diào)整優(yōu)先級(jí),比如進(jìn)程運(yùn)行時(shí)間增加,則降低其優(yōu)先級(jí),如果進(jìn)程等待時(shí)間(就緒隊(duì)列的等待時(shí)間)增加,則提高優(yōu)先級(jí)。

          有兩種處理優(yōu)先級(jí)高的方法:

          • 非搶占式:當(dāng)就緒隊(duì)列中出現(xiàn)優(yōu)先級(jí)高的進(jìn)程,運(yùn)行完當(dāng)前進(jìn)程,再選擇優(yōu)先級(jí)高的進(jìn)程。
          • 搶占式:當(dāng)就緒隊(duì)列中出現(xiàn)優(yōu)先級(jí)高的進(jìn)程,當(dāng)前進(jìn)程掛起,調(diào)度優(yōu)先級(jí)高的進(jìn)程運(yùn)行。

          但是依然有缺點(diǎn),可能會(huì)導(dǎo)致低優(yōu)先級(jí)的進(jìn)程永遠(yuǎn)不會(huì)運(yùn)行。

          多級(jí)反饋隊(duì)列(Multilevel Feedback Queue)算法

          多級(jí)反饋隊(duì)列(Multilevel Feedback Queue)算法 是基于「時(shí)間片輪轉(zhuǎn)算法」和「最高優(yōu)先級(jí)算法」演進(jìn)而來(lái),如同它的名字一樣,根據(jù)優(yōu)先級(jí)分組成多個(gè)隊(duì)列,在算法中涉及兩個(gè)概念:

          • 「多級(jí)」表示有多個(gè)隊(duì)列,每個(gè)隊(duì)列優(yōu)先級(jí)從高到低,優(yōu)先級(jí)越高的隊(duì)列擁有的時(shí)間片越短
          • 「反饋」 表示有新的進(jìn)程進(jìn)入優(yōu)先級(jí)高的隊(duì)列時(shí),停止當(dāng)前運(yùn)行進(jìn)程,去運(yùn)行優(yōu)先級(jí)高的隊(duì)列

          工作流程:

          • 多個(gè)隊(duì)列,賦予每個(gè)隊(duì)列不同的優(yōu)先級(jí),每個(gè)隊(duì)列優(yōu)先級(jí)從高到低,同時(shí)優(yōu)先級(jí)越高時(shí)間片越短
          • 新進(jìn)的 進(jìn)程 會(huì)被放入 第一級(jí)隊(duì)列 尾部,按先來(lái)先服務(wù)的原則排隊(duì)等待被調(diào)度,如果第一級(jí)隊(duì)列時(shí)間片用完,還有進(jìn)程沒(méi)有執(zhí)行,把第一級(jí)隊(duì)列剩余的進(jìn)程 放入 第二級(jí)隊(duì)列的尾部,依此類推
          • 當(dāng)優(yōu)先級(jí)高隊(duì)列為空,正在運(yùn)行低優(yōu)先級(jí)隊(duì)列的進(jìn)程時(shí),有新進(jìn)程 進(jìn)入 高優(yōu)先級(jí)隊(duì)列,這時(shí)立即停止當(dāng)前運(yùn)行進(jìn)程,把當(dāng)前進(jìn)程放入 原隊(duì)列 尾部,轉(zhuǎn)而去 運(yùn)行 高優(yōu)先級(jí)隊(duì)列的進(jìn)程。

          可以發(fā)現(xiàn),對(duì)于短作業(yè)可能可以在第一級(jí)隊(duì)列很快被處理完。對(duì)于長(zhǎng)作業(yè),如果在第一級(jí)隊(duì)列處理不完,可以移入下次隊(duì)列等待被執(zhí)行,雖然等待的時(shí)間變長(zhǎng)了,但是運(yùn)行時(shí)間也會(huì)更長(zhǎng)了,很好的兼顧了長(zhǎng)短作業(yè),同時(shí)有較好的響應(yīng)時(shí)間。

          瀏覽 81
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲欧美性生活 | 国产像蕉9 | 青草影视av | 亚洲操片免费看 | 青青草狠狠爱 |