私は小さなアプリケーションを使ってLinuxでスケジューリング戦略を学びたいと思いますC++
。これは同じようにうまく機能しますC
。次のコードを使用してアプリケーションの優先順位を変更しています。
sched_param tParam;
sched_getparam(0, &tParam);
tParam.sched_priority = 20;
sched_setscheduler(0, SCHED_RR, &tParam);
rt
私のアプリの実行中にリアルタイムで表示したいのですtop
が、そうではありません。これが私が得るものです:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2652 root -21 0 145452 63460 11444 R 1.3 1.6 0:02.08 myRealTimeApp
負の値PR
。しかし、実行すると、次のようなchrt -p 2652
結果が得られます。
pid 2652's current scheduling policy: SCHED_RR
pid 2652's current scheduling priority: 20
これは意味があります。
top
rt
優先順位をに上げないと、99
申請書は表示されません。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2770 root rt 0 145452 63460 11444 S 1.0 1.6 0:01.93 myRealTimeApp
私の質問は次のとおりです
優先順位がに設定されていない場合、
top
私のアプリケーションがライブアプリケーションと見なされないのはなぜですか99
?top
優先順位は負ではなく、なぜ負で表示されますか?優先順位を決めるとどのような危険がありますか
99
?
答え1
プロセスがリソースをほとんど占有していない場合は、心配する必要はありません。リアルタイムで実行できますが、大きな違いはありません。関連するプロセスが CPU に過負荷を与え、必要なタスクがタスクを完了できないようにすると、リスクと問題が発生します。
通常、(優先順位0)以上の操作を実行する必要はありません。renice -20
これは、ユーザーが直接上書きするプロセスを除いて、重要でないプロセスよりも優先されるためです。
RTで優先順位を定義して設定すると、-21
ウィンドウマネージャ、ログインプロセス、さらにはネットワーク管理を含むがこれらに限定されない重要なプロセスが実際に上書きされます。幸いなことに、障害が原因でプロセスがすべてのCPUリソースを消費しても、システムは重要なタスクを処理し続けます(効率が低下しても)。
プロセスが真のリアルタイムと見なされるのに十分重要であり、すべてのCPUリソースが必要であると判断すると、他のすべての非リアルタイムプロセスが停止します。システムがすでに実行されている以外は何も実行されず、多くのタスクが失敗したり信頼できなくなるため、これは災害の確実な方法です(主にディスクとネットワークへのアクセス)。スワップ制御も影響を受け、システムの利用可能なメモリ管理機能に副作用が発生する可能性があります。
上記の問題を回避するには、プロセスが正常に機能するようにプロセスに低い優先順位を付けることがより合理的です。
一部のシステムはリアルタイムで実行するように設計されていますが、これは望ましくない結果を防ぐためにすべての優先順位と操作プロセスを大規模に再設計する必要があることを意味します。