INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Reentrance



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

20.10.2006, 18:13
Beitrag #11

cb Offline
LVF-SeniorMod


Beiträge: 1.731
Registriert seit: Feb 2006

2018SP1
2001
EN

40xxx
Deutschland
Reentrance
' schrieb:Was passiert wenn ich ein reentrantes VI schneller aufrufe, als das VI ausgeführt wird?

wenn das VI in einen Datenfluss eingebunden ist, z.B. in einer while Schleife und ein error-Cluster rein und raus geht, dann passiert nichts weiter, d.h. die Geschwindigkeit des reentranten VIs würde ggf. die Schleifen-Geschwindigkeit bestimmen.

Wenn du ein reentrantes VI über VI Server aufrufst und du das VI schneller aufrufst, als das VI für die Abarbeitung braucht, dann müllst du dir so lange den Speicher zu, bis LabVIEW aufgibt. Beispiel: dein reentrantes VI braucht 10 Sekunden für eine Berechnung, du rufst aber jede Sekunde eine neue instanz auf, dann ist bald Schicht im SchachtWink

Grüße
CB

http://www.rotabench.com - rotierende Prüfstände nach dem Baukasten-Prinzip
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
21.10.2006, 11:44
Beitrag #12

eg Offline
LVF-SeniorMod


Beiträge: 3.868
Registriert seit: Nov 2005

2016
2003
kA

66111
Deutschland
Reentrance
' schrieb:Wenn du ein reentrantes VI über VI Server aufrufst und du das VI schneller aufrufst, als das VI für die Abarbeitung braucht, dann müllst du dir so lange den Speicher zu, bis LabVIEW aufgibt. Beispiel: dein reentrantes VI braucht 10 Sekunden für eine Berechnung, du rufst aber jede Sekunde eine neue instanz auf, dann ist bald Schicht im SchachtWink


Genau das, was ich wissen wollte. Danke

Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
21.10.2006, 15:05
Beitrag #13

thomas.sandrisser Offline
LVF-SeniorMod


Beiträge: 1.298
Registriert seit: Sep 2005

xxxx
2005
EN

78759
United States
Reentrance
NAbend,
das mit dem zumuellen hat nur bedingt seine Richtigkeit.
Denn du kannst per VI Server auch einen Option Aufruf mittels 0x08 machen, was bedeutet, dass nach dem abarbeiten des zeitablaufinvarianten VIs der Speicher wieder frei gemacht wird.
D.h. dass in dem konkreten Beispiel der 11. Aufruf des VIs per VI Server wieder den Speicherbereich des 1. VIs verwendet (sofern sich von den Daten nichts geaendert hat).
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
22.10.2006, 00:32 (Dieser Beitrag wurde zuletzt bearbeitet: 22.10.2006 00:35 von Lucki.)
Beitrag #14

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Reentrance
' schrieb:das mit dem zumuellen hat nur bedingt seine Richtigkeit.
Das sehe ich anders: Das ist nicht nur "nur bedingt richtig" sondern schlichtweg falsch. Das läßt sich leicht nachprüfen. Jedes Ikon eines reentranten VI inerhalb eines Programms ist ein eigener Clon. Wenn es drei Ikons im Programm gibt, dann gibt es diese drei Clones, und nicht mehr. Wenn in einer Schleife, wie das in einer Schleife eben der Fall zu sein pflegt, ein und dasselbe Ikon eines Sub-VIs immer wieder aufgerufen wird, und das Sub-VI ist reentrant und außerdem langsam, dann passiert nichts anderes als bei einem nicht-reentrantes VI: ein neuer Scheifendurchlauf findet erst statt, wenn alles in der Schleife - und dazu gehört auch das reentrante VI - abgearbeitet ist. Von der Erzeugung neuer Clones bei dieser Gelegenheit kann überhaupt keine Rede sein und auch nicht vom Zumüllen des Speichers.
Denselben Efekt wie mit einem reentranten VI erreicht man, wenn man mehrere identisch Kopien des Sub-Vis mit unterschiedlichem Namen erzeugt und jede Kopie im Programm nur ein mal verwendet. Nachteile hätte das nur bei der Versionspflege und im größeren Speicherbedarf auf der Harddisk.


Wann sind reentrante Sub-VI sinnvoll oder sogar notwendig?
Fall 1:
In eine Schleife laufen 10 identisch Sub-Vi parallel, und in jedem Sub-Vi gibt es Wartezeiten. Bei normalen SUB-Vi ist die Schleifendurchlaufzeit (wenn man mal die sonstigen zeiten vernachlässigt) gleich der Summe aller Wartezeiten, bei reenranten VI ist die Schleifendurclaufzet nur gleich der längten dieser 10 Zeiten
Fall 2:
Wenn das Sub-Vi nicht initialisierte Schleifen hat, dann braucht jedes Ikon seinen eigenen Datenbereich. Beispiel siehe unten: Zwei Punkt-zu-Punkt Tiefpassfilter mit den Zeitkonstanten 10 bzw. 20 Datenpunkten werden parallel betrieben. Wenn das Tiefpass-VI nicht reentrant ist, funktioniert das nicht, weil es insgesmat nur ein Memoryelement gibt. Es braucht aber jeder Filter seinen eigenen Speicher.
Fall 3:
Rekursiver Aufruf eines VI, d.h. Aufruf des Vi abc.vi innerhalb des VI abc.vi. Das kenne ich allerdings nicht aus eigener Praxis, aber hier - und nur hier - kann man sich ein Zumüllen des Speichers tatsächlich denken, bei entsprechender Tiefe der Rekursion.


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
22.10.2006, 09:32
Beitrag #15

cb Offline
LVF-SeniorMod


Beiträge: 1.731
Registriert seit: Feb 2006

2018SP1
2001
EN

40xxx
Deutschland
Reentrance
' schrieb:Das sehe ich anders: Das ist nicht nur "nur bedingt richtig" sondern schlichtweg falsch.

nö, ist es nicht. Ich präzisiere meine Aussage nochmal:

- das 10 Sekunden Beispiel ist falsch, wie Freedive bereits angemerkt hat, richtig ist:
Wenn man mittels VI Server reentrante VIs schneller aufruft, als sie abgearbeitet werden, dann müllt man sich den Speicher zu. So lange es bei einer definierten maximalen Anzahl von Instanzen bleibt, ist das kein Problem. Problematisch kann es werden, wenn man keine Kontrolle mehr über die Anzahl der Instanzen hat. Bei meinem 10 Sekunden Beisiel hätte man immer nur 10 Instanzen im Speicher => kein Problem.

Wenn man meherere Instanzen eines reentranten VIs z.B. in einer while-Schleife aufruft, dann gilt natürlich das Datenflussprinzip (hatte ich schon erwähnt ...), welbst wenn die VIs *in der Luft hängen*, da *kann* man nicht in die Gefahr laufen, dass man den Speicher zumüllt.

Und wenn man die Posts mal genau durchliest, dann meinen wir glaub ich alle das gleicheWink

grüße
CB

http://www.rotabench.com - rotierende Prüfstände nach dem Baukasten-Prinzip
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
22.10.2006, 11:00 (Dieser Beitrag wurde zuletzt bearbeitet: 22.10.2006 11:00 von Lucki.)
Beitrag #16

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Reentrance
' schrieb:Und wenn man die Posts mal genau durchliest, dann meinen wir glaub ich alle das gleicheWink
Ja, ich hatte überlesen, daß Du das Zumüllen auf VI-Server eingeschränlt hattest, und da kenne ich mich überhaupt nicht aus und hätte besser den Mund handeln sollen.
Was ich meinte, ist, daß in den anderen diskutierten Fällen, bei Verwendung eines reentranten Sub-VIs, ein "Zumüllen", wenn man das überhaupt so nennen mag, nur pro zusätzlich platziertes Ikon stattfindet. Es gibt nur so viel Clones, wie es Vis gibt. Es besteht also keine Gefahr, daß während der Laufzeit des Programmes immer wieder zusätziche Clones von selbst entstehen.

Ich habe mal ein Spielprorgramm gemacht, um den Unterschied bei der parallelen Abarbeitung in einer Schleife zu demonstrieren. Die Sub.Vis haben Wartezeiten von 600,700,800,900 ms, und erzeugen dann einen Ton von 50ms, Tonhöhe gleich Zahlenwert der Wartezeit. In dem einen Fall braucht ein Schleifendurchlauf 600+700+800+900 ms, im anderen Fall nur 900ms.

Übrigens: Das dämlichste, was man mit einem reentranten VI machen kann, ist, damit auf ein und dieselbe Hardware mehrere Male zuzugreifen. Denn Hardware hat die dumme Eigenschaft, daß sie sich nicht mit klont, und da sind Konflikte vorprogrammiert.


Angehängte Datei(en)
Sonstige .vi  Rentrant.vi (Größe: 8,99 KB / Downloads: 158)

Sonstige .vi  NonRentrant.vi (Größe: 8,94 KB / Downloads: 151)

Sonstige .vi  SubViReentrant.vi (Größe: 8,22 KB / Downloads: 154)

Sonstige .vi  SubViNonReentrant.vi (Größe: 8,23 KB / Downloads: 149)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
22.10.2006, 17:58
Beitrag #17

cb Offline
LVF-SeniorMod


Beiträge: 1.731
Registriert seit: Feb 2006

2018SP1
2001
EN

40xxx
Deutschland
Reentrance
' schrieb:Was ich meinte, ist, daß in den anderen diskutierten Fällen, bei Verwendung eines reentranten Sub-VIs, ein "Zumüllen", wenn man das überhaupt so nennen mag, nur pro zusätzlich platziertes Ikon stattfindet. Es gibt nur so viel Clones, wie es Vis gibt. Es besteht also keine Gefahr, daß während der Laufzeit des Programmes immer wieder zusätziche Clones von selbst entstehen.

jau, da stimm ich zuSmile

' schrieb:Übrigens: Das dämlichste, was man mit einem reentranten VI machen kann, ist, damit auf ein und dieselbe Hardware mehrere Male zuzugreifen. Denn Hardware hat die dumme Eigenschaft, daß sie sich nicht mit klont, und da sind Konflikte vorprogrammiert.

da auch ... man könnte jetzt natürlich was konstruieren, dass es trozdem geht. z.B. könnte man das reentrante VI über Semaphoren absichern, etc, aber mir fällt jetzt keine wirklich sinnvolle Anwendung ein, wo man das bräuchte, bzw. nicht mit einer Funktional Global erschlagen könnte

Grüße und schönen Sonntach,
CB

http://www.rotabench.com - rotierende Prüfstände nach dem Baukasten-Prinzip
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Gehe zu: