LabVIEWは割り込み型および協調型マルチスレッドを使用します。割り込み型マルチスレッドを使用するオペレーティングシステムとプロセッサは、これらのシステムが協調型マルチスレッドの使用に戻る場合のために制限された数のスレッドを使用します。

実行システムはスレッドを使用して、割り込み式にマルチタスクの処理を行います。ただし、使用できるスレッドの数は制限されます。並列性の高いアプリケーションでは、使用できるスレッドがビジー状態の場合、実行システムは協調型マルチタスクを使用します。また、オペレーティングシステムは、アプリケーションと他のタスク間で割り込み型マルチタスクを処理します。

基本実行システム

基本実行システムは、アクティブなタスクのキューを保持します。たとえば、3つのループが並列に実行されている場合、常時1つのタスクは実行中であり、残りの2つのタスクはキューで待機しています。すべてのタスクの優先度が同じであると仮定した場合、タスクのうちの1つは特定の時間実行します。そのタスクはキューの終端に移動して、次のタスクが実行されます。タスクが完了すると、実行システムはそのタスクをキューから削除します。

VIの生成されたコードを呼び出すことで、実行システムによってキューの最初の要素が実行されます。その後ある時点で、そのVIの生成されたコードは、実行システムによって実行する別のタスクが割り当てられたかどうかを実行システムに確認します。そうでない場合、VIのコードは実行を続行します。

同期ノードとノードブロック

ブロックダイアグラムの2、3のノードまたは項目は同期します。つまり、これらのノードまたは項目はその他のノードと同時に処理を行いません。マルチスレッド処理のアプリケーションでは、これらのノードまたは項目は完了するまで実行され、実行されるスレッドはタスクが完了するまでそのタスクによって独占されます。

制御器またはアプリケーションリファレンスで使用されるプロパティノードおよびインボークノードは、制御器リファレンス上の値プロパティに対してもUIスレッドと同期されます。したがって、グラフの大量のデータを表示するなど、UIスレッドがビジーの場合には、UIスレッドが現在の作業を完了するまでプロパティノードまたはインボークノードは実行されません。

共有ライブラリ呼び出しと演算関数は同期で実行されます。多くの解析VIとデータ収集VIには共有ライブラリ呼び出しが含まれており、このため同期で実行されます。一度に1つのスレッドのみ非再入可能な共有ライブラリを呼び出すようにするには、単一の非再入可能VIを構成して共有ライブラリを呼び出します。共有ライブラリが複数の再入可能でないVIから呼び出される場合、LabVIEWは予期せぬ結果を返す可能性があります。

ほとんどの他のすべてのノードは非同期です。たとえば、ストラクチャ、I/O関数、タイミング関数、サブVIは非同期で実行します。

オカーレンス待機タイミングGPIBVISAシリアルVIおよび関数は、タスクが完了するまでスレッドを停止せずに待機できます。実行システムは、タスクが完了するまでこれらのタスクをキューから削除します。タスクが完了すると、実行システムはそのタスクをキューの最後に配置します。たとえば、「3ボタンダイアログ」VIが表示するダイアログボックスのボタンをクリックすると、実行システムはそのタスクをキューの最後に配置します。

デッドロック

システムの同一リソースに対して競合が発生するために複数のタスクが完了できなかった場合、デッドロックが起こります。1つのファイルを印刷する必要がある2つのアプリケーションもデッドロックの一例として挙げられます。スレッド1で実行中の最初のアプリケーションは、ファイルを取得して別のアプリケーションが使用できないようにロックします。スレッド2にある2番目のアプリケーションはプリンタで同様の操作を行います。オペレーティングシステムがリソースの干渉や解放を行わない非割り込み型の動作環境では、両方のアプリケーションは別のアプリケーションがリソースを解放することを待機しますが、どちらも既に保持するリソースは解放しません。デッドロックを回避する方法の1つとして、同じ順序で一般リソースにアクセスするようにVIを構成することが挙げられます。

実行システムでユーザインタフェースを管理する

実行システムは、VIを実行する以外に、ユーザインタフェースでの入出力を調整する必要があります。ユーザがボタンをクリックしたり、ウィンドウを移動したり、スライド制御器の値を変更すると、実行システムはVIが確実にバックグラウンドで実行し続けるように、それらの操作を管理します。

シングルスレッドの実行システムは、ユーザの操作と実行中のVIの間で切り替えを行うことで複数の処理を同時に行います。また、ユーザインタフェースのイベントが処理を必要としているかどうかを確認します。ユーザインタフェースのイベントの処理が必要なければ、実行システムはVIの実行に戻るか、キューにある次のタスクを受け入れます。

LabVIEWはバックグラウンドでVIを実行しているため、ユーザによるボタンまたはプルダウンメニューのクリックによる操作は、完了までに時間がかかる場合があります。LabVIEWは、制御器またはメニューの操作に対する応答とVIの実行操作間を切り替えます。

LabVIEWにおける実行システム

6つの実行システムがあり、ファイル»VIプロパティVIプロパティダイアログボックスで実行を選択することで割り当てることができます。以下の実行システムから選択することができます。

  • ユーザインタフェース―ユーザインタフェースを処理します。シングルスレッド処理のアプリケーションと同様に、マルチスレッド処理のアプリケーションで動作します。VIはユーザインタフェーススレッドで実行できますが、実行システムは協調型マルチタスクの実行とユーザインタフェースイベントへの応答間を切り替えます。
  • 標準―ユーザインタフェースとは別のスレッドで実行します。
  • 計測器I/O―VISA、GPIB、シリアルI/Oが他のVIと干渉するのを回避します。
  • データ収集―データ収集が他のVIと干渉するのを回避します。
  • その他1およびその他2―アプリケーションのタスクが独自のスレッドを必要とする場合に使用できます。
  • 発呼者と同じ―サブVIの場合、サブVIを呼び出すVIと同じ実行システムで実行します。トップレベルVIでは、発呼者と同じは、推奨する実行システムを標準に設定するのと同じ効果があります。

これらの実行システムは、他のVIから独立して実行する必要があるVIをセグメント化します。デフォルトでは、VIは標準実行システムで実行します。

計測器I/Oおよびデータ収集という名称は、これらの実行システム内に配置するタスクのタイプに関する提案です。I/Oおよびデータ収集は他のシステムでも動作しますが、これらのラベルはアプリケーションの分割と構造の理解に使用することができます。

実行システムは、ユーザインタフェースの管理の役割は果たしません。ただし、これらの実行システム1つにあるVIが制御器を更新する必要がある場合、実行システムはその作業をユーザインタフェース実行システムに引き渡します。ユーザインタフェースの実行システムを大量のプロパティノードを含むVIに割り当ててください。

マシンのプロセッサ数に比例するスレッド数が割り当てられます。それぞれのスレッドはタスクを処理します。たとえば、VIが共有ライブラリを呼び出す場合、別のスレッドはその実行システム内で他のVIを実行し続けます。それぞれの実行システムにあるスレッドの数は限られているため、スレッドがビジーの場合はタスクが保留となります。

作成するVIは標準実行システムで正しく実行されますが、他の実行システムを使用することを検討してください。たとえば、計測器ドライバを開発している場合、計測器I/O実行システムの使用をお勧めします。

標準実行システムを使用する場合でも、ユーザインタフェースは独自のスレッドに分割されています。フロントパネルでの描画、マウスのクリックへの応答など、ユーザインタフェースで行われる動作はすべて、ブロックダイアグラムのコードの実行時間を干渉せずに行われます。同様に、長い演算ルーチンの実行のためにユーザインタフェースによるマウスクリックやキーボード入力への応答が阻止されることはありません。

複数のプロセッサを備えたコンピュータを使用すると、マルチスレッド処理の利点をもっと活用することができます。単一のプロセッサのコンピュータでは、オペレーティングシステムがスレッドを管理し、プロセッサのそれぞれのスレッドに時間を分配します。一方、マルチプロセッサのコンピュータでは、スレッドは複数のプロセッサで同時に実行されるため、複数の動作を同時に行うことができます。