c/posixの関数の実行時間を制限する方法は?
-
02-10-2019 - |
質問
これに似ています 質問, 、機能の実行時間を制限したいと思います - マイクロ秒の精度で互いに効果的に - C. これ Pythonソリューション。理想的ではありませんが、このようなアプローチはプレーンCでは完全に利用できません。
それでは、POSIXシステムのCの特定の時間間隔の後に関数の実行をどのように中断するのだろうか?比較的単純な状況の場合 愚かなビジネス うまく機能しますが、問題解決策にかなりの量のコードが追加されます。私がそうな機能を持っているとしましょう:
void boil(egg *e) {
while (true)
do_boil(e);
}
私は卵の上で沸騰させたい*、50μsごとに中断して、そうするようなことをチェックしたい:
egg *e = init_egg();
while (true) {
preempt_in(50, (void) (*boil), 1, e);
/* Now boil(e) is executed for 50μs,
then control flow is returned to the
statement prior to the call to preempt_in.
*/
if (e->cooked_val > 100)
break;
}
私はこれを行うためにpthreadsを使用できることを理解していますが、私は彼らの使用を避けることにかなり興味があります。私 たぶん......だろう sigalrmハンドラーのucontext_tを切り替えますが、POSIX標準では、SetContext/swapContextの使用は信号ハンドラーでは使用されないことに注意してください。
この効果です 可能 達成するために?もしそうなら、ポータブルな方法で?
解決
ここで探している一般的な能力が呼ばれていることに注意してください コスト施行. 。たとえば、この記事を参照してください ウェルリング またはで Leung、et。 al。の素晴らしい本. 。上記の回答は、ユーザースペースでそれを達成することに焦点を当てています。一部のRTOまたは言語は、一般的なメカニズムとしてそれをサポートしています(Linuxではなく)。
これを提供する1つの例です AutoSar OS(Spec Linked). 。このOSが提供することに注意してください 実行時間施行, 、それはわずかに異なります 締め切りの執行。 実行時間の施行は、実際のコストを測定する能力(通常はハードウェア協力とともに)を測定する能力に依存しているため、難しくなり続けています。今日のプロセッサの複雑さにより、これを測定することは困難で費用がかかります - 測定の意味(非線形実行や他のあらゆる種類のクールなものによる)は、解釈するのが難しいことは言うまでもありません。コードの実行時間の特定のセクションの最悪または共通または共通)推定。
わずかにトピックですが、ADAはここで言語レベルでより厳格な機能セットを提供しますが、これは役に立ちませんが、LinuxでこれらのADA要件がどのように実装されているかを把握できます。 ADA言語仕様は、根拠のドキュメントを提供するのにユニークです。のセクションを参照してください リアルタイムの先制中断 出発点として。
他のヒント
スレッドを使用するか、関数ポーリングをタイマー(またはによって設定されたグローバル変数)にすることができます SIGALRM
ハンドラー)、その状態を保存し、割り当てられた時間が期限切れになったときに終了します。の使用 ucontext_t
非推奨であり、新しいコードでは、信号ハンドラーからははるかに少なく使用されるべきではありません。
私が望む解決策は突然私に起こります:goto!制限したい関数の直後にジャンプポイントをセットアップし、タイマーを設定し、Sig*alrmを扱う信号ハンドラーに、単に関数後に命令にジャンプします。