プリエンプト
プリエンプトとは
処理フローにおいて、トークンの現在のアクティビティを停止し、他のアクティビティよりも優先されるアクティビティのシーケンスにリダイレクトするのがプリエンプトです。トークンがプリエンプトアクティビティシーケンスを完了した後、トークンは以前のアクティビティを再開できます。
プリエンプトには、次のようないくつかのアプリケーションがあります。
- マシンの可用性または予定されたメンテナンス - ビジネスシステムのすべてのセクションが24時間いつでも利用できるわけではありません。ビジネスの一部のセクターは、定期的に予定された時間に休止する場合があります。たとえば、一部のマシンセットを通常の営業時間内にのみ動作させる可能性があります。プリエンプトを使用して、こうした予定された休止をシミュレーションできます。休止時には、処理フローはアクティビティのプリエンプトシーケンスをトリガーできます。その後、マシンが翌日に再始動すると、前日からの作業を再開できます。
- ルーティンまたは定期的なタスク - 従業員が定期的に予定された期間にタスクを実行しなければならない場合もあります。たとえば、週に1回の社員会議に参加したり、4時間ごとに休憩を取ったりする場合です。シフトで働く従業員がいる場合は、各シフトの交代中に従業員が行うべき一連のタスクがある可能性もあります。プリエンプトを使用して、定期的に実行する必要のあるアクティビティを開始し、従業員がプリエンプトアクティビティを完了した後で前のタスクを再開させることができます。
- 優先度が高い状況 - ビジネスシステムが急ぎの注文を受け取る場合や、緊急のイベントが発生してすぐに対応が必要な場合があります。プリエンプトを使用すれば、ビジネスリソースを転用してそうした状況に対処できます。状況が解決されると、転用されたリソースは通常のオペレーションを再開できます。
- マシンの故障 - ビジネスシステム内のマシンの偶発的な故障をシミュレーションする場合、故障中に発生させる必要のあるプリエンプトアクティビティをランダム統計分布でトリガーできます。故障が解消された後、マシンは通常のビジネスオペレーションを再開できます。
プリエンプトで使用される処理フローアクティビティ
処理フローのプリエンプトには3つの重要なアクションが含まれます。それぞれ処理フローアクティビティに対応しており、プリエンプト処理フローを構築する際には以下の順番で使用することになります。
- トークンコンテキストを保存 - プリエンプトの前に、プリエンプトアクティビティが終了した後に現在のコンテキストに戻ることができるように、処理フロー内のトークンの現在のコンテキストを保存する必要があります。
- トークンをリリース - トークンの現在のアクティビティを中断して新しいアクティビティにリリースします。トークンは別のことを行うか、待機します。
- トークンコンテキストを復元:プリエンプトが必要なオペレーションが完了すると、トークンをその保存したコンテキストに復元できます。
これらの各アクティビティには、ターゲットトークンを定義するトークンプロパティがあります。ターゲットトークンとは、プリエンプトされるトークンを意味します。プリエンプト処理フローを構築するときは、これらの3つのアクティビティのトークンプロパティが同じトークンを参照する必要があります。推奨される方法は、[ラベルを割り当てる]アクティビティを使用して、各プリエンプトアクティビティのトークンプロパティが参照できる共通ラベルを作成することです。これについては、以下のセクション「プリエンプトの仕組み」と「プリエンプト処理フローを接続する」で詳しく説明します。
プリエンプトの仕組み
通常、プリエンプトを使用する処理フローには次の3つの要素があります。
- コアシステム処理フロー - この処理フローは、通常の作業条件下でビジネスシステムがどのように動作するかを表します。
- プリエンプトイベント処理フロー - この処理フローは、アクティビティのプリエンプトシーケンスをトリガーします。イベントは、シミュレーションモデル内のイベントによってランダムに、または[トークン作成(ソース)]アクティビティのいずれかを使用して定期的に、トリガーできます。プリエンプトイベント処理フローは、コアシステム処理フローと並行して実行されます。
- プリエンプトされたトークンの処理 - プリエンプトされたトークンをコアシステム処理フローに復元できるまで、それらのトークンを一時的に保存するアクティビティが少なくとも1つ必要です。
次の画像は、これらの3つの重要な各要素を備えた、非常に単純なプリエンプトシステムの例を示しています。
コアシステムの仕組み
コアシステムは、通常の処理フローと同様に機能します。前の画像で説明した特定の例では、
- [到着間隔ソース]が20秒ごとにトークンを作成します。
- その後、[遅延]アクティビティ([遅延1])がトークンを20秒間遅延させます。これはトークンの処理時間を表します。
- [シンク]アクティビティが、[遅延1]で正常に処理されたすべてのトークンを削除します。
プリエンプトイベントの仕組み
プリエンプト処理は、プリエンプトイベントの発生のタイミングをコントロールします。また、プリエンプト処理の一部として必要なアクティビティも含まれます。前の画像で説明した特定の例では、
- 到着間隔ソースは、90~100秒の範囲内の統計分布を用いてランダムにトークンを作成します。つまり、プリエンプトイベントは、90~100秒ごとにランダムに発生します。
- [ラベルを割り当て]アクティビティは、すべての入るトークンに、[遅延1]アクティビティのすべてのトークンを参照するpreemptedTokensというラベルを割り当てます。詳細については、「プリエンプト処理フローを接続する」を参照してください。
- [トークンコンテキストを保存]アクティビティは、preemptedTokensラベルによって参照されるすべてのトークンのコンテキストを保存します。この例の場合、[遅延1]アクティビティにあるトークンのコンテキストを保存します。このアクティビティは、トークンのコンテキストを保存するsavePointというラベルをトークンに対して作成します。詳細については、「保存ポイントについての主要な概念」を参照してください。
- [トークンをリリース]アクティビティは、preemptedTokensラベルによって参照されるトークンをプリエンプトトークン処理に送信します。この場合、[遅延1]アクティビティのトークンは[遅延3]アクティビティに送信されます。
- [遅延]アクティビティは、入るトークンを40秒間遅延させます。これはプリエンプト処理が完了するのにかかる時間を表します。プリエンプトイベントが発生したときにシミュレーションのロジックをコントロールする代わりに、追加のアクティビティ(タスクシーケンスなど)を追加することもできます。
- [コンテキストを復元]アクティビティは、[遅延3]でプリエンプトされたトークンを、[遅延1]アクティビティで[トークンコンテキストを保存]アクティビティによって保存された状態(ステップ3)に正確に復元します。savePointラベルを使用してコンテキストを復元します。
- [シンク]アクティビティは、プリエンプトイベントをトリガーしたトークンを削除します。
プリエンプトトークン処理の仕組み
プリエンプトトークン処理は単純に、コアシステムからプリエンプトされたトークンを保存または保持します。前の画像で説明した特定の例では、
- シミュレーション実行中に、トークンがプリエンプトイベント処理フローで[トークンをリリース]アクティビティに入ると、コアシステム処理フロー内のトークンが[遅延1]アクティビティから消えます。
- 同じトークンが、プリエンプトトークン処理の処理フローの[遅延3]アクティビティに表示されます。
- トークンがプリエンプトイベント処理フローの[コンテキストを復元]アクティビティに入るまで、トークンは[遅延3]アクティビティに残ります。
- 次に、トークンは以前とまったく同じ状態で[遅延1]アクティビティに戻ります。たとえば、10秒間(遅延時間の50%)遅延していた場合、遅延は10秒で再開します。
プリエンプトトークン処理の処理フローは、追加のアクティビティを加えることによってより精巧にできる可能性もあります。
プリエンプトシステムの作動
次の画像は、シミュレーション実行中のこのプリエンプトシステムの作動例を示しています。
保存ポイントについての主要な概念
[トークンコンテキストを保存]アクティビティと[トークンコンテキストを復元]アクティビティでは、ターゲットトークンに対してsavePointというラベルを使用します。
- [トークンコンテキストを保存]アクティビティでは、プリエンプトされたトークンにsavePointラベルを作成し、保存時にどのアクティビティが入っていたかを記録します。時間の制約を伴うアクティビティの場合(最大待機タイマーや最大アイドルタイマーを使用する、[遅延]アクティビティやその他のアクティビティの場合など)、トークンがそのアクティビティにどのくらいの時間入っていたかも記録されます。
- [トークンコンテキストを復元]アクティビティは、プリエンプトされたトークンのsavePointラベルを参照し、そのトークンをラベル作成時に入っていたアクティビティに復元します。また、そのトークンが時間の制約を伴うアクティビティに入っていた場合、そのアクティビティに入っていた特定の時間にも復元します。たとえば、コンテキストが保存されたときまでにトークンが10秒間[遅延]アクティビティにあった場合、トークンが復元されると10秒後に[遅延]が再開されます。
プリエンプト処理フローを接続する
このセクションで説明するラベルを割り当てる方法は、プリエンプト処理フローをコア処理フローに接続するために推奨される方法です。このセクションでは、別の方法についても簡単に触れます。
ラベルを割り当てる(推奨)
推奨される方法は、[ラベルを割り当てる]アクティビティを使用して、各プリエンプトアクティビティのトークンプロパティによって参照できる共通ラベルを作成することです。
- プリエンプトイベント処理フローで、プリエンプトアクティビティの前に[ラベルを割り当て]アクティビティを追加します。
- [ラベルを割り当て]アクティビティを選択した状態で、[クイックプロパティ]で[追加]ボタンをクリックして新しいラベルを追加します。
- [名前]ボックスで、新しいラベルに名前を付けます(preemptedTokensなど)。
- [値]ボックスの横にある矢印をクリックして、メニューを開きます。[トークン]をポイントし、[アクティビティのトークン]を選択して、次の画像に示すようにピックリストを開きます。
- [サンプラー]ボタン を使用して、コアシステム処理フローのターゲットアクティビティを選択します。このアクティビティで、コアシステムからトークンをプリエンプトします。
- [トークンコンテキストを保存]アクティビティの[クイックプロパティ]で、作成したばかりの新しいラベルをポイントします。[トークン]ボックスの横にある矢印をクリックして、メニューを開きます。[トークンラベル]をポイントし、ステップ2で追加したラベルの名前を選択します。次の画像に例を示します。
- [トークンをリリース]アクティビティと[コンテキストを復元]アクティビティの[トークン]プロパティについて、ステップ4~6を繰り返します。
この方法を変更して、ゾーン、リスト、リソースなどの共有アセット内のすべてのトークンをプリエンプトできます。この変更は、アクティビティのセクション全体があり、そのゾーン、リスト、またはリソースの任意の場所にすべてのトークンを保存する場合に理想的です。共有アセットのトークンをプリエンプトするには、次のようにします。
- ステップ4で、メニューから[共有アセットのトークン]を選択します。これにより、次の画像に示すような同様のピックリストが開きます。
- ステップ5で、[サンプラー]ボタン を使用して、ターゲットの共有アセットを選択します。ターゲットの共有アセットとは、トークンのプリエンプト元となるゾーン、リスト、またはリソースです。それ以降は、残りのステップを実行できます。
アクティビティを接続する別の方法については、次のセクションを参照してください。
代替方法
プリエンプト処理フローを接続するには、ラベルを割り当てる方法が推奨されますが、トークンをプリエンプトする特定のアクティビティまたは共有アセットをサンプリングすることによって、プリエンプトアクティビティをそのアクティビティまたは共有アセットに直接接続することもできます。
- [トークンコンテキストを保存]アクティビティの[クイックプロパティ]で、[トークン]ボックスの横にある矢印をクリックしてメニューを開きます。[アクティビティのトークン]または[共有アセットのトークン]をポイントしてピックリストを開きます。
- [サンプラー]ボタン を使用して、コアシステム処理フローのターゲットアクティビティまたは共有アセットを選択します。
- [トークンをリリース]アクティビティに対してステップ1と2を繰り返します。
- [トークンコンテキストを復元]アクティビティに対してステップ1と2を繰り返すか、プリエンプトトークン処理の処理フローで使用されているアクティビティまたは共有アセットの1つをサンプリングできます。
次の画像は、この方法を使用しているプリエンプトアクティビティのプロパティの例を示しています。
この方法が推奨されない理由として、すべてのアクティビティでターゲットトークンが同じであることを確認する必要があるか、同じでない場合はトークンを以前のコンテキストに復元しようとするとエラーメッセージが表示される可能性があることが挙げられます。これらのエラーメッセージは、新しいトークンがコアシステム処理フローに入り、同時に他のトークンがプリエンプトされている場合に発生する可能性があります。たとえば、[トークンコンテキストを復元]アクティビティがあるゾーンを直接指していて、そのゾーン内のすべてのトークンを復元しようとすると、そのゾーンに入った新しいトークンにより(savePointラベルを持たないため)エラーが生じます。
しかし、この方法を使う正当な理由がある場合もあります。そうした場合は、次のガイドラインに留意してください。
- savePointラベルによって行われることと行われないことを明確に理解してください。特に、このラベルは、どのグループのトークンが同時にプリエンプトされたかという情報を保存しません。詳細については、「保存ポイントについての主要な概念」を参照してください。
- 復元するトークンのセットが、保存およびリリースされたトークンのセットとまったく同じであることを確認してください。
[トークンコンテキストを保存]アクティビティをチェックポイントとして使用する
コアシステムにトークンを復元するとき、トークンがプリエンプトされたのとまったく同じ場所でトークンを再開する必要がない場合があります。代わりに、特定のチェックポイント(またはマイルストーン)の後に一連のアクティビティを繰り返す必要がある場合があります。[トークンコンテキストを保存]アクティビティを使用して、こうしたチェックポイントを作成できます。
次の画像は、チェックポイントを使用するプリエンプトシステムの例を示しています。
このシステムは、「プリエンプトの仕組み」の例で示したシステムと似ていますが、いくつかの重要な違いがあります。
- コアシステム処理フローでは、[ゾーン]共有アセット(ここでは[溶接ゾーン]と呼びます)と、[ゾーンに入る]アクティビティおよび[ゾーンから出る]アクティビティが使用されます。
- コアシステム処理フローには、3つの[トークンコンテキストを保存]アクティビティがあり、それぞれに[遅延]アクティビティが続きます(これは、溶接ステーションの異なる段階を表す場合があります)。[トークンコンテキストを保存]アクティビティは、すべての入るトークンのコンテキストを保存します。
- プリエンプトイベント処理フローの[ラベルを割り当て]アクティビティは、溶接ゾーン内のトークンを参照します。
次の画像は、シミュレーション実行中に動作しているチェックポイントプリエンプトシステムの例を示しています(トークンの関係を示すためにゾーンが強調表示されています)。
[プリエンプト]アクティビティをタイムテーブルで使用する
タイムテーブルとMTBF/MTTRオブジェクトを扱うときは、[プリエンプト]アクティビティが非常に便利です。これらのツールを使用すると、メンテナンスや修理のために、またはオペレーション時や非オペレーション時に、オブジェクトまたはオブジェクトのセットを停止状態にできます。これらのツールでイベントをリッスンし、適切なロジックを実行することで、処理フローは処理を一時停止できるほか、停止時に追加の処理を開始することもできます。
処理フローのプリエンプトには少なくとも2つのトークンが含まれますが、より多くのトークンを含む場合もあります。1つ以上のコアトークンが処理のコアアクティビティを実行します。さらに、別のトークン、つまりプリエンプトトークンがプリエンプトをトリガーして管理します。プリエンプトトークンは、プリエンプトをトリガーするイベントを待機します。言い換えればプリエンプトトークンは、プリエンプトをトリガーするイベントによって作成されます。このイベントが発生すると、プリエンプトトークンはすべてのコアトークンのコンテキストを保存します。この保存されたコンテキストには、コアトークンの現在のアクティビティとアクティビティ関連のデータが含まれます。たとえば、コアトークンが遅延アクティビティにある場合、合計遅延時間とトークンが現在どのくらい遅延しているかを保存します。このコンテキストは、コアトークンのユーザー定義ラベルに保存されます(プリエンプトトークンには保存されません)。
プリエンプトトークンはすべてのコアトークンのコンテキストを保存すると、それらのトークンを別のアクティビティにリリースします。プリエンプトが処理をフリーズさせてしまう場合、コアトークンは、後続アクティビティのない遅延ゼロアクティビティなど、何もしないアクティビティにリリースされます。コアトークンは、プリエンプトトークンがそれらを復元するまで、そのアクティビティにとどまります。これは、上の画像に示されている実装であり、プリエンプトトークンがトークンを[プリエンプトサイロ]にリリースします。他方、プリエンプトが「順序付けされたテイクダウン」を行う必要がある場合、コアトークンは、リソースのリリースやゾーンから出るなどの順序付けされたテイクダウンを実行するアクティビティにリリースされる可能性があります。
次の画像は、[プリエンプトサイロ]のプリエンプトコアトークンを示しています。
プリエンプトオペレーションが完了すると、コアトークンを保存されたコンテキストに復元できます。コアトークンは保存されたときとまったく同じ時点から作動を継続します。