10秒ごとに実行され、リソースを大量に消費するプロセスがあるかどうかをスキャンするLinuxカーネルモジュールがあります。次に、それらを1分間一時停止し(つまり、コードを6回ループする)、後で再度実行する必要があります。条件をチェックするコードをすでに記述しており、適切なtask_structポインターをすべて持っています。
問題は、task_structポインターを指定して、タスクを一時停止するにはどうすればよいですか?そして後で、どうすればそのタスクを再開できますか?
シグナルを送信してプロセスを一時停止し、STOP
シグナルを送信して再開することができCONT
ます。おそらく経由kill_pid(task_pid(task_struct), SIGSTOP, 1)
してkill_pid(task_pid(task_struct), SIGCONT, 1)
、例えば。
そのアプローチは完璧ではありません。たとえば、別のプロセスは、タイムアウト期間中にシグナルCONT
をブロックしない限り、シグナルを送信することでそのようなプロセスを実行し続けることができます。CONT
たぶん、実行キューからタスクを削除し、どこかに保存して、後で元に戻すことができます。
別の方法は、その優先順位を下げることです。これは実行を妨げるものではありませんが、CPUを独占することを防ぎます。