欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

linux線程切換和進(jìn)程切換的方法

 更新時(shí)間:2017年01月04日 11:49:39   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇linux線程切換和進(jìn)程切換的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

進(jìn)程切換分兩步:

1.切換頁(yè)目錄以使用新的地址空間

2.切換內(nèi)核棧和硬件上下文

對(duì)于linux來(lái)說(shuō),線程和進(jìn)程的最大區(qū)別就在于地址空間,對(duì)于線程切換,第1步是不需要做的,第2是進(jìn)程和線程切換都要做的。

切換的性能消耗:

1、線程上下文切換和進(jìn)程上下問(wèn)切換一個(gè)最主要的區(qū)別是線程的切換虛擬內(nèi)存空間依然是相同的,但是進(jìn)程切換是不同的。這兩種上下文切換的處理都是通過(guò)操作系統(tǒng)內(nèi)核來(lái)完成的。內(nèi)核的這種切換過(guò)程伴隨的最顯著的性能損耗是將寄存器中的內(nèi)容切換出。

2、另外一個(gè)隱藏的損耗是上下文的切換會(huì)擾亂處理器的緩存機(jī)制。簡(jiǎn)單的說(shuō),一旦去切換上下文,處理器中所有已經(jīng)緩存的內(nèi)存地址一瞬間都作廢了。還有一個(gè)顯著的區(qū)別是當(dāng)你改變虛擬內(nèi)存空間的時(shí)候,處理的頁(yè)表緩沖(processor's Translation Lookaside Buffer (TLB))或者相當(dāng)?shù)纳耨R東西會(huì)被全部刷新,這將導(dǎo)致內(nèi)存的訪問(wèn)在一段時(shí)間內(nèi)相當(dāng)?shù)牡托А5窃诰€程的切換中,不會(huì)出現(xiàn)這個(gè)問(wèn)題。

系統(tǒng)調(diào)用:處于進(jìn)程上下文

系統(tǒng)調(diào)用是在進(jìn)程上下文中,并沒(méi)有tasklet之類(lèi)的延遲運(yùn)行,系統(tǒng)調(diào)用本身可以休眠,這些可以參見(jiàn)內(nèi)核代碼

雖然系統(tǒng)調(diào)用實(shí)與其他中斷實(shí)現(xiàn)有點(diǎn)類(lèi)似,通過(guò)IDT表查找入口處理函數(shù),但是系統(tǒng)調(diào)用與其他中斷最大的不同是,系統(tǒng)調(diào)用是代表當(dāng)前進(jìn)程執(zhí)行的,所以current宏/task_struct是有意義的,這個(gè)休眠可以被喚醒
 
系統(tǒng)調(diào)用,異常,中斷(其中中斷是異步時(shí)鐘,異常時(shí)同步時(shí)鐘),也可以把系統(tǒng)調(diào)用成為異常

中斷上下文:在中斷中執(zhí)行時(shí)依賴(lài)的環(huán)境,就是中斷上下文(不包括系統(tǒng)調(diào)用,是硬件中斷)

進(jìn)程上下文:當(dāng)一個(gè)進(jìn)程在執(zhí)行時(shí),CPU的所有寄存器中的值、進(jìn)程的狀態(tài)以及堆棧中的內(nèi)容被稱(chēng)為該進(jìn)程的上下文

1、首先,這兩個(gè)上下文都處于內(nèi)核空間。

2、其次,兩者的區(qū)別在于,進(jìn)程上下文與當(dāng)前執(zhí)行進(jìn)程密切相關(guān),而中斷上下文在邏輯上與進(jìn)程沒(méi)有關(guān)系。

進(jìn)程上下文主要是異常處理程序和內(nèi)核線程。內(nèi)核之所以進(jìn)入進(jìn)程上下文是因?yàn)檫M(jìn)程自身的一些工作需要在內(nèi)核中做。例如,系統(tǒng)調(diào)用是為當(dāng)前進(jìn)程服務(wù)的,異常通常是處理進(jìn)程導(dǎo)致的錯(cuò)誤狀態(tài)等。所以在進(jìn)程上下文中引用current是有意義的。

內(nèi)核進(jìn)入中斷上下文是因?yàn)橹袛嘈盘?hào)而導(dǎo)致的中斷處理或軟中斷。而中斷信號(hào)的發(fā)生是隨機(jī)的,中斷處理程序及軟中斷并不能事先預(yù)測(cè)發(fā)生中斷時(shí)當(dāng)前運(yùn)行的是哪個(gè)進(jìn)程,所以在中斷上下文中引用current是可以的,但沒(méi)有意義。事實(shí)上,對(duì)于A進(jìn)程希望等待的中斷信號(hào),可能在B進(jìn)程執(zhí)行期間發(fā)生。例如,A進(jìn)程啟動(dòng)寫(xiě)磁盤(pán)操作,A進(jìn)程睡眠后現(xiàn)在時(shí)B進(jìn)程在運(yùn)行,當(dāng)磁盤(pán)寫(xiě)完后磁盤(pán)中斷信號(hào)打斷的是B進(jìn)程,在中斷處理時(shí)會(huì)喚醒A進(jìn)程。

上下文這個(gè)詞會(huì)讓人想到進(jìn)程的CPU寄存器狀態(tài),但好像進(jìn)入進(jìn)程上下文(異常處理系統(tǒng)調(diào)用)和進(jìn)入中斷上下文(中斷處理),內(nèi)核所做的工作沒(méi)有太大區(qū)別。所以,這兩個(gè)上下文的主要區(qū)別,我認(rèn)為在于是否與進(jìn)程相關(guān)。

運(yùn)行于進(jìn)程上下文的內(nèi)核代碼是可搶占的,但中斷上下文則會(huì)一直運(yùn)行至結(jié)束,不會(huì)被搶占。因此,內(nèi)核會(huì)限制中斷上下文的工作,不允許其執(zhí)行如下操作:

(1) 進(jìn)入睡眠狀態(tài)或主動(dòng)放棄CPU;

由于中斷上下文不屬于任何進(jìn)程,它與current沒(méi)有任何關(guān)系(盡管此時(shí)current指向被中斷的進(jìn)程),所以中斷上下文一旦睡眠或者放棄CPU,將無(wú)法被喚醒。所以也叫原子上下文(atomic context)。

(2) 占用互斥體;

為了保護(hù)中斷句柄臨界區(qū)資源,不能使用mutexes。如果獲得不到信號(hào)量,代碼就會(huì)睡眠,會(huì)產(chǎn)生和上面相同的情況,如果必須使用鎖,則使用spinlock。

(3) 執(zhí)行耗時(shí)的任務(wù);

中斷處理應(yīng)該盡可能快,因?yàn)閮?nèi)核要響應(yīng)大量服務(wù)和請(qǐng)求,中斷上下文占用CPU時(shí)間太長(zhǎng)會(huì)嚴(yán)重影響系統(tǒng)功能。在中斷處理例程中執(zhí)行耗時(shí)任務(wù)時(shí),應(yīng)該交由中斷處理例程底半部來(lái)處理。

(4) 訪問(wèn)用戶(hù)空間虛擬內(nèi)存。

因?yàn)橹袛嗌舷挛氖呛吞囟ㄟM(jìn)程無(wú)關(guān)的,它是內(nèi)核代表硬件運(yùn)行在內(nèi)核空間,所以在中斷上下文無(wú)法訪問(wèn)用戶(hù)空間的虛擬地址

(5) 中斷處理例程不應(yīng)該設(shè)置成reentrant(可被并行或遞歸調(diào)用的例程)。

因?yàn)橹袛喟l(fā)生時(shí),preempt和irq都被disable,直到中斷返回。所以中斷上下文和進(jìn)程上下文不一樣,中斷處理例程的不同實(shí)例,是不允許在SMP上并發(fā)運(yùn)行的。

(6)中斷處理例程可以被更高級(jí)別的IRQ中斷。(不能嵌套中斷)使用軟中斷,上部分關(guān)中斷,也就是禁止嵌套,下半部分使用軟中斷

如果想禁止這種中斷,可以將中斷處理例程定義成快速處理例程,相當(dāng)于告訴CPU,該例程運(yùn)行時(shí),禁止本地CPU上所有中斷請(qǐng)求。這直接導(dǎo)致的結(jié)果是,由于其他中斷被延遲響應(yīng),系統(tǒng)性能下降。

軟中斷是一種延時(shí)機(jī)制,代碼執(zhí)行的優(yōu)先級(jí)比進(jìn)程要高,比硬中斷要低。相比于硬件中斷,軟中段是在開(kāi)中斷的環(huán)境中執(zhí)行的(長(zhǎng)時(shí)間關(guān)中斷對(duì)系統(tǒng)的開(kāi)銷(xiāo)太大), 代碼是執(zhí)行在中斷/線程上下文的,是不能睡眠的,雖然每個(gè)cpu都有一個(gè)對(duì)應(yīng)的ksoftirqd/n線程來(lái)執(zhí)行軟中斷,但是do_softirq這個(gè)函數(shù)也還會(huì)在中斷退出時(shí)調(diào)用到,因此不能睡眠(中斷上下文不能睡眠的原因是由于調(diào)度系統(tǒng)是以進(jìn)程為基本單位的,調(diào)度時(shí)會(huì)把當(dāng)前進(jìn)程的上下文保存在task_struct這個(gè)數(shù)據(jù)結(jié)構(gòu)中,當(dāng)進(jìn)程被調(diào)度重新執(zhí)行時(shí)會(huì)找到執(zhí)行的斷點(diǎn),但是中斷上下文是沒(méi)有特定task_struct結(jié)構(gòu)體的,當(dāng)然現(xiàn)在有所謂的線程話中斷,可以滿(mǎn)足在中斷處理函數(shù)執(zhí)行阻塞操作,但是實(shí)時(shí)性可能會(huì)有問(wèn)題。還有就是中斷代表當(dāng)前進(jìn)程執(zhí)行的概念,個(gè)人感覺(jué)有點(diǎn)扯淡,畢竟整個(gè)內(nèi)核空間是由所有進(jìn)程共享的,不存在代表的概念)

上面我們介紹的可延遲函數(shù)運(yùn)行在中斷上下文中(軟中斷的一個(gè)檢查點(diǎn)就是do_IRQ退出的時(shí)候),于是導(dǎo)致了一些問(wèn)題:軟中斷不能睡眠、不能阻塞。由于中斷上下文出于內(nèi)核態(tài),沒(méi)有進(jìn)程切換,所以如果軟中斷一旦睡眠或者阻塞,將無(wú)法退出這種狀態(tài),導(dǎo)致內(nèi)核會(huì)整個(gè)僵死。但可阻塞函數(shù)不能用在中斷上下文中實(shí)現(xiàn),必須要運(yùn)行在進(jìn)程上下文中,例如訪問(wèn)磁盤(pán)數(shù)據(jù)塊的函數(shù)。因此,可阻塞函數(shù)不能用軟中斷來(lái)實(shí)現(xiàn)。但是它們往往又具有可延遲的特性。

以上就是小編為大家?guī)?lái)的linux線程切換和進(jìn)程切換的方法全部?jī)?nèi)容了,希望大家多多支持腳本之家~

相關(guān)文章

最新評(píng)論