Linux CPU的中斷【轉載】

来源:http://www.cnblogs.com/cindy-cindy/archive/2017/07/08/7137810.html
-Advertisement-
Play Games

中斷其實就是由硬體或軟體所發送的一種稱為IRQ(中斷請求)的信號。 中斷允許讓設備,如鍵盤,串口卡,並口等設備表明它們需要CPU。 一旦CPU接收了中斷請求,CPU就會暫時停止執行正在運行的程式,並且調用一個稱為中斷處理器或中斷服務程式(interrupt service routine)的特定程式 ...


中斷其實就是由硬體或軟體所發送的一種稱為IRQ(中斷請求)的信號。

中斷允許讓設備,如鍵盤,串口卡,並口等設備表明它們需要CPU。

一旦CPU接收了中斷請求,CPU就會暫時停止執行正在運行的程式,並且調用一個稱為中斷處理器或中斷服務程式(interrupt service routine)的特定程式。

中斷服務程式或中斷處理器可以在中斷向量表中找到,而這個中斷向量表位於記憶體中的固定地址中。中斷被CPU處理後,就會恢復執行之前被中斷的程式。

其實,在機器啟動的時候,系統就已經識別了所有設備,並且也把相應的中斷處理器載入到中斷表中。

下麵是請求CPU關註的兩種方式:
1. 基於中斷
2. 基於輪詢

所有的linux操作系統都是基於中斷驅動的。

當我們在鍵盤上按下一個按鍵時,鍵盤就會對CPU說,一個鍵已經被按下。在這種情況下,鍵盤的IRQ線路中的電壓就會發生一次變化,而這種電壓的變化就是來自設備的請求,就相當於說這個設備有一個請求需要處理。

/proc/interrupts 文件
在linux的機器上,/proc/interrupts這個文件包含有關於哪些中斷正在使用和每個處理器各被中斷了多少次的信息。
# cat /proc/interrupts 
          CPU0  CPU1  CPU2  CPU3 
  0: 3710374484      0    0    0  IO-APIC-edge  timer 
  1:        20      0    0    0  IO-APIC-edge  i8042 
  6:          5      0    0    0  IO-APIC-edge  floppy 
  7:          0      0    0    0  IO-APIC-edge  parport0 
  8:          0      0    0    0  IO-APIC-edge  rtc 
  9:          0      0    0    0  IO-APIC-level  acpi 
 12:        240      0    0    0  IO-APIC-edge  i8042 
 14:  11200026      0    0    0  IO-APIC-edge  ide0 
 51:  61281329      0    0    0  IO-APIC-level  ioc0 
 59:          1      0    0    0  IO-APIC-level  vmci 
 67:  19386473      0    0    0  IO-APIC-level  eth0 
 75:  94595340      0    0    0  IO-APIC-level  eth1 
NMI:          0      0    0    0
LOC: 3737150067 3737142382 3737145101 3737144204
ERR:          0
MIS:          0

對上面文件的輸出,解釋如下:
● 第一列表示IRQ號
● 第二、三、四列表示相應的CPU核心被中斷的次數。在上面的例子中,timer表示中斷名稱(為系統時鐘)。3710374484表示CPU0被中斷了3710374484次。i8042表示控制鍵盤和滑鼠的鍵盤控制器。
● 對於像rtc(real time clock)這樣的中斷,CPU是不會被中斷的。因為RTC存在於電子設備中,是用於追蹤時間的。
● NMI和LOC是系統所使用的驅動,用戶無法訪問和配置。

IRQ號決定了需要被CPU處理的優先順序。IRQ號越小意味著優先順序越高。
例如,如果CPU同時接收了來自鍵盤和系統時鐘的中斷,那麼CPU首先會服務於系統時鐘,因為他的IRQ號是 0 。
● IRQ0 :系統時鐘(不能改變)
● IRQ1 :鍵盤控制器(不能改變)
● IRQ3 :串口2的串口控制器(如有串口4,則其也使用這個中斷)
● IRQ4 :串口1的串口控制器(如有串口3,則其也使用這個中斷)
● IRQ5 :並口2和3 或 音效卡
● IRQ6 :軟盤控制器
● IRQ7 : 並口1。它被用於印表機或若是沒有印表機,可以用於任何的並口。

而對於像操作桿(或稱為游戲手柄)上的CPU,它並不會等待設備發送中斷。因為操作桿主要用於游戲,操作桿的移動必須非常快,因此使用輪詢的方式檢測設備是否需要CPU的關註還是比較理想的。使用輪詢方式的缺點是CPU就處於了忙等狀態,因為CPU會不停的多次檢查設備。但是需要註意的是在linux中,這種處理信號的方式也是必不可少的。

硬中斷
對於上文所討論的場景都是屬於硬中斷的例子。硬中斷主要分為兩種類別:
1. 非屏蔽中斷(Non-maskable        interrupts,即NMI):就像這種中斷類型的字面意思一樣,這種中斷是不可能被CPU忽略或取消的。NMI是在單獨的中斷線路上進行發送的,它通常被用於關鍵性硬體發生的錯誤,如記憶體錯誤,風扇故障,溫度感測器故障等。
2. 可屏蔽中斷(Maskable interrupts):這些中斷是可以被CPU忽略或延遲處理的。當緩存控制器的外部針腳被觸發的時候就會產生這種類型的中斷,而中斷屏蔽寄存器就會將這樣的中斷屏蔽掉。我們可以將一個比特位設置為0,來禁用在此針腳觸發的中斷。

軟中斷
這些中斷是在CPU執行指令(也就是說在進程正在運行的時候)的時候產生的,因為在執行指令時,CPU(確切的說應是在CPU中的運算器)自身會產生一個異常(此處的異常也可理解為軟中斷)。

例如,一個數字除以0(當然這是不可能的),此時就會導致一個divide-by-zero的異常,從而導致電腦將此計算取消或者顯示一個錯誤的信息。

在文件/proc/stat中,包含了一些關於系統內核的統計信息,也包含了一些中斷信息。
# cat /proc/stat 
cpu  17028082 5536753 5081493 1735530500 42592308 90006 479750 0
cpu0 5769176 1170683 1495750 403368354 39406374 90006 284864 0
cpu1 3714389 1451937 1186134 444082258 1084780 0 64876 0
cpu2 3791544 1471013 1211868 443988514 1056981 0 64764 0
cpu3 3752971 1443119 1187740 444091373 1044172 0 65244 0
intr 417756956 --- Output Truncated

在intr這一行,顯示了自從系統啟動以來所產生的中斷數。第一列表示所有被服務的中斷數。後續的每一列都表示一個特定中斷的總數。

SMP_AFFINITY
SMP是指對稱多處理器。smp_affinity文件主要用於某個特定IRQ要綁定到哪個CPU核心上。在/proc/irq/IRQ_NUMBER/目錄下都有一個smp_affinity文件,這個文件中,所表示的CPU核心以十六進位來表示的。例如,網卡的中斷號是:

grep eth0 /proc/interrupts 
67: 23834931 0 0 0 IO-APIC-level eth0 
                                                                
cat /proc/irq/67/smp_affinity 
00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001

上面的十六進位對應的十進位是1,也就是說所有的和網卡驅動相關的中斷都是有CPU0來提供服務的。

我們可以通過手動改變smp_affinity文件中的值來將IRQ綁定到指定的CPU核心上,或者啟用irqbalance服務來自動綁定IRQ到CPU核心上。


IRQ Balance
Irqbalance是一個linux的實用程式,它主要是用於分發中斷請求到CPU核心上,有助於性能的提升。它的目的是尋求省電和性能優化之間的平衡。你可以使用yum進行安裝:
 # rpm -qa | grep irqbalance 
irqbalance-0.55-15.el5 
# yum search irqbalance 
# yum install irqbalance.x86_64

 

啟動irqbalance服務後,中斷在CPU上的分佈如下:
 # cat /proc/interrupts 
          CPU0    CPU1      CPU2      CPU3 
  0:  950901695        0        0          0  IO-APIC-edge  timer 
  1:        13        0        0          0  IO-APIC-edge  i8042 
  6:        96    10989      470          0  IO-APIC-edge  floppy 
  7:          0        0        0          0  IO-APIC-edge  parport0 
  8:          1        0        0          0  IO-APIC-edge  rtc 
  9:          0        0        0          0  IO-APIC-level  acpi 
 12:        109    1787        0          0  IO-APIC-edge  i8042 
 15:        99 84813914        0          0  IO-APIC-edge  ide1 
 51:      17371        0  46689970          0  IO-APIC-level  ioc0 
 67:      1741        0        0  225409160  PCI-MSI  eth0 
 83:          0        0        0          0  PCI-MSI  vmci 
NMI:          0        0        0          0
LOC:  950902917  950903742  950901202  950901400
ERR:          0
MIS:          0

Irqbalance對於包含多個核心的系統來說是非常有用的。因為通常中斷只被第一個CPU核心服務。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 初識 JavaScript 對象的時候,我以為 JS 是沒有繼承這種說法的,雖說 JS 是一門面向對象語言,可是面向對象的一些特性在 JS 中並不存在(比如多態,不過嚴格來說也沒有繼承)。這就困惑了我很長的時間,當我學習到 JS 原型的時候,我才發現了 JS 的新世界。本篇文章講解了 JavaScr... ...
  • 介紹的非常詳細,也很有調理,內容很詳細 適合於初學者學習 http://www.softwhy.com/qiduan/SVG_source/ ...
  • JavaScriptASP.netSchemeASP網路協議 URL即:統一資源定位符 (Uniform Resource Locator, URL) 完整的URL由這幾個部分構成: scheme://host:port/path?query#fragment scheme(通信協議):常用的htt ...
  • Vysor破解助手(Vysor Crack Assistant),支持破解v1.6.6到v1.7.9之間的所有版本,含Linux、macOS和Windows版;詳細介紹了安卓遠程桌面助手(ARDC)和Vysor的差異,為Windows下Vysor的重度用戶提供了一個新的選擇。 ...
  • 原作者:在這周的文章中,他要消除你對在應用程式中使用Kotlin的所有恐懼。他講解了Java和Kotlin之間的互通性,即你的應用程式代碼可以一部分由Java完成,而另一部分由Kotlin中完成。這樣你就可以逐步開始使用Kotlin,且越來越有信心。 ...
  • 本文介紹Windows 10環境下, MySQL 5.5的安裝使用及免安裝使用 資源下載: MySQL安裝文件:http://download.csdn.net/detail/lf19820717/9892711 MySQL免安裝文件:http://download.csdn.net/detail/ ...
  • 這裡還是按照場景來吧,畢竟場景是最能體驗實用性的。首先說下伺服器配置以及環境   阿裡雲ECS雲主機,8G記憶體,4核的CPU,20M帶寬,20G系統盤+200G數據盤,CentOS6.564位,安裝的一件集成lnmp環境 ...
  • 周末閑來無事,用虛擬機安裝了centos6.5系統,安裝成功後發現不能連接網路,然後我就一臉矇蔽了,無奈之下,只能百度查找問題,幸運的是,我還真找到瞭解決的方法,根據教程一步步操作,成功了!為了避免以後矇蔽,我打算記錄下來,同時如果有其他工程師遇到和我一樣的問題,可以考慮一下我下麵介紹的方法 參考網 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...