オペレーティングシステムの概念は次のとおりです。
I / O中にさまざまなデバイスコントローラがサービスを提供する準備ができたら、割り込みを発生させます。このような中断は、次のことを意味します。
- 出力が完了したか
- 入力データが利用可能
- エラーが検出されました。
出力の準備ができているか、入力が完了したことを示す割り込みが使用されますか?
そうでない場合は、別の方法で表現する必要がありますか?
答え1
答えは「はい」なので、タイトルにまたはを入れることをお勧めします。
言い換えれば、正しい答えは、あなたが要求する正確な割り込みによって異なります。 SPIポートとDMAを例に挙げてみましょう。 SPIは双方向シリアルインタフェースです。
例えば、DMA割り込みがいわゆる水位を表示するのが一般的である。 DMAバッファがいっぱいになったとき、「ほとんどいっぱいになったとき」(例:3/4)、「ほとんど空」(例:1/4)、完全に空になったときに割り込みを生成します。
SPI ポートの場合、2 つの DMA チャネルがあります。一方のチャネルは外部デバイスのデータを処理し、もう一方のチャネルはコンピュータからデバイスに転送されたデータを処理します。
したがって、出力DMAチャネル割り込みがバッファが空であることを示す場合、出力が完了したことを意味する。入力DMAチャネル割り込みがバッファが空でないことを示す場合、これは入力データが使用可能であることを意味する。
答え2
出力が完了したか
出力が準備されたことを示すためにも割り込みが使用されますか?
はい。
シリアルポートデバイスへの書き込みを検討してください。デバイスには、少量のデータ(16バイトなど)を格納するために使用されるFIFOという受信バッファがあります。
どちらの場合も、中断が発生する可能性があります。
- バッファが空になり、出力は次のようになります。十分。これは
tcdrain()
Linuxで実装されています。 「この機能は、出力に影響を与えるパラメータを変更するときに使用する必要があります」と言います。たとえば、シリアルポートの「ボード速度」(周波数)を変更したい場合は、バッファリングされたすべてのデータが現在のボード速度を使用して転送されるのを待つことができます。 - バッファからバイトが転送されました。これでスペースを使用できます。デバイスは今準備するCPU は別のバイトをバッファにプッシュします。
入力データが利用可能
入力が完了したことを示す割り込みも使用されますか?
おそらく。しかし、少なくとも私の場合、ここに2つの異なるものがあるかどうかはわかりません。
シリアルポートデバイスから読み込むことを検討してください。デバイスには、少量のデータ(16バイトなど)を格納するために使用されるFIFOという転送バッファがあります。
FIFOが入力から少なくとも1バイトを収集すると、デバイスは割り込みを送信します。例えば、CPUに接続された線の電圧を低電圧から高電圧に変化させることができる。
CPUはIOポートまたはIOメモリから読み取ってバッファのバイトを消費できます。
注:このタイプのトランザクションは、システムRAMから読み取るよりも時間がかかる場合があります。これを行うには、IOデバイスがバスに「スタンバイ状態」を挿入する必要があります。つまり、IOデバイスが「データ準備」ビットを設定する前に複数のバス周波数サイクルを取ることができる短いハンドシェイクがあります。スタンバイ状態は、IOポート/IOメモリへの書き込みにも適用されます。ただし、スタンバイ状態は、異なるデバイス間の動作頻度/遅延時間の既知の違いを処理するためにのみ使用されます。外部入力または出力を待つために使用されません。これは、CPUが継続して実行されるのを防ぐためです。何もない他のもの。
したがって、入力が可能になると割り込み信号が発生します。必要に応じて、CPUが入力バイトを読み取ったときに入力が「完了」したと言うことができます。ただし、信号の送信に割り込みは必要ありません。メモリ読み出しが完了したことを知らせるために割り込みが不要な場合と同じです。
入力バッファがいっぱいになった状態は、実際にはエラー状態に似ています。つまり、バッファオーバーフローを示します。この状態は実際にデバイスによって記録され、オペレーティングシステムでエラーを検出できます。しかし、オーバーフローのために特に割り込みを送る理由はありません。入力が可能な場合は、デバイスが割り込みを送信した可能性があるためです。
答え3
ほとんどの最新のデバイスは、重要なイベントが発生したときに中断を引き起こします。
ただし、中断により費用がかかる場合があります。プロセッサが現在実行中のタスクをブロックして割り込みを処理するようにします。割り込みが多すぎると実際に残りあなたのオペレーティングシステム。 Bluetooth割り込みが多すぎる(例:毎秒700,000回以上)問題がありました。
暗黒期のApple 2では邪魔が全くありませんでした。すべては世論調査方式の計画を通じて行われます。 I / Oポートを読み取り、個々のビットに基づいて新しいデータを読み取るかどうかを知ることができます。たとえば、フロッピーディスクからバイトをロードするには、バイトが負になるまで(ビット7が設定されている)ループを繰り返します。
$1
LDA 0xC030
BPL $1
Intelプロセッサ(および他のプロセッサ)では、割り込みが深刻に過負荷になります。つまり、VBL 割り込み、USB ポート割り込み、または新しい SSD ドライブから割り込みを受け取る場合は、すべて割り込み 0x20 を使用できます。次に、どのサービスをサービスする必要があるかを判断するのはCPUの使命です。最後のケースでは、複数のデバイスが同じ割り込みを発生します。同時に、他の割り込みが発生しないため、戻ってくる前にすべてがサービスされていることを確認する必要があります(つまり、ほとんどのデバイスはサービスを開始する前に繰り返さない割り込み信号を送信します)。
詳細は、1つの割り込みが処理されている間にCPUがより多くの割り込みをブロックすることです(/ Intelプロセッサの場合STI
)。CLI
これは、現在の割り込みに対してすべての操作を実行でき、最終的には他の割り込みを処理する必要があることを意味します。これにより、I/O データ処理のシリアル化が保証されます。これが、我々がデバイスから比較的少量のデータを取得する理由です。これにより、データをユーザースペースに配置し、必要な数のスレッドで処理できます。最新のCPUでは、各特定の割り込みを別々のCPUで処理できます。これにより、複数の割り込みを並列に処理できます。しかし、これまで見たところでは、どのCPUがどの割り込みを処理するかを事前に決定する必要があります。 CPU間で「ピンポン」は行われません。