新聞中心
【引言】

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


咨詢
建站咨詢
