Reentrancy (Computerwissenschaft)

In der Computerwissenschaft, einem Computerprogramm oder dem Unterprogramm wird einspringend genannt, wenn es in der Mitte seiner Ausführung unterbrochen und dann sicher wieder ("wiedereingegangen") vor seinen vorherigen Beschwörungen ganze Durchführung genannt werden kann. Die Unterbrechung konnte durch eine innere Handlung wie ein Sprung oder Anruf oder durch eine Außenhandlung wie eine Hardware-Unterbrechung oder Signal verursacht werden. Sobald die wiedereingegangene Beschwörung vollendet, werden die vorherigen Beschwörungen richtige Ausführung fortsetzen.

Diese Definition entsteht aus Einzeln-Gewindeprogrammierumgebungen, wo der Fluss der Kontrolle durch eine Hardware-Unterbrechung unterbrochen und einer Unterbrechungsdienstroutine (ISR) übertragen werden konnte. Jedes Unterprogramm, das durch den ISR verwendet ist, der potenziell durchgeführt haben könnte, als die Unterbrechung ausgelöst wurde, sollte einspringend sein. Häufig sind über den Betriebssystemkern zugängliche Unterprogramme tatsächlich nicht einspringend. Folglich werden Unterbrechungsdienstroutinen in den Handlungen beschränkt, die sie durchführen können und gewöhnlich eingeschränkt davon, auf das Dateisystem oder sogar davon zuzugreifen, Gedächtnis zuzuteilen.

Ein Unterprogramm, das direkt oder indirekt rekursiv ist, sollte einspringend sein. Diese Politik wird durch strukturierte Programmiersprachen teilweise beachtet. Jedoch kann ein Unterprogramm scheitern, einspringend zu sein, wenn es sich auf eine globale Variable verlässt, um unverändert zu bleiben, aber dass Variable modifiziert wird, wenn das Unterprogramm rekursiv angerufen wird.

Die Definition von reentrancy, der in Einzeln-Gewindeumgebungen hervorgebracht ist, und unterscheidet sich von dieser der Faden-Sicherheit in Mehrgewindeumgebungen. Ein einspringendes Unterprogramm kann Faden-Sicherheit erreichen, aber diese Bedingung allein könnte in allen Situationen nicht genügend sein. Umgekehrt muss vor dem Faden sicherer Code nicht notwendigerweise einspringend sein (sieh unten für Beispiele).

Beispiel

Das ist ein Beispiel einer Funktion, die scheitert, einspringend (sowie vor dem Faden sicher zu sein). Als solcher sollte es nicht in der Unterbrechungsdienstroutine verwendet worden sein

interne Nummer t;

leerer Tausch (interne Nummer *x, interne Nummer *y)

{\

t = *x;

*x = *y;

//Hardware-Unterbrechung könnte isr hier anrufen!

*y = t;

}\

Leere isr

{\

interne Nummer x = 1, y = 2;

Tausch (&x, &y);

}\

</Quelle>

konnte vor dem Faden sicher durch das Bilden mit dem Faden lokal gemacht werden. Es scheitert noch, einspringend zu sein, und das wird fortsetzen, Probleme zu verursachen, wenn derselbe Zusammenhang wie ein Faden herbeigerufen wird, der bereits durchführt.

Das folgende, etwas erfunden, Modifizierung der Tausch-Funktion, die darauf achtet, die globalen Daten in einem konsequenten Staat zurzeit zu verlassen, über den es herrscht, ist vollkommen einspringend, aber nicht vor dem Faden sicher, weil es nicht sicherstellt, dass die globalen Daten in einem konsequenten Staat während der Ausführung sind:

interne Nummer t;leerer Tausch (interne Nummer *x, interne Nummer *y){\

interne Nummer s;

s = t;//sparen globale Variable

t = *x; *x = *y; //Hardware-Unterbrechung könnte isr hier anrufen! *y = t;

t = s;//stellen globale Variable wieder her

}\Leere isr {\ interne Nummer x = 1, y = 2; Tausch (&x, &y);}\</Quelle>

Abstammung und Erklärung von Regeln

Reentrancy ist nicht dasselbe Ding wie idempotence (das Meinen, dass die Funktion mehr genannt werden als einmal, noch genau dieselbe Produktion erzeugen kann, als ob es nur einmal genannt worden war). Im Allgemeinen erzeugt eine Funktion Produktionsdaten, die auf einigen Eingangsdaten gestützt sind (obwohl beide, im Allgemeinen fakultativ sind). Auf geteilte Daten konnte von jedem jederzeit zugegriffen werden. Wenn Daten von irgendjemandem geändert werden können (und niemand jene Änderungen nachgeht) dann, gibt es keine Garantie für diejenigen, die eine Gegebenheit teilen, ob diese Gegebenheit dasselbe als jederzeit vorher ist. Idempotence bezieht reentrancy ein, aber das gegenteilige ist nicht notwendigerweise wahr.

Daten sind von globalen (außerhalb des Spielraums jeder Funktion und mit einem unbestimmten Ausmaß), oder lokal (hat jedes Mal geschaffen, wenn eine Funktion genannt und auf den Ausgang zerstört wird) Spielraum.

Lokale Daten werden von keinem geteilt, wiederhereingehend oder nicht, Routinen; deshalb betreffen sie Wiedereintritt nicht. Globale Daten werden entweder durch jede Funktion, genannt globale Variablen geteilt, oder durch alle Funktionen desselben Namens, genannt statische Variablen geteilt; deshalb können sie es betreffen.

  • Muss nicht statisch (oder global) nichtunveränderliche Daten halten.

Einspringende Funktionen können globale Daten verwenden, um damit zu arbeiten. Zum Beispiel konnte eine einspringende Unterbrechungsdienstroutine ein Stück des Hardware-Status ergreifen, um damit zu arbeiten (z.B Serienhafen gelesener Puffer), der nicht nur global, aber flüchtig ist. Noch wird dem typischen Gebrauch von statischen Variablen und globalen Daten nicht empfohlen, im Sinne nicht nicht atomar gelesen modifizieren Schreibbefehle sollte in diesen Variablen verwendet werden

  • Muss seinen eigenen Code nicht modifizieren.

Das Betriebssystem könnte einem Prozess erlauben, seinen Code zu modifizieren. Es gibt verschiedene Gründe dafür (blitting Grafik schnell, Unerfahrenheit von OS Programmierern), aber die Tatsache ist, dass Code dasselbe nächste Mal nicht sein könnte.

Es kann sich modifizieren, wenn es in seinem eigenen einzigartigen Gedächtnis wohnt. D. h. wenn jede neue Beschwörung eine verschiedene physische Maschinencodeposition verwendet, wo eine Kopie des ursprünglichen Codes gemacht wird, wird es andere Beschwörungen nicht betreffen, selbst wenn es dann sich während der Ausführung dieses besonderen Fadens modifiziert).

  • Muss nichteinspringende Computerprogramme oder Routinen nicht nennen.

Vielfache Niveaus vom 'Vorrang des Benutzers/Gegenstands/Prozesses' und/oder in einer Prozession mehrgehend komplizieren gewöhnlich die Kontrolle des einspringenden Codes. Es ist wichtig, jeden Zugang nachzugehen, und oder Nebenwirkungen, die innerhalb einer Routine getan werden, haben vorgehabt, einspringend zu sein.

Reentrancy ist ein Hauptmerkmal der funktionellen Programmierung.

Irgendwelche rekursiven Unterprogramme müssen einspringend sein.

Außerdem müssen Unterprogramme, die von einem Unterbrechungsdressierer direkt oder indirekt genannt werden, um einspringend zu sein, wenn es Bedürfnis gibt, eine Unterbrechung zu bedienen, bevor dem vorherigen bereits gedient wird.

Einspringender Unterbrechungsdressierer

Ein "einspringender Unterbrechungsdressierer" ist ein Unterbrechungsdressierer, der Unterbrechungen früh im Unterbrechungsdressierer wiederermöglicht. Das kann Unterbrechungslatenz reduzieren.

Im Allgemeinen, während man Unterbrechungsdienstroutinen programmiert, wird es empfohlen, Unterbrechungen so bald wie möglich im Unterbrechungsdressierer wiederzuermöglichen. Das hilft zu vermeiden, Unterbrechungen zu verlieren.

Beispiele

Im folgenden Stück des C-Codes sind weder Funktionen noch einspringend.

interne Nummer g_var = 1;

interne Nummer f

{\

g_var = g_var + 2;

geben Sie g_var zurück;

}\

interne Nummer g

{\

geben Sie f + 2 zurück;

}\</Quelle>

Im obengenannten, hängt von einer nichtunveränderlichen globalen Variable g_var ab; so, wenn zwei Fäden es und Zugang gleichzeitig durchführen, dann ändert sich das Ergebnis abhängig vom Timing der Ausführung. Folglich, ist nicht einspringend. Keiner ist; es ruft, der nicht einspringend ist.

Diese ein bisschen veränderten Versionen sind einspringend:

interne Nummer f (interne Nummer i)

{\

kehren Sie i + 2 zurück;

}\

interne Nummer g (interne Nummer i)

{\

geben Sie f (i) + 2 zurück;

}\</Quelle>

Im folgenden Stück des C-Codes ist die Funktion, aber nicht einspringender vor dem Faden sicher

int Funktion

{\

mutex_lock ;

...

Funktionskörper

...

mutex_unlock ;

}\</Quelle>

Im obengenannten, kann durch verschiedene Fäden ohne jedes Problem genannt werden. Aber wenn die Funktion in einem einspringenden Unterbrechungsdressierer verwendet wird und eine zweite Unterbrechung innerhalb der Funktion entsteht, wird die zweite Routine für immer hängen. Da Unterbrechungswartung andere Unterbrechungen unbrauchbar machen kann, konnte das ganze System leiden.

Beziehung, um Sicherheit einzufädeln

Dieses Konzept ist von, aber nah verbunden damit verschieden, vor dem Faden sicher. Eine Funktion kann vor dem Faden sicher und noch immer nicht einspringend sein. Zum Beispiel konnte eine Funktion rundum mit einem mutex gewickelt werden (der Probleme in Nebenläufigkeitsumgebungen vermeidet), und wenn diese Funktion als eine einspringende Funktion in einer Unterbrechungsdienstroutine verwendet wird, konnte es das Warten für die erste Ausführung hungern lassen, um den mutex zu veröffentlichen. Der Schlüssel, um Verwirrung zu vermeiden, besteht darin, dass sich einspringend auf nur eine Faden-Durchführung bezieht. Es ist ein Konzept von der Zeit, als keine stark mehrbeanspruchenden Betriebssysteme bestanden haben.

Siehe auch

Zeichen

Außenverbindungen


Strategische Waffenbeschränkungsgespräche / Emmitt Smith
Impressum & Datenschutz