1. ホーム
  2. linux

[解決済み] Uninterruptible Processとは何ですか?

2022-04-28 03:43:42

質問

Linuxでプログラムを書いていて、何らかのバグでクラッシュすると、そのプログラムが中断できないプロセスになって、コンピュータを再起動するまで(ログアウトしても)永遠に動き続けることがあります。 私の質問は

  • プロセスが中断されなくなる原因は何ですか?
  • どうすればそれを阻止できますか?
  • 馬鹿な質問かもしれませんが、パソコンを再起動せずに中断する方法はないのでしょうか?

解決方法は?

割り込み禁止プロセスとは、たまたまシステムコール(カーネル機能)の中にいて、信号で割り込むことができないプロセスのことです。

その意味を理解するためには、割り込み可能なシステムコールの概念を理解する必要があります。古典的な例としては read() . このシステムコールは、ハードディスクを回転させたり、ヘッドを移動させたりする可能性があるため、長い時間(数秒)を要することがあります。この間、プロセスはスリープし、ハードウェア上でブロックしています。

システムコールでプロセスがスリープしている間に、Unixの非同期シグナル(例えばSIGTERM)を受信することができ、その後次のようなことが起こります。

  • システムコールが早期終了し、ユーザースペースに-EINTRを返すように設定されます。
  • シグナルハンドラが実行される。
  • プロセスがまだ実行中であれば、システムコールからの戻り値を取得し、同じ呼び出しを再度行うことができます。

システムコールから早期にリターンすることで、ユーザースペースのコードがシグナルに応答して即座に動作を変更することができます。例えば、SIGINTやSIGTERMに反応してきれいに終了させることができます。

一方、この方法での割り込みが許されないシステムコールもあります。何らかの理由でシステムコールが停止した場合、プロセスはいつまでもこの不殺生状態にとどまることができる。

LWNは いい記事 7月にこの話題に触れました。

最初の質問に答えます。

  • これを防ぐには: トラブルの原因となっているドライバを突き止め、使用をやめるか、カーネルハッカーになってそれを修正します。

  • 中断できないプロセスを再起動せずに終了させる方法:何らかの方法でシステムコールを終了させる。電源スイッチを押さずにこれを行う最も効果的な方法は、しばしば、電源コードを引くことです。また、LWN の記事で説明されているように、カーネルハッカーになって、ドライバに TASK_KILLABLE を使用させることも可能です。