次の文章についてご意見をお寄せください。
rtパッチがない標準のLinuxカーネルでは、割り込みが進行中のシステムコールを中断することはできません。ハードドライブからデータをインポートするときにマシンが動作を停止しない理由は、その操作に使用するシステムコールがブロックされるためです。ブロックとは、ハードドライブに要求した後にプロセス状態をブロックされた状態に変更し、自発的にプロセッサ時間を放棄することを意味します。非リアルタイムカーネルで進行中のシステムコールを中断することはできません。
これはトピックの私の理解ですが、それが正しいかどうかはわかりません。
答え1
以下を使用してシステムコールを中止できます。シグナルSIGINT
、(CTRL+によって生成されたC)SIGHUP
などのPIDを介してのみシステムコールと対話してシステムコールを中断できますが、Unixシグナルやコマンドを使用するときはそうではありませんkill
。
rt_patchとシステムコール
@Alanは次の質問をしました。
メインラインLinuxカーネルでrt_patchを受け入れることに直接関連するシステムコールを中断する可能性はありますか?
私の答え:
そう思います。この質問を調べている間、私はあなたがこれを行うことができる/できないという決定的な証拠を見つけることができず、これは私があなたができると信じていました。
私がそう思う別のデータポイントは潜在的にシグナルプロセスと対話するには、Unixに組み込まれたメカニズムが必要です。これらのパッチが適用されたシステムを使用せずにどのように実行できるかはわかりません。シグナル。
ところで、信号はプロセスレベルで動作します。私が知る限り、システムコールに割り込みを直接挿入するメソッド/APIはありません。
引用する
答え2
もちろん、適切なスピンロックを使用しない場合、または割り込みが無効になっていない限り、割り込みはシステムコールを中断できます。
spin_lock_irq*()
スピンロックを取得し、ハードウェア割り込み(ソフトウェア割り込みとジョブ処理を含む)を無効にします。spin_lock_bh()
スピンロックを取得し、ソフトウェア割り込みとマイクロスレッドを無効にします。irq_disable()
ハードウェア割り込みを禁止します。local_bh_disable()
ソフトウェア割り込みとマイクロスレッドを無効にします。preempt_disable()
プリエンプションを無効にすると、上記のこともプリエンプションを無効にします。
非プリエンプティブカーネルでは、ジョブはカーネルモードの他のジョブをプリエンプトできません。したがって、タスクAが唯一のCPUで過度のシステムコールを実行し、タスクBがオーディオデバイスにいくつかのデータを書き込む必要がある場合、タスクBはタスクAがシステムコールを終了するのを待たなければならず、それがワンクリックでオーディオを失うできます。声。このような状況にはプリエンプティブカーネルが適しています。