私は自分のミニ Hello World OS を使い始めることができるように、コンピューターなどに関するハードコアな研究を行っています。
私はカーネルがどのように機能するかを調べていて、カーネルが実行されておらず、スレッドにそうする命令がないにもかかわらず、カーネルが現在のスレッドをカーネルに戻す方法を知りたいと思っていました(別のスレッドに切り替えることができます)。
数ナノ秒後にカーネルに戻るある種の CPU 割り込みを使用しますか?
私は自分のミニ Hello World OS を使い始めることができるように、コンピューターなどに関するハードコアな研究を行っています。
私はカーネルがどのように機能するかを調べていて、カーネルが実行されておらず、スレッドにそうする命令がないにもかかわらず、カーネルが現在のスレッドをカーネルに戻す方法を知りたいと思っていました(別のスレッドに切り替えることができます)。
数ナノ秒後にカーネルに戻るある種の CPU 割り込みを使用しますか?
ある種のCPU割り込みを使用していますか
はい! 最新のプリエンプティブカーネルは、優れたI / Oパフォーマンスを提供するために、ハードウェアからの割り込みに完全に依存しています。キーボード、マウス、ディスク、NIC、USBなどのドライバーはすべて割り込みから入力され、必要に応じて(たとえば、データが利用可能な場合)、それらのドライバーを待機しているスレッドを準備/実行することができます。
スレッドは、呼び出し元自身の状態を別のスレッドの状態に変更するOS呼び出しを行った結果として、状態を変更することもできます。
ハードウェアタイマーからの割り込みは、多くの割り込みソースの1つであり、多くのシステム操作にこの割り込みによって通知されるタイムアウトがあるという点でのみ特別です。それ以外は、タイマー割り込みによってスケジュールが変更されるだけで、ほとんどの場合、何も変更されません。スレッドの準備完了/実行状態。マシンがコアよりも準備ができているスレッドが多くなるまでCPUが大幅に過負荷になると、タイマー割り込みの副作用が発生し、準備ができているスレッド間でCPU時間が共有されます。
タイマー割り込みに固執しないでください。他のドライバー割り込みは絶対に必要です。タイマー割り込みをまったく使用せずに、機能的なプリエンプティブマルチスレッドカーネルを構築することは不可能ではありません。
数ナノ秒後にカーネルに戻るある種の CPU 割り込みを使用しますか?
カーネルが現在アクティブなスレッドを実行し続けるか、別のスレッドに切り替えるかを決定するのは、タイマー割り込みと (ブロッキング) システム呼び出しの間です。scheduler_tick()
タイマー割り込みハンドラーは、現在実行中のプロセスおよびプロセス/スレッドをプリエンプトする必要があるかどうかを決定する関数について、消費されたシステム時間やユーザー時間などのリソースの使用状況を更新します。
Linux Kernel Development bookの 62 ページの「Preemption and Context Switching」を参照してください。
ただし、カーネルは、いつ schedule() を呼び出すかを認識している必要があります。コードが明示的に呼び出した場合にのみ schedule() を呼び出した場合、ユーザー空間プログラムは無期限に実行される可能性があります。代わりに、カーネルは、再スケジュールを実行する必要があるかどうかを示す need_resched フラグを提供します (表 4.1 を参照)。このフラグは、プロセスが横取りされる必要がある場合は scheduler_tick() によって設定され、優先度の高いプロセスが優先される場合は try_to_wake_up() によって設定されます。カーネルはフラグをチェックし、フラグが設定されていることを確認し、schedule() を呼び出して新しいプロセスに切り替えます。フラグは、スケジューラをすぐに呼び出す必要があるというカーネルへのメッセージです。別のプロセスを実行する価値があるためです。