RTOSが決定論的であると見なされるのはなぜですか?


8

PC(もちろんOS)では、どのCプログラムもタイミングの点で不確定になります。たとえば、「別のウィンドウを移動する速さ」に応じて、ループは1.2〜1.3秒かかります。これは、OSがプロセス(またはスレッド)に処理能力を共有させるためです。

RTOSに関する限り(組み込みシステム上)、マルチスレッドアプリケーションを作成すると、同時に実行されているスレッドの数に応じて、同じことが起こると思います。

組み込みシステムでこれを正確にテストするための機器がありません。したがって、私は尋ねたかった。私の懸念は合理的ですか、それとも非常に根本的なものを見逃していますか?

編集:例を挙げます。task1(10ミリ秒)とtask2(20ミリ秒)があります。彼らは同時に別々の2つのスレッドで開始しました。私の主張(これも心配ですが、よくわかりません)は、task1がtask2と処理能力を共有しているため、10ms以上かかることです。


決定論には入力のセット(およびタイミング)が含まれます
PlasmaHH 2015年

3
RTOS の定義がありません。;-)
DrFriedParts 2015年

1
RTOSは、個々のタイミング要件を満たす必要がある個々のタスクを実行するために使用されるのではなく、全体として、すべてのタイミング要件を満たす必要があるシステムを実行するために使用されます。決定論的とは、「すべての状況から独立する」ことを意味するのではなく、「状況を十分に理解している場合(優先度の高いタスクが確実に含まれる場合)、上限を予測できる」という意味です。
Wouter van Ooijen

回答:


6

RTOSのタスクが自動的に決定論的であるとは限りませんが、タスクを実行するタイミングと頻度に、より厳しい制約を課すことが可能です。RTOSは通常、タスクに厳しい優先順位を提供します。いつでも、優先度が最も高い準備完了タスクが実行されています。コードの作成者は、実行しているタスクのセットを完全に制御することもできます。あなたがそれらを書かない限り、例えば、ディスクにデータをスワップするためにあなたのコードを中断するかもしれない高い優先度のバックグラウンドタスクがないと合理的に期待できます。

これに加えて、一部のRTOSは協調マルチタスクを提供します。プリエンプティブマルチタスクとは対照的に、協調マルチタスクでは、タスクは、自発的にCPUの制御を放棄するまで実行を続けます。


10

RTOSに関する限り(組み込みシステム上)、マルチスレッドアプリケーションを作成すると、同時に実行されているスレッドの数に応じて、同じことが起こると思います。

いいえ!

それが起こった場合、それはリアルタイムOS(RTOS)ではありません。

簡単に言えば、RTOSの定義はマルチタスクや優先度とは関係がないということです。すべてのタスクがタイミングを保証しているだけです。

RTOSの特性と見なされる残りの部分(優先順位付け、タスク完了など)は、指定された時間間隔内にタスク完了する必要があるシステムを構築した結果(または機能)にすぎません

複雑なエッジケースの多くは基本的に許可されていないため、RTOSでのマルチタスクは、ソフトタイムOSよりも概念的に単純です。


したがって、タスク1に10ミリ秒、タスク2に別々に20ミリ秒かかるとします。それらが同時に(2つの別々のスレッドとして)実行された場合、それぞれ10ミリ秒と20ミリ秒でまだ完了しますか?
ozgur

2
実際、RTOSの重要なポイントは、優先度の低いタスクが優先度の高いタスクと同時に実行されないようにすることです。
pjc50 2015年

1
@ pjc50-あなたのコメントはおそらく失われている重要なポイントだと思います。質問には根本的な誤解が含まれています。「タスク1が開始され、タスク2が同時に開始されました」はありません。優先度の高いタスク(T1)は、T1が終了するか、優先度の高いタスク(T0)によって優先されるまで、優先度の低いタスク(T2)を停止または先取りします。明らかに、タイミングやスペースなどのリソースの制約を満たすために利用可能なリソース以上のものを必要とするタスクを魔法のように有効にできるOSはありません。
gbulmer

2
「利用可能なリソース以上のものが必要なタスクを魔法のように有効にできるOSはありません」-実際、それはできません。しかし、真のRTOSを使用すると、すべての制約が満たされることが保証されているかどうかを事前に知ることができます。
JimmyB 2015年

1
@ozgur:RTOSで実行されるアプリケーションを誤解しています。通常、10ミリ秒と20ミリ秒かかる2つのタスクの代わりに、RTOS上のアプリケーションにはそれぞれ0.01ミリ秒かかるタスクがありますが、タスク1は10ミリ秒ごとに実行し、タスク2は20ミリ秒ごとに実行する必要があります。通常、リアルタイムアプリケーションでは、スレッドを並列実行してCPUパワーを共有することは決してできません。代わりに、スレッドを可能な限り短い時間実行してから、スリープ状態にします。RTOSの要点は、10ミリ秒で起動するように要求すると、10.01ミリ秒ではなくそれが実行されるという保証があるということです
slebetman

6

RTOSは通常、スループットを保証しませんが、代わりにレイテンシを保証できます。

これは通常、以下のFreeRTOSなどの優先システムによって実現されます。

FreeRTOSスケジューラーは、ReadyまたはRunning状態のタスクに、ready状態にある優先順位の低いタスクよりも常にプロセッサー(CPU)時間を優先させるようにします。つまり、実行中の状態に置かれたタスクは、常に実行可能な最も優先度の高いタスクです。

イベントの処理に10ミリ秒かかる優先度1のタスク、別のイベントの処理に100ミリ秒かかる優先度2のタスク、およびバックグラウンドの優先度3のタスクがあるとします。1秒ごとに1つの優先度1のイベントを取得することを期待している場合、優先度2のイベントを処理する最悪のケースは10ミリ秒+ 100ミリ秒であると言えます。優先度3のタスクは、イベントによって任意にスローダウンされる可能性がありますが、優先度が低いため、気にする必要はありません。


あなたの例では、優先度1のタスクと優先度2のタスクが同時に実行されていますか(2つのスレッドが同時に開始されます)?
ozgur

1
可能性としては「はい」、または優先度1が優先度2の実行中に開始されます。この例では、単一のCPUを想定しています。仕様例では、実行できるP1タスクの量も制限されていることに注意してください。10ミリ秒ごとにP1イベントを取得し、処理に10ミリ秒かかる場合、それ以外は何も実行されません
pjc50 2015年

さて、これが私の質問です。task1(10ms)がtask2(100ms)の開始と同時に開始されました。タスク1はタスク2と処理能力を共有しているため、10ミリ秒以上かかると思います。
ozgur

ここでのポイントは、スケジューラがタスク1と2を同時に実行しないことです。タスク1が完了は、それがタスク2.実行するときには、2 10msの後の最初のタスク1(優先度の高い)とキュータスクを実行します
michaelyoyo

1
はい、task1とtask2の実行をインターリーブしません。P1タスクが実行可能である場合、完了するまでP2タスクはスケジュールされません。P2タスクがすでに実行されている場合、それは横取りされ、すべてのP1作業が完了するまで一時停止されます。
pjc50 2015年

4

コメントにしたいのですが、文字数が多すぎます。とにかく、ozgurがコメントレスポンスの質問で判断すると、私のスレッドの実行にこれほど長い時間がかかるとは言えず、OSのおかげで他のスレッドと魔法のように連動すると期待できないという点が欠けているようです。スレッドを設計し、最悪の場合のパフォーマンスについてそれらを分析する必要があります。最悪のケースが要件を満たさない場合は、スレッドを再設計する必要があります。

したがって、スレッド1が完了するまでに10ミリ秒かかり、スレッド2が20ミリ秒かかると言うのではなく、スレッド1は15ミリ秒ごとに実行する必要があるとも言う必要があります。スレッド2は40ミリ秒ごとに実行する必要があります。スレッド3は500ミリ秒ごとに実行する必要があり、スレッドNは1500ミリ秒ごとに実行する必要があります。次に、最悪のシナリオで各スレッドが完了するまでにかかる時間に時間を割り当てます。これらすべてを組み合わせて、考えられる最悪のシナリオを特定し、すべてのスレッドがそのタイミング要件を満たしていることを確認する必要があります。この分析では、タイミング要件を満たすために、一部のスレッドを他のスレッドよりも高い優先度にする必要があるかどうかを特定します。

たとえば、スレッド5が実行されている場合、スレッド4によって中断されます。スレッド4はスレッド3によって中断され、スレッド3はスレッドNによって中断されますが、これは最悪の場合のシナリオです。これらすべてをタイムラインに配置し、この最悪のシナリオでも、すべてのスレッドがそのタイミング要件を満たしていることを確認します。リアルタイムOSでスケジューラと優先度を使用することにより、スレッドがこのワーストケースのシナリオを確定的に完了するようにすることができます。その決定論は、リアルタイムOSを作るものです。

スレッドを同じ優先度にすると、スケジューラーは次に実行するスレッドを自由に選択できるため、その決定論の一部(すべてではないにしても)が失われます。

WindowsのようなOSでは、各スレッドがいつ実行されるかを指定できないだけでなく、アプリケーションがいつでも実行されることを保証することもできません。OSはアプリケーションを停止し、必要に応じてバックグラウンドサービスを実行する可能性があります。つまり、決定論はありません。したがって、WindowsはリアルタイムOSではありません。ただし、(thread1が10秒ごとに実行され、thread2が15秒ごとに実行される)のようにタイミング要件が大きい場合は、スロップを考慮している限り、Windowsを本質的にリアルタイムOSのように扱うことができます。 (与えるか、数百ミリ秒かかり、ときどきウィンドウが失われる)で十分です。


1

「現実の世界」ではシナリオは不可能であると他の回答が述べていますが、あなたの質問に答えられるようにするには、架空のシステムを構築する必要があります。

私たちのシステムは、安定した速度でボールを発射する銃と、ボールを「キャッチ」し、各ボールをキャッチして1ステップ進む2つのボックスで構成されています。銃はいずれかのボックスで発砲するように切り替えることができますが、切り替えるたびに1つのボールが失われます。最初のボックスはその終わりに到達するために1000ステップ(ボール)を必要とし、ボックス2は2000を必要とします。

シナリオ1(次々とタスク):
-銃はボックス1で1000ボールを発射し、スイッチ(コスト1ボール)とボックス2で2000ボールを発射し、合計3001ボールを発射します。

シナリオ2(タスク「同時」):
-銃が1つのボックスで5つのボールを発射し、他のボックスで5つのボールを切り替えて発射して、同時性外観を与えます。切り替えコストは(1000/5 x 2 =)400ボールです。したがって、2400個のボールを撃った後、ボックス1は最後に到達し、ボックス2は最後に到達するためにさらに1000個のボールを必要とし、合計で3400個のボールになります。

これらの結果をシナリオに適用すると、タスク1とタスク2の前半は24ミリ秒後に完了し、タスク2の後半はさらに10ミリ秒で完了し、合計34ミリ秒になります。これは、タスクの切り替えに時間がかかるため、タスクの完了に必要な時間が増加することを明確に示しています。これらの結果は、タスク1が完了するまでに12ミリ秒、タスク2が22ミリ秒かかるのと同じです。


賛成。この説明により、私の質問がより明確になり、答えが明白になりました。
ozgur
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.