新聞中心
【引言】

站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到漳縣網(wǎng)站設(shè)計(jì)與漳縣網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:成都做網(wǎng)站、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋漳縣地區(qū)。
隨著計(jì)算機(jī)的不斷發(fā)展,多核CPU的普及已經(jīng)成為了趨勢(shì)。在多核CPU的架構(gòu)下,操作系統(tǒng)需要很好地分配和協(xié)調(diào)多個(gè)核心的運(yùn)行,以提高系統(tǒng)的效率和性能。
然而,在實(shí)際操作中,多核CPU的性能仍然不能夠充分地發(fā)揮。其中一個(gè)主要的問(wèn)題是中斷的影響。本文將介紹Linux如何屏蔽中斷,以增強(qiáng)多核CPU的性能。
【正文】
1. 中斷的影響
中斷是計(jì)算機(jī)系統(tǒng)中一種重要的機(jī)制,可以使系統(tǒng)在接收到外部設(shè)備的信息時(shí)進(jìn)行響應(yīng)。每當(dāng)系統(tǒng)接收到一個(gè)中斷信號(hào)時(shí),CPU需要立即停止當(dāng)前的任務(wù)并轉(zhuǎn)向中斷處理程序,以響應(yīng)外部設(shè)備的請(qǐng)求。
然而,對(duì)于多核CPU來(lái)說(shuō),中斷的處理會(huì)對(duì)系統(tǒng)的性能產(chǎn)生負(fù)面影響。當(dāng)一個(gè)核心響應(yīng)中斷時(shí),其他核心會(huì)被暫停,等待該核心完成中斷處理后再繼續(xù)執(zhí)行任務(wù)。而在多核CPU中,這種暫停的開(kāi)銷(xiāo)會(huì)更大。
因此,為了提高多核CPU的性能,我們需要減少中斷的影響,使其他核心可以在同一時(shí)間內(nèi)進(jìn)行更多的計(jì)算任務(wù)。
2. 屏蔽中斷的方法
屏蔽中斷是一種降低中斷影響的方法。通過(guò)屏蔽中斷,我們可以使一個(gè)或多個(gè)核心在接收到中斷時(shí)不進(jìn)行響應(yīng),從而避免其他核心因?yàn)榈却袛嗵幚矶V惯\(yùn)行的情況。
在Linux中,有三種方式可以屏蔽中斷,分別是:
(1)本地中斷屏蔽(Local Interrupt Disable,LID)
LID是在本地處理器上禁用中斷的方法。當(dāng)使用LID時(shí),處理器會(huì)阻止中斷,直到開(kāi)啟中斷的操作被執(zhí)行。
例如,可以使用以下代碼在Linux內(nèi)核中屏蔽中斷:
local_irq_disable();
這將禁用當(dāng)前處理器上的所有中斷。當(dāng)需要重新開(kāi)啟中斷時(shí),可以使用以下代碼:
local_irq_enable();
(2)全局中斷屏蔽(Global Interrupt Disable,GID)
GID是在整個(gè)系統(tǒng)中禁用中斷的方法。當(dāng)使用GID時(shí),所有處理器不會(huì)響應(yīng)任何中斷信號(hào)。
例如,可以使用以下代碼在Linux內(nèi)核中啟用全局中斷屏蔽:
local_irq_save(flags);
其中,flags是一個(gè)unsigned long類(lèi)型的變量,用于保存中斷狀態(tài)的標(biāo)志。當(dāng)需要關(guān)閉全局中斷屏蔽時(shí),可以使用以下代碼:
local_irq_restore(flags);
(3)調(diào)度屏蔽(Scheduler Disable,SD)
SD是一種在特定任務(wù)中禁用中斷的方法。當(dāng)使用SD時(shí),當(dāng)前任務(wù)會(huì)阻止中斷處理程序運(yùn)行。
例如,可以使用以下代碼在Linux內(nèi)核中啟用調(diào)度屏蔽:
spin_lock_irqsave(&lock, flags);
其中,lock是一個(gè)spinlock_t類(lèi)型的變量,用于控制中斷。當(dāng)需要關(guān)閉調(diào)度屏蔽時(shí),可以使用以下代碼:
spin_unlock_irqrestore(&lock, flags);
【結(jié)論】
在多核CPU的系統(tǒng)下,中斷處理會(huì)對(duì)整個(gè)系統(tǒng)的性能產(chǎn)生影響。通過(guò)使用中斷屏蔽等方法,可以有效減少中斷對(duì)系統(tǒng)性能的影響,提高多核CPU的性能。
在Linux內(nèi)核中,有三種不同的中斷屏蔽方法,包括本地中斷屏蔽、全局中斷屏蔽和調(diào)度屏蔽。通過(guò)靈活使用這些屏蔽方法,可以更大程度地發(fā)揮多核CPU的性能優(yōu)勢(shì)。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
Linux設(shè)備驅(qū)動(dòng)中多中斷源問(wèn)題
我也是初學(xué)者,這里抄一段《Linux設(shè)備驅(qū)動(dòng)程序》書(shū)上的給你:
Linux的中斷宏觀分為兩種:軟中斷和硬中斷。聲明一橘啟數(shù)下,這里的軟和硬的意思是指和軟件相關(guān)以及和硬件相關(guān),而不是軟件實(shí)現(xiàn)的中斷或硬件實(shí)現(xiàn)的中斷。軟中斷就是“信號(hào)機(jī)制”。軟中斷不是軟件中斷。Linux通過(guò)信號(hào)來(lái)產(chǎn)生對(duì)進(jìn)程的各種中斷操作,我們現(xiàn)在知道的信號(hào)共有31個(gè),其具體內(nèi)容這里略過(guò)。
一般來(lái)說(shuō),軟中斷是由內(nèi)核機(jī)制的觸發(fā)事件引起的(例如進(jìn)程運(yùn)行超時(shí)),但是不可忽視有大量的軟中斷也是由于和硬件有關(guān)的中斷引起的,例如當(dāng)打印機(jī)端口產(chǎn)生一個(gè)硬件中斷時(shí),會(huì)通知和硬件相關(guān)的硬中斷,硬中斷就會(huì)產(chǎn)生一個(gè)軟中斷并送到操作系統(tǒng)內(nèi)核里,這樣內(nèi)核就會(huì)根據(jù)這個(gè)軟中斷喚醒睡眠在打印機(jī)任務(wù)隊(duì)列中的處理進(jìn)程。
硬中斷就是通常意義上的“中斷處理程序”,它是直接處理由硬件發(fā)過(guò)來(lái)的中斷信號(hào)的。當(dāng)硬中斷收到它應(yīng)當(dāng)處理的中斷信號(hào)以后,就回去自己驅(qū)動(dòng)的設(shè)備上去看看設(shè)備的狀態(tài)寄存器以了解發(fā)生了什么事情,并進(jìn)行相應(yīng)的操作。
對(duì)于軟中斷,我們不做討論,那是進(jìn)程調(diào)度里要考慮的事情。由于我們討論的是設(shè)備驅(qū)動(dòng)程序的中斷問(wèn)題,所以焦點(diǎn)集中在硬中斷里。我們這里討論的是硬中斷,即和硬件相關(guān)的中斷。
要中斷,是因?yàn)橥庠O(shè)需要通知操作系統(tǒng)她那里發(fā)生了一些事情,但是中斷的功能僅僅是一個(gè)設(shè)備報(bào)警燈,當(dāng)燈亮的時(shí)候中斷處理程序只知道有事情發(fā)生了,但發(fā)生了什么事情還要親自到設(shè)備那里去看才行。也就是說(shuō),當(dāng)中斷處理程序得知設(shè)備發(fā)生了一個(gè)中斷的時(shí)候,它并不知道設(shè)備發(fā)生了什么事情,只有當(dāng)它訪(fǎng)問(wèn)了設(shè)備上的一些狀態(tài)寄存器以后,才能知道具體發(fā)生了什么,要怎么去處理。
設(shè)備通過(guò)中斷線(xiàn)向中斷控制器發(fā)送高電平告訴操作系統(tǒng)它產(chǎn)生了一個(gè)中斷,而操作系統(tǒng)會(huì)從中斷控制器的狀態(tài)位知道是哪條中斷線(xiàn)上產(chǎn)生了中斷。PC機(jī)上使用的中斷控制器是8259,這種控制器每一個(gè)可以管理8條中斷線(xiàn),當(dāng)兩個(gè)8259級(jí)聯(lián)的時(shí)候共可以控制15條中斷線(xiàn)。這里的中斷線(xiàn)是實(shí)實(shí)在在的電路,他們通過(guò)硬件接口連接到CPU外的設(shè)備控制器上。
并不是每個(gè)設(shè)備都可以向中斷線(xiàn)上發(fā)中斷信號(hào)的,只有對(duì)某一條確定的中斷線(xiàn)勇有了控制權(quán),才可以向這條中斷線(xiàn)上發(fā)送信號(hào)。由于計(jì)算機(jī)的外部設(shè)備越來(lái)越多,所以15條中斷線(xiàn)已經(jīng)不夠用了,中斷線(xiàn)是非常寶貴的資源。要使用中斷線(xiàn),就得進(jìn)行中斷線(xiàn)的申請(qǐng),就是IRQ(Interrupt Requirement),我們也常把申請(qǐng)一條中斷線(xiàn)成為申請(qǐng)一個(gè)IRQ或者是申請(qǐng)一個(gè)中圓首斷號(hào)。
IRQ是非常寶貴的,所以我們建議只有當(dāng)設(shè)備需要中斷的時(shí)候才申請(qǐng)占用一個(gè)IRQ,或者是在申請(qǐng)IRQ時(shí)采用共享中斷的方式,這樣可以讓更多的設(shè)備使用中斷。無(wú)論對(duì)IRQ的使用方式是獨(dú)占還是共享,申請(qǐng)IRQ的過(guò)程都是一樣的,分為3步:
1.將所有的中斷線(xiàn)探測(cè)一遍,看看哪些中斷還沒(méi)有被占用。從這些還沒(méi)有被占用的中斷中選一個(gè)作為該設(shè)備的IRQ。
2.通過(guò)中斷申請(qǐng)函數(shù)申請(qǐng)選定的IRQ,這是要指定申請(qǐng)的方式是獨(dú)占還是共享。
3.根據(jù)中斷申請(qǐng)函數(shù)的返回值決定怎么做:如果成功了萬(wàn)事大吉,如果沒(méi)成功則或者重新申請(qǐng)或者放棄申請(qǐng)并返回錯(cuò)誤。
Linux中的中斷處理程序很有特色,它的一個(gè)中斷處理程序分為兩個(gè)部分:上半部(top half)和下半部(bottom half)。之所以會(huì)有上半部和下半部之分,完全是考慮到中斷處理的效率。
上半部的功能是“登記中斷”。當(dāng)一個(gè)中斷發(fā)生時(shí),他就把設(shè)備驅(qū)動(dòng)程序中中斷例程的下半部掛到該設(shè)備的下半部執(zhí)行隊(duì)列中去,然后就沒(méi)事情了–等待新的中斷的到來(lái)。這樣旁薯一來(lái),上半部執(zhí)行的速度就會(huì)很快,他就可以接受更多她負(fù)責(zé)的設(shè)備產(chǎn)生的中斷了。上半部之所以要快,是因?yàn)樗峭耆帘沃袛嗟模绻粓?zhí)行完,其它的中斷就不能被及時(shí)的處理,只能等到這個(gè)中斷處理程序執(zhí)行完畢以后。所以,要盡可能多得對(duì)設(shè)備產(chǎn)生的中斷進(jìn)行服務(wù)和處理,中斷處理程序就一定要快。
但是,有些中斷事件的處理是比較復(fù)雜的,所以中斷處理程序必須多花一點(diǎn)時(shí)間才能夠把事情做完??稍趺礃踊庠诙虝r(shí)間內(nèi)完成復(fù)雜處理的矛盾呢,這時(shí)候 Linux引入了下半部的概念。下半部和上半部更大的不同是下半部是可中斷的,而上半部是不可中斷的。下半部幾乎做了中斷處理程序所有的事情,因?yàn)樯习氩恐皇菍⑾掳氩颗诺搅怂麄兯?fù)責(zé)的設(shè)備的中斷處理隊(duì)列中去,然后就什么都不管了。下半部一般所負(fù)責(zé)的工作是察看設(shè)備以獲得產(chǎn)生中斷的事件信息,并根據(jù)這些信息(一般通過(guò)讀設(shè)備上的寄存器得來(lái))進(jìn)行相應(yīng)的處理。如果有些時(shí)間下半部不知道怎么去做,他就使用著名的鴕鳥(niǎo)算法來(lái)解決問(wèn)題–說(shuō)白了就是忽略這個(gè)事件。
由于下半部是可中斷的,所以在它運(yùn)行期間,如果其它的設(shè)備產(chǎn)生了中斷,這個(gè)下半部可以暫時(shí)的中斷掉,等到那個(gè)設(shè)備的上半部運(yùn)行完了,再回頭來(lái)運(yùn)行它。但是有一點(diǎn)一定要注意,那就是如果一個(gè)設(shè)備中斷處理程序正在運(yùn)行,無(wú)論她是運(yùn)行上半部還是運(yùn)行下半部,只要中斷處理程序還沒(méi)有處理完畢,在這期間設(shè)備產(chǎn)生的新的中斷都將被忽略掉。因?yàn)橹袛嗵幚沓绦蚴遣豢芍厝氲模粋€(gè)中斷處理程序是不能并行的。
在Linux Kernel 2.0以前,中斷分為快中斷和慢中斷(偽中斷我們這里不談),其中快中斷的下半部也是不可中斷的,這樣可以保證它執(zhí)行的快一點(diǎn)。但是由于現(xiàn)在硬件水平不斷上升,快中斷和慢中斷的運(yùn)行速度已經(jīng)沒(méi)有什么差別了,所以為了提高中斷例程事務(wù)處理的效率,從Linux kernel 2.0以后,中斷處理程序全部都是慢中斷的形式了–他們的下半部是可以被中斷的。
但是,在下半部中,你也可以進(jìn)行中斷屏蔽–如果某一段代碼不能被中斷的話(huà)。你可以使用cti、sti或者是save_flag、restore_flag來(lái)實(shí)現(xiàn)你的想法。
在處理中斷的時(shí)候,中斷控制器會(huì)屏蔽掉原先發(fā)送中斷的那個(gè)設(shè)備,直到她發(fā)送的上一個(gè)中斷被處理完了為止。因此如果發(fā)送中斷的那個(gè)設(shè)備載中斷處理期間又發(fā)送了一個(gè)中斷,那么這個(gè)中斷就被永遠(yuǎn)的丟失了。
之所以發(fā)生這種事情,是因?yàn)橹袛嗫刂破鞑⒉荒芫彌_中斷信息,所以當(dāng)前一個(gè)中斷沒(méi)有處理完以前又有新的中斷到達(dá),他肯定會(huì)丟掉新的中斷的。但是這種缺陷可以通過(guò)設(shè)置主處理器(CPU)上的“置中斷標(biāo)志位”(sti)來(lái)解決,因?yàn)橹魈幚砥骶哂芯彌_中斷的功能。如果使用了“置中斷標(biāo)志位”,那么在處理完中斷以后使用sti函數(shù)就可以使先前被屏蔽的中斷得到服務(wù)。
有時(shí)候需要屏蔽中斷,可是為什么要將這個(gè)中斷屏蔽掉呢?這并不是因?yàn)榧夹g(shù)上實(shí)現(xiàn)不了同一中斷例程的并行,而是出于管理上的考慮。之所以在中斷處理的過(guò)程中要屏蔽同一IRQ來(lái)的新中斷,是因?yàn)橹袛嗵幚沓绦蚴遣豢芍厝氲?,所以不能并行?zhí)行同一個(gè)中斷處理程序。在這里我們舉一個(gè)例子,從這里子例中可以看出如果一個(gè)中斷處理程序是可以并行的話(huà),那么很有可能會(huì)發(fā)生驅(qū)動(dòng)程序鎖死的情況。當(dāng)驅(qū)動(dòng)程序鎖死的時(shí)候,你的操作系統(tǒng)并不一定會(huì)崩潰,但是鎖死的驅(qū)動(dòng)程序所支持的那個(gè)設(shè)備是不能再使用了–設(shè)備驅(qū)動(dòng)程序死了,設(shè)備也就死了。
A是一段代碼,B是操作設(shè)備寄存器R1的代碼,C是操作設(shè)備寄存器R2的代碼。其中激發(fā)PS1的事件會(huì)使A1產(chǎn)生一個(gè)中斷,然后B1去讀R1中已有的數(shù)據(jù),然后代碼C1向R2中寫(xiě)數(shù)據(jù)。而激發(fā)PS2的事件會(huì)使A2產(chǎn)生一個(gè)中斷,然后B2刪除R1中的數(shù)據(jù),然后C2讀去R2中的數(shù)據(jù)。
如果PS1先產(chǎn)生,且當(dāng)他執(zhí)行到A1和B1之間的時(shí)候,如果PS2產(chǎn)生了,這是A2會(huì)產(chǎn)生一個(gè)中斷,將PS2中斷掉(掛到任務(wù)隊(duì)列的尾部),然后刪除了 R1的內(nèi)容。當(dāng)PS2運(yùn)行到C2時(shí),由于C1還沒(méi)有向R2中寫(xiě)數(shù)據(jù),所以C2將會(huì)在這里被掛起,PS2就睡眠在代碼C2上,直到有數(shù)據(jù)可讀的時(shí)候被信號(hào)喚醒。這是由于PS1中的B2原先要讀的R1中的數(shù)據(jù)被PS2中的B2刪除了,所以PS1頁(yè)會(huì)睡眠在B1上,直到有數(shù)據(jù)可讀的時(shí)候被信號(hào)喚醒。這樣一來(lái),喚醒PS1和PS2的事件就永遠(yuǎn)不會(huì)發(fā)生了,因此PS1和PS2之間就鎖死了。
由于設(shè)備驅(qū)動(dòng)程序要和設(shè)備的寄存器打交道,所以很難寫(xiě)出可以重入的代碼來(lái),因?yàn)樵O(shè)備寄存器就是全局變量。因此,最簡(jiǎn)潔的辦法就是禁止同一設(shè)備的中斷處理程序并行,即設(shè)備的中斷處理程序是不可重入的。
有一點(diǎn)一定要清楚:在2.0版本以后的Linux kernel中,所有的上半部都是不可中斷的(上半部的操作是原子性的);不同設(shè)備的下半部可以互相中斷,但一個(gè)特定的下半部不能被它自己所中斷(即同一個(gè)下半部不能并)。
由于中斷處理程序要求不可重入,所以程序員也不必為編寫(xiě)可重入的代碼而頭痛了。編寫(xiě)可重入的設(shè)備驅(qū)動(dòng)程序是可以的,編寫(xiě)可重入的中斷處理程序是非常難得,幾乎不可能。
我們都知道,一旦競(jìng)爭(zhēng)條件出現(xiàn)了,就有可能會(huì)發(fā)生死鎖的情況,嚴(yán)重時(shí)可能會(huì)將整個(gè)系統(tǒng)鎖死。所以一定要避免競(jìng)爭(zhēng)條件的出現(xiàn)。只要注意一點(diǎn):絕大多數(shù)由于中斷產(chǎn)生的競(jìng)爭(zhēng)條件,都是在帶有中斷的
內(nèi)核進(jìn)程被睡眠造成的。所以在實(shí)現(xiàn)中斷的時(shí)候,一定要相信謹(jǐn)慎的讓進(jìn)程睡眠,必要的時(shí)候可以使用cli、sti或者save_flag、restore_flag。
關(guān)于多核cpu linux 屏蔽中斷的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港云服務(wù)器機(jī)房,創(chuàng)新互聯(lián)(www.cdcxhl.com)專(zhuān)業(yè)云服務(wù)器廠(chǎng)商,回大陸優(yōu)化帶寬,安全/穩(wěn)定/低延遲.創(chuàng)新互聯(lián)助力企業(yè)出海業(yè)務(wù),提供一站式解決方案。香港服務(wù)器-免備案低延遲-雙向CN2+BGP極速互訪(fǎng)!
網(wǎng)頁(yè)標(biāo)題:增強(qiáng)多核CPU性能:Linux如何屏蔽中斷?(多核cpulinux屏蔽中斷)
URL網(wǎng)址:http://m.fisionsoft.com.cn/article/djpoipg.html


咨詢(xún)
建站咨詢(xún)
