タスクの優先度とプリエンプトについて

概要

デフォルトでは、タスク実行者はFIFOロジック(先入れ先出し)を使用してタスクを処理します。それらは単純に、受信され、タスク実行者のタスクキューに追加された順番でタスクを完了させるだけです。ただし、優先度レベル、プリエンプト、ラベル、リストなどの条件付きロジックを使用して、重要度の低いタスクの前に重要度の高いタスクをタスク実行者に実行させることができます。

優先度レベルは、あるタスクの優先度を他のタスクよりも上にするためにタスクに割り当てることができる番号またはラベルです。

プリエンプトは、タスク実行者が現在のタスクから割り込みを受けてより重要なタスクを処理するかどうかを決定します。また、中断されたアクティブタスクに起こることにも影響します。たとえば、プリエンプトは、アクティブなタスクがプリエンプトタスクの完了後に最初から再開されるかどうか、またはタスクを完全に削除する必要があるかどうかを判断できます。

以下は、優先度とプリエンプトシステムが必要となる可能性があるシナリオの例です。

  • 作業検索システム - タスク実行者がリストからタスクをプルして作業を探すシステムを設計する場合は、優先度レベルを使用してタスク実行者が最初に作業するタスクを決定するようにできます。
  • マシンの故障 - マシンが故障し、それを修理するためにタスク実行者が必要になった場合、そのタスク実行者の通常のタスクは修理作業中に中断される可能性があります。
  • 緊急事態または緊急のリクエスト - 即時の注意を要する緊急事態が発生した場合、または緊急のリクエストが突然到着した場合は、緊急事態に対処するために、優先度とプリエンプトを使用してタスク実行者をタスクからプルする必要があります。

このトピックの残りの部分では、重要な概念と、優先度とプリエンプトシステムを作成するためのさまざまな方法について説明します。

標準の3Dロジックの優先度

次のセクションでは、標準の3Dロジックを使用している場合にタスクの優先度を追加する方法について説明します。

標準ロジックで優先度がどのように機能するか

デフォルトで、別の優先度を割り当てない限り、すべてのタスクシーケンスの優先度の値は0です。優先度の数値が大きいタスクシーケンスは、優先度の数値が小さいタスクシーケンスよりも先に完了します。たとえば、優先度が10のタスクシーケンスは、優先度が1のタスクシーケンスよりも先に完了します。

優先度の数値の背景にある深い意味または方法は完全にユーザー次第です。シミュレーションモデルで優先度レベルを広範囲に使用する予定の場合は、優先度レベルの追跡と管理を検討することをお勧めします。参考のために、モデルのドキュメントにレベルとその意味を書き留めておくことをお勧めします。

優先度を割り当てる

3Dオブジェクトで標準ロジックを使用してタスクを作成している場合は、タスクを作成したのと同じエリアで優先度またはプリエンプトの値を割り当てるプロパティを探します。

処理フローアクティビティの優先度

個々の処理フロータスクアクティビティに優先度またはプリエンプト値を追加することはできません。代わりに、タスクシーケンスを作成アクティビティを使用して、作成するタスクシーケンスの優先度を定義できます。または、リストやリソースなどを使用して処理フロー内の優先度付けを処理し、ジョブ/リソース選択の完了後にのみタスクシーケンスを生成できます。

たとえば、タスク実行者が他のアイテムを輸送する前に急ぎ注文アイテムを輸送する必要があるシステムをモデル化しているとします。この種類のシステムを作成するには、次のようにします。

  1. RushOrderというラベルをフローアイテムに割り当てるソースに[作成時]トリガーを追加します。ある割合のフローアイテムに1の値を割り当て、それらが急ぎ注文アイテムであることを示すことができます(他のすべてのアイテムには0の値が割り当てられます)。
  2. アイテムの輸送準備が整うと、リストにプッシュされます。
  3. タスク実行者はリストを照会し、RushOrder値が1のアイテムをプルして、それらのアイテムを最初に輸送するためにプルできます。

このシステムの実例についてはタスクロジックチュートリアル1.3を完了してみてください。

2つの方法の併用に関する戦略

標準ロジックと処理フローの両方を使用してタスクをタスク実行者に割り当てるモデルがある場合は、両方のシステムと互換性のある優先度とプリエンプトの戦略を使用する必要があります。タスクシーケンスを作成アクティビティを使用して、優先度とプリエンプトを処理フロー内のタスクシーケンスに追加できます。その後で、タスクシーケンスをタスクシーケンスリストにプッシュできます。この例については、「タスクロジックでリストを使用する」を参照してください。または、タスク実行者またはディスパッチャーに直接タスクシーケンスをディスパッチして、標準のタスクシーケンスロジックの使用を許可することができます。

プリエンプト

プリエンプトは、タスク実行者がアクティブなタスクから割り込みを受けてプリエンプトするタスクを処理するかどうかを決定します。また、オペレーターがタスクからプリエンプトされたときにアクティブタスクに何が起こるかを決定します。

たとえば、中断されたタスクを、タスク実行者のタスクリストの最後に単純に再追加させることができます。タスク実行者はその後、プリエンプトタスクを終了したときに割り込まれたタスクに取り組みます。あるいは、実行中のタスクを完全に中止し、タスク実行者により処理されないようにすることもできます。

次の表は、使用可能なさまざまなプリエンプトオプションについて説明しています。

名前 説明
0 プリエンプトしない タスクはタスク実行者をプリエンプトしません。
1 プリエンプトのみ タスク実行者は現在アクティブなタスクシーケンスをプリエンプトし、タスクシーケンスキューに戻してから、後で完了します。プリエンプトされたタスクシーケンスは、タスクシーケンスキューの先頭に自動で配置されます。その後、タスク実行者が元のタスクシーケンスに戻ったとき、そのタスクシーケンスにある現在のタスクは完了していないため、それを再び終わらせます。
2 プリエンプト+アクティブを中断 タスク実行者は現在アクティブなタスクシーケンスを停止し、元のタスクに戻ることがないように破棄します。
3 プリエンプト+すべてを中断 タスク実行者は現在アクティブなタスクシーケンスを停止し、破棄し、そのタスクシーケンスキュー内のすべてのタスクを破棄します。

複数のプリエンプトタスクシーケンス

タスク実行者がプリエンプトのタスクに取り組んでいる際に、別のプリエンプトタスクを同時に受け取る可能性があります。その場合、タスクロジックは以下のルールを使用します。

  • 優先度レベル - タスク実行者はタスクシーケンスの優先度の値を使用して、どのタスクシーケンスが優先されるかを決定します。
  • 新しいタスクの優先度の値が高い場合 - タスク実行者は現在のタスクシーケンスをプリエンプトして新しいタスクシーケンスを実行します。
  • 新しいタスクの優先度の値が小さいか等しい場合 - タスク実行者はアクティブなタスクシーケンスをプリエンプトしませんが、受信する他のタスクシーケンスと同様に新しいタスクシーケンスをキューに入れます。
  • タスクをキューに入れる - プリエンプトタスクがタスク実行者のタスクキューに追加された場合、キュー方法で明示的に指示しない限り、そのキューイングのロジックでプリエンプト値が考慮されることはありません。プリエンプトするタスクをキューの先頭に置きたい場合は、プリエンプトするタスクに他のあらゆるタスクシーケンスよりも高い優先度を割り当てるか、キュー方法でプリエンプトを考慮します。