1 多線程概念在理解多線程之前,,我們先搞清楚什么是線程。根據(jù)維基百科的描述,,線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位,。它被包含在進(jìn)程之中,是行程中的實(shí)際運(yùn)行單位,。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,,一個(gè)進(jìn)程中可以并行多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù),。每個(gè)線程共享堆空間,,擁有自己獨(dú)立的棧空間,。 這里反復(fù)出現(xiàn)的概念是線程和進(jìn)程,我們?cè)谶@里列出它們的區(qū)別:
多線程是指從軟件或者硬件上實(shí)現(xiàn)多個(gè)線程并發(fā)執(zhí)行的技術(shù),。具有多線程能力的計(jì)算機(jī)因有硬件支持而能夠在同一時(shí)間執(zhí)行多個(gè)線程,,進(jìn)而提升整體處理效能。 2 為什么要使用多線程隨著計(jì)算機(jī)硬件的發(fā)展,,多核CPU已經(jīng)屢見(jiàn)不鮮了,,甚至手機(jī)處理器都早已是多核的天下。這就給我們使用多線程提供了硬件基礎(chǔ),,但是,,只是因?yàn)橛布屛覀兛梢詫?shí)現(xiàn)多線程,就要這樣做嗎,?一起來(lái)看看多線程的優(yōu)點(diǎn):
3 多線程上下文切換的性能損耗前面夸了多線程的優(yōu)點(diǎn),凡事都有兩面性,,使用多線程也有弊端,。盡管使用多線程往往可以獲得更大的吞吐率和更短的響應(yīng)時(shí)間,但是,,多線程程序不一定比單線程程序執(zhí)行速度快,。很多線程存在情況下,線程之間的切換會(huì)非常頻繁,,切換帶來(lái)的性能損耗是非??捎^的。 3.1 上下文切換的概念先來(lái)解釋一下什么是上下文切換(context switch),。在多任務(wù)處理系統(tǒng)中,,作業(yè)數(shù)通常大于CPU數(shù)。為了讓用戶覺(jué)得這些任務(wù)在同時(shí)進(jìn)行,,CPU給每個(gè)任務(wù)分配一定時(shí)間,把當(dāng)前任務(wù)狀態(tài)保存下來(lái),當(dāng)前運(yùn)行任務(wù)轉(zhuǎn)為就緒(或者掛起,、刪除)狀態(tài),,另一個(gè)被選定的就緒任務(wù)成為當(dāng)前任務(wù)。之后CPU可以回過(guò)頭再處理之前被掛起任務(wù),。上下文切換就是這樣一個(gè)過(guò)程,,它允許CPU記錄并恢復(fù)各種正在運(yùn)行程序的狀態(tài),使它能夠完成切換操作,。在這個(gè)過(guò)程中,,CPU會(huì)停止處理當(dāng)前運(yùn)行的程序,并保存當(dāng)前程序運(yùn)行的具體位置以便之后繼續(xù)運(yùn)行,。 上下文切換在不同的場(chǎng)合有不同的含義,,在下表中列出:
根據(jù)種類的不同,,切換時(shí)造成的性能消耗也不同,。 究竟什么時(shí)候會(huì)發(fā)生上下文切換?總共有三種情況:
3.2 上下文切換的步驟為了理解為什么上下文切換的時(shí)候會(huì)損耗性能,,我們應(yīng)該先看看上下文切換的過(guò)程中究竟發(fā)生了什么。在切換過(guò)程中,,正在執(zhí)行的進(jìn)程的狀態(tài)必須以某種方式存儲(chǔ)起來(lái),,這樣在未來(lái)才能被恢復(fù)。這里說(shuō)的進(jìn)程狀態(tài)包括該進(jìn)程正在使用的所有寄存器(尤其是程序計(jì)數(shù)器),,和一些必要的操作系統(tǒng)數(shù)據(jù),。保存進(jìn)程狀態(tài)的數(shù)據(jù)結(jié)構(gòu)叫做“進(jìn)程控制塊”(PCB,process control block); PCB通常是系統(tǒng)內(nèi)存占用區(qū)中的一個(gè)連續(xù)存區(qū),,它存放著操作系統(tǒng)用于描述進(jìn)程情況及控制進(jìn)程運(yùn)行所需的全部信息,,它使一個(gè)在多道程序環(huán)境下不能獨(dú)立運(yùn)行的程序成為一個(gè)能獨(dú)立運(yùn)行的基本單位或一個(gè)能與其他進(jìn)程并發(fā)執(zhí)行的進(jìn)程。 上下文切換的具體步驟是(假設(shè)當(dāng)前進(jìn)程是進(jìn)程A,,要切換到的下一個(gè)進(jìn)程是進(jìn)程B):
線程分為用戶級(jí)線程和內(nèi)核級(jí)線程,。同一進(jìn)程中的用戶級(jí)線程切換的時(shí)候,只需要保存用戶寄存器的內(nèi)容,,程序計(jì)數(shù)器,,棧指針,不需要模式切換,。但是這樣會(huì)導(dǎo)致線程阻塞和無(wú)法利用多處理器,。而同一進(jìn)程中的內(nèi)核級(jí)線程切換的時(shí)候,就克服了這兩個(gè)缺點(diǎn),,但是除了保存上下文,,還要進(jìn)行模式切換。 線程切換和進(jìn)程切換的步驟也不同,。進(jìn)程的上下文切換分為兩步:1.切換頁(yè)目錄以使用新的地址空間,;2.切換內(nèi)核棧和硬件上下文。對(duì)于Linux來(lái)說(shuō),,線程和進(jìn)程的最大區(qū)別就在于地址空間,。對(duì)于線程切換,第1步是不需要做的,,第2是進(jìn)程和線程切換都要做的,。所以明顯是進(jìn)程切換代價(jià)大。線程上下文切換和進(jìn)程上下文切換一個(gè)最主要的區(qū)別是線程的切換虛擬內(nèi)存空間依然是相同的,,但是進(jìn)程切換是不同的,。這兩種上下文切換的處理都是通過(guò)操作系統(tǒng)內(nèi)核來(lái)完成的。內(nèi)核的這種切換過(guò)程伴隨的最顯著的性能損耗是將寄存器中的內(nèi)容切換出,。 3.3 上下文切換帶來(lái)的損耗根據(jù)前面的切換步驟,,我們可以很容易得到性能損耗的原因。 上下文切換會(huì)導(dǎo)致CPU在寄存器和運(yùn)行隊(duì)列之間來(lái)回奔波,。這種消耗可以分為兩種
|
|
來(lái)自: 紀(jì)平aa8woyo5no > 《待分類》