Setzen von Prioritäten bei parallelen Tasks
- Aktualisiert2025-08-27
- 5 Minute(n) Lesezeit
Sie können parallelen Tasks durch die strategische Verwendung der Funktion Warten (ms) oder durch das Ändern der Prioritätseinstellungen in der Kategorie zur Ausführung im Dialogfeld Eigenschaften für VI verschiedene Prioritäten zuweisen.
In den meisten Fällen jedoch sollten Sie die Priorität eines VIs nicht ändern. Die Verwendung von verschiedenen Prioritäten zur Steuerung der Ausführungsreihenfolge kann unter Umständen zu unerwarteten Ergebnissen führen. Bei falscher Verwendung können die Tasks mit niedrigerer Priorität vollständig außer Acht gelassen werden. Wenn Tasks mit höherer Priorität während einer großen Dauer ausgeführt werden, werden die Tasks mit niedrigerer Priorität solange nicht ausgeführt bis die Tasks mit hoher Priorität in periodischen Abständen warten.
Verwendung von Wartefunktionen
Die Wartefunktion kann dazu verwendet werden, weniger wichtige Tasks weniger häufig ausführen zu lassen. Wenn Sie z. B. mehrere parallele Schleifen haben und einige davon weniger häufig ausgeführt werden sollen, dann verwenden Sie die Wartefunktion für die Tasks mit der niedrigeren Priorität. So wird mehr Zeit für die übrigen Tasks freigegeben. In vielen Fällen ist die Verwendung der Wartefunktion ausreichend. Dazu ist es nicht nötig, die Prioritäten unter Datei»VI-Eigenschaften und Ausführen im Dialogfeld Eigenschaften für VI zu ändern.
Wie im Abschnitt Synchrone/Blockierende Knoten beschrieben, entfernt der Rechner ein wartendes Blockdiagramm aus der Warteschlange, um andere Tasks ausführen zu können.
Wartefunktionen sind sehr hilfreich bei Schleifen, die durch Polling die Benutzeroberfläche abfragen. Eine Wartezeit von 100 bis 200 ms ist kaum wahrnehmbar, setzt aber die Anwendung frei, um andere Tasks effektiver ausführen zu können. Zusätzlich dazu setzt diese Wartezeit das Betriebssystem frei, so dass es mehr Zeit auf andere Threads oder Anwendungen verwenden kann. Erwägen Sie das Hinzufügen einer Wartezeit zu weniger zeitkritischen Bereichen des Blockdiagramms, um mehr Zeit für andere Tasks zur Verfügung zu haben.
Bei Verwendung der Funktion Warten (ms) wartet LabVIEW so lange, wie angegeben. Die Funktion Bis zum nächsten Vielfachen von ms warten hat einen Millisekundenzähler und wartet, bis dieser ein Vielfaches des angegebenen Werts erreicht hat.
Ändern der Prioritäten
Sie können die Priorität eines VIs auch unter Datei»VI-Eigenschaften und Ausführen im Dialogfeld Eigenschaften für VI ändern. Sie können zwischen folgenden Prioritätsleveln wählen (aufsteigend geordnet, beginnend mit der niedrigsten Priorität):
- Hintergrundpriorität (niedrigste)
- normale Priorität
- über normaler Priorität
- Hohe Priorität
- Zeitkritische Priorität (höchste)
- Priorität "Unterprogramm"
Die ersten fünf Prioritäten verhalten sich ähnlich (niedrigste bis höchste). Die Priorität "Unterprogramm" verfügt jedoch über zusätzliche Eigenschaften. Die folgenden beiden Abschnitte beziehen sich auf alle Prioritäten mit Ausnahme des Levels "Unterprogramm".
Prioritäten im Ausführungssystem der Benutzeroberfläche
Im Ausführungssystem der Benutzeroberfläche von Multithread-Anwendungen gibt es für die Warteschlange des Ausführungssystems mehrere Eintrittspunkte. Das Ausführungssystem fügt VIs mit höherer Priorität in der Warteschlange vor VIs mit niedrigerer Priorität ein. Wenn ein Task mit hoher Priorität ausgeführt wird und die Warteschlange nur Tasks mit niedriger Priorität enthält, wird das VI mit hoher Priorität weiterhin ausgeführt. Wenn sich z. B. zwei VIs aus den verschiedenen Prioritätsleveln in der Warteschlange befinden, nutzen die beiden zeitkritischen VIs die Ausführungszeit exklusiv bis beide VIs beendet werden. Anschließend teilen sich die beiden VIs mit hoher Priorität die Ausführungszeit, solange bis beide beendet werden und so weiter. Wenn die VIs mit höherer Priorität jedoch eine wartende Funktion aufrufen, entfernt das Ausführungssystem VIs mit höherer Priorität aus der Warteschlange, bis das Warten oder der I/O beendet werden. So werden andere Tasks (mit niedrigerer Priorität) ausgeführt. Sobald das Warten oder I/O beendet wurde, fügt das Ausführungssystem den wartenden Task vor Tasks mit niedrigerer Priorität ein.
Wenn ein VI mit hoher Priorität ein SubVI mit niedrigerer Priorität aufruft, übernimmt dieses SubVI die höchste Priorität von jedem aufrufenden VI, selbst dann, wenn das aufrufende VI nicht ausgeführt wird. Das heißt also, dass die Prioritätslevel von SubVIs, die von einem VI aufgerufen werden, um das Prioritätslevel eines SubVIs zu erhöhen, nicht verändert werden müssen.
Prioritäten in anderen Ausführungssystemen und Multithread-Anwendungen
Jedes einzelne Ausführungssystem verfügt über ein separates Ausführungssystem für jedes Prioritätslevel ausschließlich der Priorität "Unterprogramm" und des Ausführungssystems der Benutzeroberfläche. Jedes dieser Ausführungssysteme hat eine eigene Warteschlange und zwei Threads, die Blockdiagramme in dieser Warteschlange bearbeiten.
Es gibt ein Ausführungssystem für die Benutzeroberfläche unabhängig von der Priorität sowie 25 weitere für die anderen Systeme - fünf Ausführungssysteme multipliziert mit fünf für jedes der fünf Prioritätslevel.
Für jedes dieser Ausführungssysteme weist das Betriebssystem den Threads auf Grundlage dieser Einteilung Prioritätslevel zu. Daher wird Tasks mit höherer Priorität bei der typischen Ausführung mehr Zeit zugewiesen als Tasks mit niedrigerer Priorität. Tasks mit niedrigerer Priorität werden so lange nicht ausgeführt, bis die Tasks mit höherer Priorität in periodischen Abständen warten - genauso wie bei den Prioritäten im Ausführungssystem der Benutzeroberfläche.
Einige Betriebssysteme versuchen, dieses Problem zu umgehen, indem sie in periodischen Abständen das Prioritätslevel von Tasks mit niedrigerer Priorität anheben. Bei solchen Betriebssystemen erhalten Tasks mit niedrigerer Priorität in periodischen Abständen die Möglichkeit zur Ausführung, selbst dann, wenn Tasks mit hoher Priorität kontinuierlich ausgeführt werden müssen. Dieses Verhalten variiert jedoch von Betriebssystem zu Betriebssystem. Bei einigen Betriebssystemen können dieses Verhalten und die Prioritäten von Tasks eingestellt werden.
Das Ausführungssystem der Benutzeroberfläche verfügt über nur einen Thread. Der Thread der Benutzeroberfläche verwendet die normale Priorität der anderen Ausführungssysteme. Wenn also ein VI im Standardausführungssystem mit der Priorität "Über normal" ausgeführt werden soll, kann das Ausführungssystem der Benutzeroberfläche möglicherweise nicht ausgeführt werden. Dies wiederum kann zu einer langsamen oder gar nicht reagierenden Benutzeroberfläche führen. Wenn einem VI Hintergrundpriorität zugewiesen wird, wird es mit niedrigerer Priorität ausgeführt als das Ausführungssystem der Benutzeroberfläche.
Wenn ein VI ein SubVI mit niedrigerer Priorität aufruft, erhält dieses SubVI - wie bereits beschrieben - für die Dauer des Aufrufs dasselbe Prioritätslevel wie das aufrufende VI.
Prioritätslevel "Unterprogramm"
Das Prioritätslevel "Unterprogramm" ermöglicht es einem VI, so effizient wie möglich ausgeführt zu werden. VIs, die mit dieser Priorität laufen, müssen sich die Ausführungszeit nicht mit anderen VIs teilen.
Wenn ein VI mit der Priorität "Unterprogramm" ausgeführt wird, dann übernimmt es die Steuerung des Threads, in dem es ausgeführt wird und wird im selben Thread wie das aufrufende VI ausgeführt. Selbst dann, wenn das andere VI sich auf dem Prioritätslevel "Unterprogramm" befindet, kann kein anderes VI in diesem Thread ausgeführt werden bis das Unterprogramm-VI zu Ende ausgeführt ist. In einer Anwendung mit nur einem Thread wird kein anderes VI ausgeführt. Bei Ausführungssystemen bearbeitet der Thread, der die Unterprogramme ausführt, keine anderen VIs. Der zweite Thread des Ausführungssystems kann gemeinsam mit anderen Ausführungssystemen jedoch weiterhin VIs ausführen.
Die Ausführung von VIs mit Unterprogramm-Priorität wird rationalisiert, so dass Bedien- und Anzeigeelemente des Frontpanels nicht aktualisiert werden, wenn das Unterprogramm gerade aufgerufen wird. Das Frontpanel eines VIs mit Unterprogramm-Priorität gibt keine Auskunft über seine Ausführung.
Ein Unterprogramm-VI kann andere Unterprogramm-VIs aufrufen, nicht aber ein VI mit einer anderen Priorität. Verwenden Sie diese Priorität, wenn Sie den Speicherbedarf in einem SubVI für einfache Berechnungen minimieren möchten.
Da Unterprogramme nicht mit der Warteschlange interagieren sollen, können sie auch keine andere Funktion aufrufen, mit deren Hilfe LabVIEW sie aus der Schlange herausnehmen könnte. Das bedeutet auch, dass sie die Warte-, GPIB-, VISA- oder Dialogfeld-Funktionen nicht aufrufen können.
Unterprogramme verfügen über ein zusätzliches Feature, das bei zeitkritischen Anwendungen sehr hilfreich sein kann. Wenn Sie ein SubVI mit der rechten Maustaste anklicken und Unterprogrammaufruf übergehen, wenn beschäftigt aus dem Kontextmenü auswählen, übergeht das Ausführungssystem den Aufruf, wenn das Unterprogramm gerade in einem anderen Thread ausgeführt wird. Das kann bei zeitkritischen Schleifen sehr hilfreich sein, bei denen das Ausführungssystem die Operationen übergeht, die das Unterprogramm ausführt und wenn Sie die Verzögerung durch das Warten auf die Beendigung des SubVIs vermeiden möchten. Wenn Sie die Ausführung eines SubVIs übergehen, erhalten alle Ausgänge des SubVIs den Standardwert für das Anzeigeelement auf dem Frontpanel des SubVIs.