2011-02-10 7 views
1

埋め込みターゲットの実行フローをエミュレートしようとするアプリケーションを開発する必要があります。このターゲットには2つのレベルの優先順位があります。優先度の低いレベルはラウンドロビンスケジューラで管理され、各スレッドに1msずつ順番に実行されます。正常に(つまり、最終的に協調的に)スレッド実行を中断する

私の目標は、ターゲットで使用できるthread_create、thread_start、およびすべてのシステムコールを提供するライブラリを作成し、標準のPCでその動作をネイティブに再現するためにPOSIX関数を使用することです。
したがって、高優先度のスレッドが実行されるとき、低優先度のスレッドは、その時点で何をしていても中断する必要があります。優先度の低いスレッドの実装が摂動されないようにするのは、それが責任です。

私は現在、スレッドを中断するのは安全ではないので、なぜ「中断(pid)」機能が見つからないのか説明しています。

私は基本的な問題への2つのソリューションを想像:
は、優先度の高いスレッドを開始するには(これ以上の優先度の高い活動があるときに、それらを再開)
-periodically呼び出すときに、優先度の低いスレッドを一時停止する方法を-find優先度の低いコードでは非常に小さな「suspend_if_necessary」関数が呼び出され、高い優先度を開始する必要があるときは、優先度の低いすべてのプロセスがその関数を呼び出して中断されるのを待ってから単一の高優先度スレッドとして実行し、

私は2番目の解決策を気に入っていますが、まだ1つの問題があります。すべてのコードを変更せずにどこでも関数を呼び出す方法は? 簡単な方法があるのでしょうか?デバッグコードのようなものです:実行されるすべての行でフックコールを追加してフラグをチェックし、そのフラグが変化したときに特定のコードを実行しますか?

私は本当にターゲットの実行フローの動作と代表である必要があるため、その問題に対する簡単な解決策があれば、私はとても幸せになりたい...事前に

おかげで、

Goulou。

+0

ちなみに、high prioスレッドは、low prioスレッド、外部割り込み、スリープ後に起動される3つのソースのみで開始できます。これらのソースはすべて私のライブラリ内にあるので、私はそれを "認識"していて、すぐに他のスレッドにメッセージを送ることができます。 – Goulou

答えて

1

残念ながら、真のスレッドで必要なものを実装することは本当に可能ではありません。たとえ高位prioスレッドが再起動されても、高位prioスレッドが再びスケジュールされる前に任意に長くかかり、すべての低優先度スレッド。さらに、POSIXスレッドのみを使用して高優先度のスレッドがブロックされているかどうかを判断する信頼できる方法はありません。手動でトラッキングを試みることはできますが、誤検出(スレッドはブロックされていますが、低プレオースレッドは実行中でサスペンドしていると見なします)と偽陰性(再開されたアノテーションが欠落しているか、スレッドは実際に再開され、スレッド自体が実行中であるとマークされます)。

純POSIXを使用してスレッド優先順位システムを実装する場合は、にはではなく、setcontextを協力マルチタスクに使用するオプションがあります。これにより、ユーザーレベルでスレッド間をスワップすることができます。ただし、この場合は明示的にCPUを生成する必要があります。それはまた、あなたのアプリのすべてのスレッドをブロックするsyscallをブロックするのに役立ちません。エミュレータを書いているので、これは問題ではないかもしれません。

でもシグナルハンドラ内でsetcontextを使用してスレッドをスワップできます。私はこのケースを自分でテストしていませんが、SIGALRMハンドラでsetcontextを使ってスケジューリングを試す価値があります。

+0

あなたの最初のポイントについて:私の考えでは、優先度の高いスレッドは、他のすべてのアクティブなスレッド(私はそれらを数えることができる)が実際に中断されるまで、ロック(セマフォ)を待つでしょう。欠けている唯一のことは、他のすべてのスレッドがこの "suspend_if_necessary"関数を呼び出すようにすることです。 もう一方の端では、高および低優先スレッドは、ライブラリ内の何か(イベント、パイプ読み込み...)でしかブロックできないので、これは私がinternalyで制御していると考えているものです。 ..) – Goulou

0

スレッドを中断するには、スリープ状態にします。コマンドで起動するには、sigwaitを使用してスリープ状態にしてください。信号を受信するまで、スレッドはスリープ状態になります。特定のスレッドにpthread_kill(狂気の名前ですが、実際にはスレッドに信号を送るだけです)というシグナルを送ることができます。これは、スレッドをスリープ状態にして起床させる非常に速い方法です。条件変数よりも40倍速く、非常に簡単です。

関連する問題