時間の経過とともに成長してきたほとんどのシステムと同様に、やや複雑です。さまざまなことがさまざまなレベルで行われます。例: IRQを覚えていますか? 現在、高レベルのプログラムではそれらについてあまり心配していませんが、10 年か 20 年ほど前には、ハードウェアが競合する IRQ を使用していないことを確認する必要がありました。これらは文字通りハードウェア コールバック セットアップでした (まだ更新された形式です (十分なリンクを投稿できませんが、以前のウィキペディアの記事には APIC アーキテクチャへのリンクがあります)。しかし、私は何年もそれらに対処する必要はありませんでした)。システムにはいくつかの小さなルーチンがあり、CPU (これは x86 CPU 上にありました) はそのコードのアドレスを「割り込み要求ライン」に割り当てます。次に、その回線の反対側のハードウェアが信号を送ると、CPU はすべてを破棄し、そのコードのビットにジャンプします。
ただし、質問 (i) のように、より複雑なケースもあります。明らかに、マウス カーソルが Chrome ウィンドウに入るためのハードウェア割り込みはありません。何が起こるかというと、OS はマウスの動きに対するハードウェア割り込みをキャッチし、その情報を使用してカーソル位置を更新します (もちろん、ハードウェア カーソルを提供し、さらに調査の水を濁らせることができるAllegroのようなライブラリがあります)。次に、OS は、さまざまなマウス移動イベントについて通知するように要求したプログラム (およびそれぞれに通知する方法) のリストを取得し、OS はそのリストを調べて、どのプログラムに通知する必要があるかを計算します。
(ii) 最も一般的な割り込みの 1 つはタイマーであるため、実際にはより単純です。一般に、OS は依然として (i) のようにハードウェアとプログラムの間のバッファーとして機能します。
(1) 一定の間隔で何かをしたいことがよくありますが、プログラムは通常、繰り返しポーリングする必要はありません。ただし、OS によって動作が異なる場合があります。たとえば、前述の割り込みルーチンは、割り込みが中断されたり、他のイベントが無視されたりしないように、非常に高速である必要があります。そのため、一般的な戦略の 1 つは、何かが発生したことを示すメモリを割り込みルーチンに設定させ、OS ループの通常の部分でそれらのメモリ位置を定期的にポーリングさせることでした。ただし、これはシステムの問題であり、アプリケーションの問題ではありません。
(2) 私がよく知っているほとんどのオペレーティング システムは、イベント コールバック API を提供します。古い MS-DOS のように、多くの API を提供せず、(ハードウェアとソフトウェアの両方の割り込みに対して) 独自の割り込みハンドラーを割り当てることができるものもありました。最近のほとんどの OS は、スケジューラーを介してこの機能を公開しています。プログラムは、特定のイベントまたは一連のイベントを待っている間、制御を放棄します。さまざまなライブラリが、これを独自の内部イベント ループ内に隠しています。コールバック関数は、これらのライブラリの内部イベント ループを処理する一般的な方法です。私は Objective C について完全に話す資格はありませんが、それは C の厳密なスーパーセットであるため (ウィキペディアによると)、C と同じ方法でコールバックを使用できます (ただし、悪いスタイルと見なされる可能性があると思います)。
それがあなたが探している情報のいくつかを提供することを願っています。