Linuxスケジューリング 4

前回はシェルそのもののプロセスIDを指定して、FIFOに変更させましたが、個別のスクリプトをFIFO,99の優先度で無限ループさせても同じようにOSがフリーズします。

今回はこれを試しました。

[用意したスクリプト] #loopTest.sh #!/bin/bash`

while: do true; done

[手順] 1 . loopTest.shを実行

# ./loopTest.sh

2 . loopTest.shのプロセスIDを取得

# ps aux | grep loopTest.sh ->例えばPID=3511とする。

3 . 優先度とスケジューリングポリシーを変更

 # chrt -f -p 99 3511

このとき、RT Throttlingを無効化していないと、以下のエラーがでます。

chrt : failed to set pid 3511's policy :許可されていない操作です

RT Throttlingは、無限ループになってOSそのもののフリーズになることを防ぐため、プロセスが単位時間当たりに持てるCPU時間に制限を付けるものです。

この制限を無効化するには、以下を-1に設定します。 # sysctl -w kernel.sched_rt_runtime_us=-1

4 . 3を実行した直後にもう動かなくなる。

自分の場合、最初whileで動かすスクリプトにechoを入れて、echoを繰り返し呼ばせていましたが、そのときはフリーズしませんでした。

Linux kernelに詳しい方に教わったところ、echoを使ったことに原因があることがわかりました。

echoはwriteのシステムコールを発行して、シェルに文字列を出力させていますが、writeを呼ぶ間はechoを呼んだプロセス(loopTest.sh)はsleepしています。

そのため、いくら優先度99でも自分がsleepしているので、キーボード操作を受け付ける、というわけです。

勉強になりました。。

広告を非表示にする