Multitasking in LabVIEW
- Aktualisiert2025-08-27
- 5 Minute(n) Lesezeit
LabVIEW verwendet preemptives und kooperatives Multithreading. Betriebssysteme und Prozessoren mit preemptive Multithreading verwenden nur eine begrenzte Anzahl von Threads, so dass diese Systeme in einigen Fällen auf das kooperative Multithreading zurückgreifen.
Das Ausführungssystem zieht dabei VIs vor, die Threads verwenden. Eine begrenzte Anzahl von Threads ist jedoch verfügbar. Für besondere parallele Anwendungen verwendet das Ausführungssystem kooperatives Multitasking, sofern verfügbare Threads gerade beschäftigt sind. Das Betriebssystem übernimmt das preemptive Multitasking zwischen der Anwendung und anderen Tasks.
Grundlegendes Ausführungssystem
Das grundlegende Ausführungssystem verfügt über eine Reihe von aktiven Tasks. Wenn z. B. drei Schleifen parallel ausgeführt werden, wird zu jeder Zeit nur ein Task ausgeführt und die anderen beiden befinden sich in einer Art Warteschlange. Angenommen, dass alle Tasks die gleiche Priorität haben, dann wird einer der Tasks während einer bestimmten Dauer ausgeführt. Dieser Task wird dann an das Ende der Warteschlange verschoben und der nächste Task wird ausgeführt. Wenn ein Task zu Ende ausgeführt wurde, entfernt ihn das Ausführungssystem aus der Warteschlange.
Das Ausführungssystem führt das erste Element in der Warteschlange aus, indem es den generierten Code für das VI aufruft. Und dann überprüft der generierte Code von diesem VI das Ausführungssystem, um zu sehen ob das Ausführungssystem einen anderen Task zur Ausführung festlegt. Falls nicht, wird der Code für das VI weiterhin ausgeführt.
Synchrone/Blockierende Knoten
Einige Knoten und Funktionen im Blockdiagramm sind synchron, das heißt, sie verfügen nicht über Multitaskingfunktionen. Bei einer Multithread-Anwendung werden sie bis zum Ende ausgeführt und der Thread, in dem sie ausgeführt werden erhält Vorrang, bis der Task beendet wird.
Eigenschaftsknoten und Methodenknoten, die in einer Bedienelement- oder Anwendungsreferenz verwendet werden, auch für die Eigenschaft "Wert" in einer Elementreferenz, verlaufen synchron zum UI-Thread. Wenn der UI-Thread also gerade belegt ist, wie z. B. während der Anzeige einer großen Datenmenge in einem Graphen, dann blockiert der Eigenschafts- oder Methodenknoten die Ausführung des UI-Threads, bis der Vorgang abgeschlossen ist.
DLL-Aufrufe und Rechnerfunktionen werden synchron ausgeführt. Die meisten Analyse- und Datenerfassungs-VIs enthalten DLL-Aufrufe und werden daher auch synchron ausgeführt. Konfigurieren Sie ein ablaufvariantes VI zum Aufrufen der DLL, um sicherzugehen, dass nur ein Thread ein ablaufvariantes DLL zur gleichen Zeit aufruft. Wenn die DLL von mehr als einem nicht ablaufinvarianten VI aufgerufen wird, kann LabVIEW unerwartete Ergebnisse ausgeben.
Die meisten anderen Knoten werden asynchron ausgeführt. So sind z. B. Strukturen, I/O- und Zeit-Funktionen sowie SubVIs asynchron.
Die Funktion Auf Occurrence warten und die VIs und Funktionen der Paletten Timing, GPIB, VISA und Seriell warten, bis der Task beendet wird, ohne dabei jedoch den Thread zu verzögern. Das Ausführungssystem entfernt diese Tasks aus der Warteschlange bis deren Task beendet ist. Wenn der Task beendet ist, verschiebt das Ausführungssystem ihn ans Ende der Warteschlange. Wenn der Nutzer z. B. eine Schaltfläche in einem Dialogfeld anklickt, wird das VI Dialogfeld mit drei Schaltflächen angezeigt und das Ausführungssystem verschiebt den Task an das Ende der Warteschlange.
Blockade
Eine Blockade tritt auf, wenn zwei oder mehr Tasks nicht beendet werden können, weil sie dieselbe(n) Systemressource(n) beanspruchen. Ein Beispiel dafür sind zwei Anwendungen, die beide eine Datei drucken möchten. Die erste Anwendung, die auf Thread 1 ausgeführt wird, erreicht die Datei und sperrt sie für andere Anwendungen. Die zweite Anwendung, die sich in Thread 2 befindet, tut das gleiche mit dem Drucker. In einer nicht preemptiven Umgebung, in der das Betriebssystem nicht eingreift und eine Ressource freigibt, warten beide Anwendungen darauf, dass die jeweils andere Anwendung eine Ressource freigibt. Doch keine Anwendung gibt die Ressource frei, die sie innehat. Eine Möglichkeit, Blockaden zu vermeiden, besteht in der Konfiguration von VIs mit gleicher Priorität, die Zugriff auf gemeinsame Ressourcen haben.
Verwalten der Benutzeroberfläche im Ausführungssystem
Zusätzlich zur Ausführung der VIs muss das Ausführungssystem die Interaktion mit der Benutzeroberfläche koordinieren. Wenn Sie eine Schaltfläche anklicken, ein Fenster verschieben oder den Wert eines Schiebereglers verändern, verwaltet das Ausführungssystem diese Aktivitäten und stellt sicher, dass das VI im Hintergrund weiterhin ausgeführt wird.
Das Ausführungssystem mit nur einem Thread führt mehrere Tasks gleichzeitig aus, in dem es zwischen dem Reagieren auf Nutzer-Interaktionen und dem Ausführen von VIs hin- und herschaltet. Das Ausführungssystem überprüft, ob ein Ereignis der Benutzeroberfläche beantwortet werden muss. Falls nicht, wendet sich das Ausführungssystem wieder dem VI zu und nimmt den nächsten Task aus der Warteschlage entgegen.
Wenn Sie eine Schaltfläche oder Pulldown-Menüs anklicken, kann die Ausführung eine Weile in Anspruch nehmen, da LabVIEW im Hintergrund VIs ausführt. LabVIEW schaltet hin und her zwischen der Reaktion auf Ihre Interaktion mit dem Bedienelement oder dem Menü und dem Ausführen des VIs.
Ausführungssysteme in LabVIEW
LabVIEW verfügt über sechs verschiedene Ausführungssysteme, die Sie über Datei»VI-Einstellungen und Auswahl von Ausführen im Dialogfeld Eigenschaften für VI zuweisen können. Es kann zwischen folgenden Ausführungssystemen ausgewählt werden:
- Benutzeroberfläche — Bearbeitet die Benutzeroberfläche. Verhält sich in Multithread-Anwendungen und Anwendungen mit nur einem Thread gleich. VIs können im Thread der Benutzeroberfläche ausgeführt werden. Das Ausführungssystem wechselt jedoch zwischen kooperativem Multitasking und der Reaktion auf Ereignisse der Benutzeroberfläche.
- Standard — Wird in verschiedenen Threads der Benutzeroberfläche ausgeführt.
- Instrumenten-I/O — Verhindert, dass VISA, GPIB oder serielles I/O andere VIs beeinträchtigen.
- Datenerfassung — Verhindert, dass die Datenerfassung andere VIs beeinträchtigt.
- andere 1 und andere 2 — Verfügbar, wenn Tasks der Anwendung einen eigenen Thread beanspruchen.
- Wie Aufrufer — Für SubVIs, die im selben Ausführungssystem ausgeführt werden, wie das VI, dass das SubVI aufgerufen hat. Für VIs der höchsten Ebene hat Wie Aufrufer denselben Effekt wie das Einstellen des bevorzugten Systems auf Standard.
Diese Ausführungssysteme bieten einige grobe Partitionen für VIs, die unabhängig von anderen VIs ausgeführt werden müssen. VIs werden standardmäßig im Standardausführungssystem ausgeführt.
Die Bezeichnungen Instrumenten-I/O und Datenerfassung sind nur Vorschläge für die Art von Tasks, die in diese Ausführungssysteme eingefügt werden können. I/O und Datenerfassung funktionieren auch in anderen Systemen, Sie können diese Bezeichnungen jedoch verwenden, um die Anwendung zu partitionieren und zum Verständnis ihres Aufbaus.
Diese Ausführungssysteme sind nicht für das Verwalten der Benutzeroberfläche zuständig. Wenn ein VI in einem dieser Ausführungssysteme ein Element aktualisieren muss, leitet das Ausführungssystem die Zuständigkeit an das Ausführungssystem der Benutzeroberfläche weiter. Weisen Sie das Ausführungssystem der Benutzeroberfläche VIs mit einer Vielzahl von Eigenschaftsknoten zu.
LabVIEW teilt Threads proportional zur Anzahl der Prozessoren im Rechner auf. Jeder Thread bearbeitet einen Task. Wenn z. B. ein VI eine DLL aufruft, dann führt ein separater Thread die anderen VIs innerhalb des Ausführungssystems weiterhin aus. Da jedes Ausführungssystem eine begrenzte Anzahl an Threads hat, werden Tasks in eine Warteschlange eingereiht, wenn keine Threads verfügbar sind.
Erwägen Sie die Benutzung eines anderen Ausführungssystems, auch wenn VIs, die Sie selbst geschrieben haben, im Standardausführungssystem fehlerfrei ausgeführt werden. Wenn Sie z. B. Gerätetreiber entwickeln, könnten Sie das Ausführungssystem für Instrumenten-I/O verwenden.
Selbst wenn Sie das Standardausführungssystem verwenden, ist die Benutzeroberfläche noch immer in ihre eigenen Threads unterteilt. Alle Aktivitäten, die auf der Benutzeroberfläche ausgeführt werden, wie z. B. Zeichnen auf dem Frontpanel, Reaktionen auf Mausklicks usw., werden ausgeführt, ohne die Ausführungszeit des Blockdiagrammcodes zu beeinträchtigen. Ebenso verhindert die Ausführung von längeren routinemäßigen Rechneroperationen nicht die Reaktion der Benutzeroberfläche auf Mausklicks oder Dateneingabe über die Tastatur.
Rechner mit mehreren Prozessoren profitieren sogar noch mehr vom Multithreading. Auf einem Rechner mit nur einem Prozessor weist das Betriebssystem den Threads eine Priorität zu und teilt die Ausführungszeit unter den verschiedenen Threads auf dem Prozessor auf. Auf einem Rechner mit mehreren Prozessoren können Threads simultan ausgeführt werden, so dass mehr als eine Aktivität zur gleichen Zeit ausgeführt werden kann.