Faden-Sicherheit

Faden-Sicherheit ist ein im Zusammenhang von Mehrgewindeprogrammen anwendbares Computerprogrammierkonzept. Ein Stück des Codes ist vor dem Faden sicher, wenn es nur geteilte Datenstrukturen gewissermaßen manipuliert, der sichere Ausführung durch vielfache Fäden zur gleichen Zeit versichert. Es gibt verschiedene Strategien, um vor dem Faden sichere Datenstrukturen zu machen.

Softwarebibliotheken können bestimmte Garantien der Faden-Sicherheit zur Verfügung stellen. Zum Beispiel, gleichzeitig liest könnte versichert werden, vor dem Faden sicher zu sein, aber gleichzeitig schreibt könnte nicht sein. Ob ein Programm mit solch einer Bibliothek vor dem Faden sicher ist, hängt davon ab, ob es die mit jenen Garantien gewissermaßen im Einklang stehende Bibliothek verwendet.

Eine Schlüsselherausforderung in der Mehrgewindeprogrammierung, Faden-Sicherheit war nicht eine Sorge für die meisten Anwendungsentwickler bis zu den 1990er Jahren, als Betriebssysteme begonnen haben, vielfache Fäden für die Codeausführung auszustellen. Heute kann ein Programm Code auf mehreren Fäden gleichzeitig in einem geteilten Adressraum durchführen, wo jeder jener Fäden Zugang zu eigentlich dem ganzen Gedächtnis jedes anderen Fadens hat. So haben der Fluss der Kontrolle und die Folge von Zugängen zu Daten häufig wenig Beziehung dazu, was durch das Schauen auf den Text des Programms, das Verletzen des Grundsatzes von kleinstem Erstaunen vernünftig erwartet würde. Faden-Sicherheit ist ein Eigentum, das Code erlaubt, in Mehrgewindeumgebungen durch das Wiederherstellen von einigen der Ähnlichkeiten zwischen dem wirklichen Fluss der Kontrolle und dem Text des Programms mittels der Synchronisation zu laufen.

Identifizierung

Es ist nicht leicht zu bestimmen, ob ein Stück des Codes vor dem Faden sicher ist. Jedoch gibt es mehrere Hinweise, die das Bedürfnis nach der sorgfältigen Überprüfung andeuten zu sehen, ob es unsicher ist:

  • das Zugreifen auf globale Variablen oder den Haufen
  • Mittel des Zuteilens/Neuverteilung/Freigebens, die globales Spielraum (Dateien, Teilprozesse, Pfeifen, usw.) haben
  • indirekte Zugänge durch Griffe oder Zeigestöcke
  • jede sichtbare Nebenwirkung (z.B, Zugang zu flüchtigen Variablen auf der C Programmiersprache)

All das kann unter der Manipulation des globalen Staates untergeordnet werden, der nicht neccessarily eingeschränkt auf ein einzelnes Programm/Prozess ist.

Durchführung

Es gibt einige Weisen, Faden-Sicherheit zu erreichen:

Re-entrancy: Das Schreiben codiert auf solche Art und Weise, dass es durch einen Faden teilweise durchgeführt werden, der durch denselben Faden wiederdurchgeführt ist oder gleichzeitig durch einen anderen Faden durchgeführt ist, und noch richtig die ursprüngliche Ausführung vollenden kann. Das verlangt das Sparen der Zustandinformation in Variablen, die zu jeder Ausführung, gewöhnlich auf einem Stapel, statt in statischen oder globalen Variablen oder anderem nichtlokalem Staat lokal sind. Es gibt noch einige seltene Fälle, wo nichtlokaler Staat in einer einspringenden Funktion verwendet werden kann, wenn der Zugang durch Atomoperationen getan wird und die Datenstruktur einspringend ist.

Gegenseitige Ausschluss- oder Prozess-Synchronisation: Der Zugang zu geteilten Daten wird mit Mechanismen in Fortsetzungen veröffentlicht, die sicherstellen, dass nur ein Faden liest oder die geteilten Daten jederzeit schreibt. Große Sorge ist erforderlich, wenn ein Stück von Codezugängen vielfache geteilte Stücke von Daten — Probleme Rasse-Bedingungen, tote Punkte, livelocks und Verhungern einschließt.

Mit dem Faden lokale Lagerung: Variablen werden lokalisiert, so dass jeder Faden seine eigene private Kopie hat. Diese Variablen behalten ihre Werte über das Unterprogramm und die anderen Codegrenzen und sind vor dem Faden sicher, da sie zu jedem Faden lokal sind, wenn auch der Code, welche Zugänge sie gleichzeitig durch einen anderen Faden durchgeführt werden könnten.

Atomoperationen: Auf geteilte Daten wird durch das Verwenden von Atomoperationen zugegriffen, die durch andere Fäden nicht unterbrochen werden können. Das verlangt gewöhnlich verwendende spezielle Maschinensprachinstruktionen, die in einer Laufzeitbibliothek verfügbar sein könnten. Da die Operationen atomar sind, werden die geteilten Daten immer in einem gültigen Staat behalten, egal was andere Fäden darauf zugreifen. Atomoperationen bilden die Basis von vielen Faden-Blockierungsmechanismen.

Beispiele

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

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.

Gleichzeitige Programmierung

Bemerken Sie, dass ein Stück des Codes Faden sicher, und noch unfähig sein kann, zur gleichen Zeit zu laufen, den ein anderes Stück des Codes führt. Ein triviales Beispiel davon ist, wenn dieses andere Stück des Codes den Computer wiederanfängt.

Das folgende Stück des C-Codes, präsentiert eine weniger offensichtliche Situation, wo ein Faden eine Datei verwendet, die ein anderer Faden oder Prozess löschen könnten.

int Funktion {\

Rotforelle *filename = "/etc/config";

DATEI *config;

wenn (file_exist (Dateiname)) {\

config = fopen (Dateiname);

}\

}\</Quelle>

Im obengenannten ist die Funktion vor dem Faden sicher, wie es von jeder Zahl von Fäden genannt werden kann und nicht scheitern wird. Aber alle Anrufe sollten in einer kontrollierten Umgebung sein. Wenn durchgeführt, in einer Mehrprozess-Umgebung, oder wenn die Datei auf einem netzgeteilten Laufwerk versorgt wird, gibt es keine Garantie, dass sie nicht gelöscht wird.

Schwierigkeiten

Eine Annäherung an das Bilden von vor dem Faden sicheren Daten, der mehrere der obengenannten Elemente verbindet, soll Änderungen atomar vornehmen, um die geteilten Daten zu aktualisieren. So ist der grösste Teil des Codes gleichzeitig, und wenig Zeit wird in Fortsetzungen veröffentlicht verbracht.

Siehe auch

  • Kontrollfluss-Analyse
  • Vorzugsinversion
Parallelitätskontrolle
  • Ausnahme-Sicherheit
  • Das Kommunizieren folgender Prozesse - eine Technik, um Parallelität zu analysieren

Links


Wirtschaftsgeschichte / Verfeinernd und von unten nach oben Design
Impressum & Datenschutz