十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
計(jì)算機(jī)中,中斷是一種用于通知CPU出現(xiàn)了重要事件的機(jī)制。中斷使得CPU能夠在不停止當(dāng)前正在執(zhí)行的程序的情況下,及時(shí)地響應(yīng)外部設(shè)備的事件,從而提高了計(jì)算機(jī)系統(tǒng)的效率。中斷分類有很多種,其中較為常見(jiàn)的是內(nèi)中斷和外中斷。本文將重點(diǎn)討論Linux操作系統(tǒng)中的內(nèi)中斷和外中斷的異同點(diǎn)。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:國(guó)際域名空間、雅安服務(wù)器托管、營(yíng)銷軟件、網(wǎng)站建設(shè)、巧家網(wǎng)站維護(hù)、網(wǎng)站推廣。
一、內(nèi)中斷和外中斷的概念
內(nèi)中斷:是指進(jìn)程執(zhí)行過(guò)程中發(fā)生的事件,由于這種中斷事件都是在CPU內(nèi)部發(fā)生并處理,因此稱之為內(nèi)中斷。Linux內(nèi)核使用軟件中斷(定時(shí)器中斷,I/O中斷等)和硬件中斷(CPU異常)兩種方式來(lái)產(chǎn)生內(nèi)中斷。
外中斷:是指CPU在執(zhí)行指令時(shí),接收來(lái)自外部設(shè)備的中斷請(qǐng)求。外部設(shè)備會(huì)向處理器發(fā)出請(qǐng)求,要求其停止當(dāng)前程序的執(zhí)行,暫時(shí)轉(zhuǎn)向處理該設(shè)備所發(fā)出的中斷請(qǐng)求,并返回到該請(qǐng)求發(fā)出之前的程序段繼續(xù)執(zhí)行。外中斷由硬件產(chǎn)生,與CPU打交道,例如,網(wǎng)卡、鼠標(biāo)、鍵盤等都是能夠產(chǎn)生中斷請(qǐng)求的外設(shè)。
二、內(nèi)中斷和外中斷的區(qū)別
1. 響應(yīng)方式不同
內(nèi)中斷和外中斷的響應(yīng)方式不同,內(nèi)中斷是由處理器自身進(jìn)行處理,而外中斷是由外部設(shè)備對(duì)處理器發(fā)出中斷請(qǐng)求,處理器停止當(dāng)前程序的執(zhí)行。
2. 原因不同
內(nèi)中斷和外中斷產(chǎn)生的原因也不同,內(nèi)中斷是處理器在執(zhí)行指令過(guò)程中,由自身產(chǎn)生的異常事件,例如CPU超時(shí)、訪問(wèn)非法內(nèi)存地址等。而外中斷是由外部設(shè)備發(fā)出請(qǐng)求,例如鍵盤輸入等。
3. 硬件執(zhí)行方式不同
內(nèi)中斷由CPU通過(guò)檢測(cè)處理器自身的運(yùn)行狀態(tài)而觸發(fā)的,通常不需要特殊的硬件支持。而外中斷在處理器硬件中需要外設(shè)提供支持,例如網(wǎng)卡的中斷管腳等。
4. 響應(yīng)時(shí)間不同
內(nèi)中斷和外中斷的響應(yīng)時(shí)間也不同。內(nèi)中斷通常響應(yīng)較快,因?yàn)樗鼈兛偸窃诋?dāng)前進(jìn)程被打斷時(shí)立即發(fā)生。外中斷由于必須由外部設(shè)備發(fā)出并經(jīng)過(guò)處理器響應(yīng),因此響應(yīng)時(shí)間通常較長(zhǎng)。
三、Linux系統(tǒng)中的中斷
在Linux系統(tǒng)中,所有的中斷最終都被內(nèi)核處理。系統(tǒng)中有兩個(gè)主要的中斷類型:軟中斷和硬中斷。
1. 軟中斷
Linux系統(tǒng)中的軟中斷通常是由一些編程接口或系統(tǒng)服務(wù)調(diào)用,例如在網(wǎng)絡(luò)服務(wù)中,會(huì)使用軟中斷來(lái)處理TCP/IP協(xié)議棧。此外,軟中斷還被用于實(shí)現(xiàn)CPU資源共享,以及多CPU系統(tǒng)中的任務(wù)管理。
2. 硬中斷
硬中斷是由外部設(shè)備發(fā)出并由處理器根據(jù)處理設(shè)備指定的優(yōu)先級(jí)來(lái)響應(yīng)。在Linux系統(tǒng)中,外部設(shè)備通過(guò)IRQ線向處理器發(fā)送中斷請(qǐng)求,該請(qǐng)求被處理器轉(zhuǎn)發(fā)給具體的設(shè)備驅(qū)動(dòng)程序,驅(qū)動(dòng)程序會(huì)使用硬件設(shè)備的中斷服務(wù)例程來(lái)處理這些請(qǐng)求。
:
內(nèi)中斷和外中斷雖然在基本概念上與區(qū)別上有所不同,但在Linux操作系統(tǒng)中都是非常重要的機(jī)制。Linux系統(tǒng)通過(guò)內(nèi)中斷和外中斷來(lái)監(jiān)控系統(tǒng)的異常情況和外部設(shè)備的請(qǐng)求,以提高系統(tǒng)的安全性和效率。對(duì)于Linux程序員來(lái)說(shuō),了解中斷的工作原理、機(jī)制以及響應(yīng)過(guò)程等,對(duì)于理解運(yùn)行過(guò)程中的問(wèn)題和定位系統(tǒng)故障都是非常重要的。
相關(guān)問(wèn)題拓展閱讀:
呵呵 西科大的吧?找答案?參考答案見(jiàn)下面:
外部中斷是指升辯簡(jiǎn)芯片引腳態(tài)發(fā)生變化向CPU申請(qǐng)中斷,比如下降沿灶弊、上升沿、電平變化等,具體可設(shè)置特殊功能寄存器來(lái)開(kāi)啟或屏蔽;復(fù)位引腳比較特殊,中數(shù)后PC指針變?yōu)?x0000;
內(nèi)部中斷是吵褲指內(nèi)部功能模塊達(dá)到到中斷條件向CPU申請(qǐng)中斷,比如TCC、看門狗等,可參照不同芯片的技術(shù)文檔說(shuō)明進(jìn)行設(shè)置
5種
硬中斷:
1. 硬中斷是由硬件產(chǎn)生的,比如,像磁盤,網(wǎng)卡,鍵盤,時(shí)鐘等。每個(gè)設(shè)備或設(shè)備集都有它自己的IRQ(中斷請(qǐng)求)。基于IRQ,CPU可以將相應(yīng)的請(qǐng)求分發(fā)到對(duì)應(yīng)的硬件驅(qū)動(dòng)上(注:硬件驅(qū)動(dòng)通常是內(nèi)核中的一個(gè)子程序,而不是一個(gè)獨(dú)立的進(jìn)程)。
2. 處理中斷的驅(qū)動(dòng)是需要運(yùn)行在CPU上的,因此,當(dāng)中斷產(chǎn)生的時(shí)候,CPU會(huì)中斷當(dāng)前正在運(yùn)行的任務(wù),來(lái)處理中斷。在有多核心的系統(tǒng)上,一個(gè)中斷通常只能中斷一顆CPU(也有一種特殊的情況,就是在大型主機(jī)上是有硬件通道的,它可以在沒(méi)有主CPU的支持下,可以同時(shí)處理多個(gè)中斷。)。
3. 硬中斷可以直接中斷CPU。它會(huì)引起內(nèi)核中相關(guān)的代碼被觸發(fā)。對(duì)于那些需要花費(fèi)一些時(shí)間去處理的進(jìn)程,中斷代碼本身也可以被其他的硬中斷中斷。
4. 對(duì)于時(shí)鐘中斷,內(nèi)核調(diào)度代碼會(huì)將當(dāng)前正在運(yùn)行的進(jìn)程掛起,從而讓其他的進(jìn)程來(lái)運(yùn)行。它的存在是為了讓調(diào)度代碼(或稱為調(diào)度器)可以調(diào)度多任務(wù)。
軟中斷:
1. 軟中斷的處理非常像硬中斷。然而,它們僅僅是由當(dāng)前正在運(yùn)行的進(jìn)程所產(chǎn)生的。
2. 通常,軟中斷是一些對(duì)I/O的請(qǐng)求。這些請(qǐng)求會(huì)調(diào)用內(nèi)核中可以調(diào)度I/O發(fā)生的程序。對(duì)于某些設(shè)備,I/O請(qǐng)求需要被立即處理,而磁盤I/O請(qǐng)求通??梢耘抨?duì)并且可以稍后處理。根據(jù)I/O模型的不同,進(jìn)程或許會(huì)被掛起直到I/O完成,此時(shí)內(nèi)核調(diào)度器就會(huì)選擇另一個(gè)進(jìn)程去運(yùn)行。I/O可以在進(jìn)程之間產(chǎn)生并且調(diào)度過(guò)程通常和磁盤I/O的方式是相同。
3. 軟中斷僅與內(nèi)核相聯(lián)系。而內(nèi)核主要負(fù)責(zé)對(duì)需要運(yùn)行的任何其他的進(jìn)程進(jìn)行調(diào)度。一些內(nèi)核允許設(shè)備驅(qū)動(dòng)的一些部分存在于用戶空間,并且當(dāng)需要的時(shí)候內(nèi)核也會(huì)調(diào)度這個(gè)進(jìn)程去運(yùn)行。
4. 軟中斷并不會(huì)直接中斷CPU。也只有當(dāng)前正在運(yùn)行的代碼(或進(jìn)程)才會(huì)產(chǎn)生軟中斷。這種中斷是一種需要內(nèi)核為正在運(yùn)行的進(jìn)程去做一些事情(通常為I/O)的請(qǐng)求。有一個(gè)特殊的軟中斷是Yield調(diào)用,它的作用是請(qǐng)求內(nèi)核調(diào)度器去查看是否有一些其他的進(jìn)程可以運(yùn)行。
問(wèn)題解答:
1. 問(wèn):對(duì)于軟中斷,I/O操作是否是由內(nèi)核中的I/O設(shè)備驅(qū)動(dòng)程序完成?
答:對(duì)于I/O請(qǐng)求,內(nèi)核會(huì)將這項(xiàng)工作分派給合適的內(nèi)核驅(qū)動(dòng)程序,這個(gè)程序會(huì)對(duì)I/O進(jìn)行隊(duì)列化,以可以稍后處理(通常是磁盤I/O),或如果可能可以立即執(zhí)行它。通常,當(dāng)對(duì)硬中斷進(jìn)行回應(yīng)的時(shí)候,這個(gè)隊(duì)列會(huì)被驅(qū)動(dòng)所處理。當(dāng)一個(gè)I/O請(qǐng)求完成的時(shí)候,下一個(gè)在隊(duì)列中的I/O請(qǐng)求就會(huì)發(fā)送到這個(gè)設(shè)備上。
2. 問(wèn):軟中斷所經(jīng)過(guò)的操作流程是比硬中斷的少嗎?換句話說(shuō),對(duì)于軟中斷就是:進(jìn)程 ->內(nèi)核中的設(shè)備驅(qū)動(dòng)程序;對(duì)于硬中斷:硬件->CPU->內(nèi)核中的設(shè)備驅(qū)動(dòng)程序?
答:是的,軟中斷比硬中斷少了一個(gè)硬件發(fā)送信號(hào)的步驟。產(chǎn)生軟中斷的進(jìn)程一定是當(dāng)前正在運(yùn)行的進(jìn)程,因此它們不會(huì)中斷CPU。但是它們會(huì)中斷調(diào)用代碼的流程。
如果硬件需要CPU去做一些事情,那么這個(gè)硬件會(huì)使CPU中斷當(dāng)前正在運(yùn)行的代碼。而后CPU會(huì)將當(dāng)前正在運(yùn)行進(jìn)程的當(dāng)前狀態(tài)放到堆棧(stack)中,以至于之后可以返回繼續(xù)運(yùn)行。這種中斷可以停止一個(gè)正在運(yùn)行的進(jìn)程;可以停止正處理另一個(gè)中斷的內(nèi)核代碼;或者可以停止空閑進(jìn)程。
先說(shuō)說(shuō)環(huán)境
1.硬件:DELL R410
2.網(wǎng)卡:板載1000M BCM5709
2.OS: RHEL 5.5 x86_64
3.KERNEL: 2.6.18-194.el5
所出現(xiàn)的問(wèn)題
1.網(wǎng)卡毫無(wú)征兆的down掉,而且沒(méi)有任何log信息
2.當(dāng)流量增大時(shí),不到理論上限的1/3時(shí)機(jī)器出現(xiàn)網(wǎng)絡(luò)延遲嚴(yán)重,伴隨大量的丟包
3.機(jī)器的cpu軟中斷不均衡,只有1個(gè)cpu處理軟中斷,并且該cpu的軟中斷周期性的達(dá)到100%
4.內(nèi)外網(wǎng)網(wǎng)卡做nat丟包數(shù)據(jù)量不一致,差別很大,不在同一個(gè)數(shù)量級(jí)
想必之一個(gè)問(wèn)題,大部分使用bcm網(wǎng)卡,rhel 5.3以后得機(jī)器都會(huì)遇到這種情況,網(wǎng)上的資料比較的多,我也不多啰嗦了,直接升級(jí)網(wǎng)卡驅(qū)動(dòng)就可以解決了。第二,三,四其實(shí)是同一個(gè)問(wèn)題都是由于網(wǎng)卡中斷過(guò)多,cpu處理不過(guò)來(lái)(準(zhǔn)確的說(shuō),cpu分配不均衡,導(dǎo)致只有一個(gè)cpu處理,處理不過(guò)來(lái)),引起丟包,那么為什么兩個(gè)網(wǎng)卡丟包的數(shù)量級(jí)不一樣呢,下面從原理上進(jìn)行解釋,既然是做nat多出口,那么就有大量的路由信息,是一個(gè)網(wǎng)絡(luò)應(yīng)用,當(dāng)一個(gè)數(shù)據(jù)包請(qǐng)求nat時(shí),數(shù)據(jù)包先被網(wǎng)卡驅(qū)動(dòng)的數(shù)據(jù)接收,網(wǎng)卡收到數(shù)據(jù)時(shí),觸發(fā)中斷。在中斷執(zhí)行例程中,把skb掛入輸入隊(duì)列,并觸發(fā)軟中斷。稍后的某個(gè)時(shí)刻,當(dāng)軟中斷執(zhí)行時(shí),再?gòu)脑撽?duì)列中把skb取下來(lái),投遞給上層協(xié)議。
如果在這個(gè)過(guò)程當(dāng)中cpu沒(méi)有及時(shí)處理完這個(gè)隊(duì)列導(dǎo)致網(wǎng)卡的buffer滿了,網(wǎng)卡將直接丟棄該數(shù)據(jù)包。這里牽涉到2個(gè)隊(duì)列,一個(gè)是tx,一個(gè)是rx,它的隊(duì)列的大小默認(rèn)都是255,可以通過(guò)ethtool -g eth0(你指定的網(wǎng)卡),為了防止丟包,當(dāng)時(shí)我通過(guò)ethtool -G eth0 rx xxx 把它調(diào)大了,但是調(diào)大以后,還是杯水車薪啊,通過(guò)ethtool -S eth0 |grep rx_fw_discards,發(fā)現(xiàn)數(shù)值還是不停的在增長(zhǎng),也就是說(shuō)還在不停的丟包,cpu處理不過(guò)來(lái),這時(shí)候找到網(wǎng)上有人在利用lvs時(shí)也遇到這個(gè)問(wèn)題,cpu軟中斷分配不均衡,只有一個(gè)cpu處理軟中斷的問(wèn)題,網(wǎng)上的資料五花八門,有建議使用修改設(shè)備中斷方式。即通過(guò)修改設(shè)置中斷/proc/irq/${網(wǎng)卡中斷號(hào)}/p_affinit這時(shí)候,我也修改過(guò),沒(méi)有什么實(shí)質(zhì)的效果,
從官方的bug報(bào)告,
,其中提到rhel5.6已經(jīng)修復(fù)了這個(gè)bug,這其中也提到目前我們的版本可以升級(jí)內(nèi)核到kernel-2.6.18-194.3.1.el5可以解決這個(gè)問(wèn)題。
紅帽子官方修復(fù)報(bào)告中的說(shuō)明如下:
,我們升級(jí)了這個(gè)內(nèi)核算是解決單核處理軟中斷的問(wèn)題,升級(jí)后各個(gè)cpu已經(jīng)能夠平均的分配這個(gè)軟中斷,也不丟包了,那么為什么cpu處理不過(guò)來(lái)這個(gè)軟中斷呢,數(shù)據(jù)量并不是特別的大啊,上層應(yīng)用接到這個(gè)數(shù)據(jù)包后,通過(guò)路由協(xié)議,找到某個(gè)出口給nat出去,找nat出口是需要查找路由表,查詢路由表是一件很耗時(shí)的工作,而每一個(gè)不同源地址,不同目的地址的數(shù)據(jù)包都得重新查找一次路由表,導(dǎo)致cpu處理不過(guò)來(lái),為了提高路由查詢的效率。Linux內(nèi)核引用了路由緩存,用于減少對(duì)路由表的查詢。Linux的路由緩存是被設(shè)計(jì)來(lái)與協(xié)議無(wú)關(guān)的獨(dú)立子系統(tǒng),查看路由緩存可以通過(guò)命令route -Cn,由于路由緩存當(dāng)中是采用hash算法進(jìn)行才找,它的查找速度非常之快,既然是cache就有超時(shí)這一概念。系統(tǒng)默認(rèn)為10分鐘,可以通過(guò)這個(gè)文件進(jìn)行查看和修改/proc/sys/net/ipv4/route/secret_interval。而當(dāng)路由緩存當(dāng)中未找到或者已經(jīng)超時(shí)的路由信息才開(kāi)始查找路由表,查詢到的結(jié)果保存在路由緩存中。如果路由表越大,那么查詢的時(shí)間就越長(zhǎng),一個(gè)新的連接進(jìn)來(lái)后或者是老連接cache超時(shí)后,占用大量的cpu查詢時(shí)間,導(dǎo)致cpu周期性的軟中斷出現(xiàn)100%,而兩個(gè)網(wǎng)卡丟包的情況來(lái)看不均衡也是因?yàn)橛脩舻臄?shù)據(jù)包是經(jīng)過(guò)其中一個(gè)網(wǎng)卡進(jìn)來(lái)后查詢路由表耗時(shí)過(guò)長(zhǎng),cpu處理不過(guò)來(lái),導(dǎo)致那塊網(wǎng)卡的隊(duì)列滿了,丟包嚴(yán)重。當(dāng)然在路由表變動(dòng)不大的情況下可以加大cache的時(shí)間,修改上述內(nèi)容后,從我監(jiān)測(cè)的情況來(lái)看,扛流量能力得到了大大的提升。
linux內(nèi)中斷與外中斷區(qū)別的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux內(nèi)中斷與外中斷區(qū)別,Linux內(nèi)中斷與外中斷的異同,AVR單片機(jī)中,舉例說(shuō)明什么是外部中斷和內(nèi)部中斷。說(shuō)明外部中斷(INT0和INT1)有哪幾種觸發(fā)方式?,linux 內(nèi)核軟中斷 是在中斷狀態(tài)嗎的信息別忘了在本站進(jìn)行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。