ホームページ > 記事 > システムチュートリアル > Linux CPU 割り込み: 非同期イベントと一般的な処理メカニズム
Linux 割り込みは、いつでも発生する可能性がある非同期イベントであり、プログラムの通常の実行フローを中断する可能性があります。これらの割り込みを処理するために、Linux カーネルは一般的な割り込み処理メカニズムを提供します。
割り込みは、実際にはハードウェアまたはソフトウェアによって送信される IRQ (割り込み要求) と呼ばれる信号です。
割り込みを使用すると、キーボード、シリアル カード、パラレル ポートなどのデバイスが CPU を必要としていることを示すことができます。
CPU が割り込み要求を受け取ると、CPU は実行中のプログラムの実行を一時的に停止し、割り込みハンドラまたは割り込みサービス ルーチン (割り込みサービス ルーチン) と呼ばれる特定のプログラムを呼び出します。
割り込みサービス ルーチンまたは割り込みハンドラーは、メモリ内の固定アドレスにある割り込みベクタ テーブル内にあります。 CPU によって割り込みが処理された後、以前に中断されたプログラムの実行が再開されます。
実際には、マシンが起動すると、システムはすでにすべてのデバイスを識別し、対応する割り込みハンドラーを割り込みテーブルにロードしています。
CPU アテンションをリクエストするには、次の 2 つの方法があります:
\1. 割り込みに基づく
\2. 投票に基づく
すべての Linux オペレーティング システムは割り込みドライバーに基づいています。
キーボードのキーを押すと、キーボードは CPU にキーが押されたことを伝えます。この場合、キーボードの IRQ ラインの電圧が 1 回変化します。この電圧変化はデバイスからのリクエストであり、デバイスが処理する必要のあるリクエストを持っていると言うのと同じです。
/proc/割り込みファイル
Linux マシンでは、ファイル /proc/interrupts には、どの割り込みが使用されているか、および各プロセッサが何回割り込まれたかに関する情報が含まれています。
上記のファイルの出力は次のように説明されます:
● 最初の列は IRQ 番号を示します
● 2 列目、3 列目、4 列目は、対応する CPU コアが中断された回数を示します。上記の例では、timer は割り込み名 (システム クロック) を表します。 3710374484 は、CPU0 が 3710374484 回割り込まれたことを意味します。 i8042 は、キーボードとマウスを制御するキーボード コントローラーを表します。
● rtc (リアルタイムクロック) などの割り込みの場合、CPU は中断されません。 RTC は電子デバイスに存在し、時間を追跡するために使用されるためです。
● NMI および LOC はシステムによって使用されるドライバーであり、ユーザーがアクセスして設定することはできません。
IRQ 番号は、CPU によって処理される必要がある優先順位を決定します。 IRQ 番号が小さいほど優先度が高くなります。
たとえば、CPU がキーボードとシステム クロックの両方から割り込みを受信した場合、CPU の IRQ 番号は 0 であるため、CPU は最初にシステム クロックを処理します。
● IRQ0:システムクロック(変更不可)
● IRQ1: キーボードコントローラー (変更不可)
● IRQ3: シリアルポート 2 のシリアルポートコントローラ (シリアルポート 4 がある場合は、この割り込みも使用します)
● IRQ4: シリアルポート 1 のシリアルポートコントローラ (シリアルポート 3 がある場合は、この割り込みも使用します)
● IRQ5: パラレル ポート 2 および 3 またはサウンド カード
● IRQ6: フロッピー ディスク コントローラ
● IRQ7: パラレルポート 1。プリンターで使用されます。プリンターがない場合は、任意のパラレル ポートで使用できます。
ジョイスティック (またはゲーム コントローラー) の CPU の場合、デバイスが割り込みを送信するのを待ちません。ジョイスティックは主にゲームに使用されるため、ジョイスティックの動きは非常に高速である必要があるため、ポーリングを使用してデバイスが CPU の注意を必要としているかどうかを検出するのが理想的です。ポーリング方式を使用する場合の欠点は、CPU がデバイスを複数回チェックするため、CPU がビジー待機状態になることです。ただし、Linux では、この信号処理方法も不可欠であることに注意してください。
ハード割り込み
上で説明したシナリオはすべてハード割り込みの例です。ハード割り込みは主に 2 つのカテゴリに分類されます:
\1. ノンマスカブル割り込み (NMI): この割り込みタイプの文字通りの意味と同様に、この割り込みは CPU によって無視されたりキャンセルされたりすることはできません。 NMI は別の割り込みラインで送信され、通常、メモリ エラー、ファン障害、温度センサー障害などの重大なハードウェア エラーに使用されます。
\2. マスカブル割り込み: これらの割り込みは、CPU によって無視または遅延される可能性があります。このタイプの割り込みは、キャッシュ コントローラーの外部ピンがトリガーされると生成され、割り込みマスク レジスタはそのような割り込みをマスクします。ビットを 0 に設定して、このピンでトリガーされる割り込みを無効にすることができます。
ソフト割り込み
これらの割り込みは、CPU が命令を実行するとき (つまり、プロセスが実行されているとき) に発生します。命令を実行すると、CPU (具体的には CPU 内の演算ユニット) 自体が例外を生成するためです (この例外は、ソフト割り込みとして)。
たとえば、数値を 0 で除算すると (もちろんこれは不可能です)、ゼロ除算例外が発生し、コンピュータが計算をキャンセルするか、エラー メッセージを表示します。
ファイル /proc/stat には、システム カーネルに関する統計情報と割り込み情報が含まれています。
リーリー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核心服务。以上就是教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“Linux”,或扫描下方二维码进行关注,更多干货等着你 !
以上がLinux CPU 割り込み: 非同期イベントと一般的な処理メカニズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。