-
GEBIET
-
Die vorliegende Anmeldung betrifft allgemein Computerarchitektur und genauer das Hardwareprozessorausführen.
-
HINTERGRUND
-
Unverwaltete Sprachen wie C und C++ sind inhärent anfällig für speicherbezogene Fehler, die aufgrund von Programmierfehlern auftreten. Solche Fehler verursachen zahlreiche Programmfehler (bugs), die schwierig zu erkennen sind, und sie machen Anwendungen verletzlich für zerstörerische Angriffe, die es zum Beispiel feindlichen Parteien ermöglichen können, das gesamte System unrechtmäßig zu übernehmen. Daher stellen Speicherfehler ein ernstes Problem während der Entwicklung einer Anwendung und während deren Produktion dar.
-
Es gibt vielfältige kostenlose und kommerzielle Werkzeuge, die Speicherfehler erkennen, während Anwendungen ausgeführt werden. Zu Beispielen solcher Werkzeuge zählen: Insure++ von der ParasoftTM Corporation in Kalifornien, U.S.A., Purify of Rational von der International Business Machines Corporation, Armonk, New York, und das Open-Source Projekt Valgrind. Bestehende Werkzeuge überprüfen zum Beispiel, dass Leseoperationen nur an bereits initialisierten Speichern durchgeführt werden und dass Schreiboperationen nur innerhalb von gültigen Bereichen auftreten. Einige Werkzeuge bringen jedoch einen erheblichen Aufwand mit sich und werden daher üblicherweise nur während der Entwicklung und nicht bei der Produktion verwendet, so dass potenziell noch unentdeckte Fehler zurückbleiben.
-
Verwaltete Sprachen wie Java, C# und Perl verwenden einen ähnlichen integrierten Mechanismus für das Prüfen auf Speicherfehler; sie leiden daher unter ähnlichem Aufwand. Sowohl verwaltete als auch unverwaltete Sprachen können von einem höheren Grad an Sicherheit/Korrektheitsprüfungen profitieren, wie beispielsweise der „taint mode” von Perl, der alle Variablenzuweisungen verfolgt, um sicherzustellen, dass berechtigte Anwendungen nicht unbeabsichtigt von Eingaben betroffen sind, die unter Umständen durch einen nicht berechtigten Benutzer vorgenommen wurden. Diese Prüfungen bringen gleichermaßen einen Nachteil in Form von Aufwand mit sich.
-
Die Erfinder der vorliegenden Offenbarung haben erkannt, dass ein Weg, den Aufwand zu verbessern, darin liegt, dass mehrere parallel arbeitende Tasks auf potenzielle Fehler hin prüfen. Die Erfinder der vorliegenden Offenbarung haben zudem erkannt, dass Bedarf nach einem Mechanismus besteht, der ein schnelles Auftreten der Fehlererkennung auf feingranulare Weise und mit geringem Aufwand ermöglicht.
-
KURZZUSAMMENFASSUNG
-
Ein Verfahren zum Prüfen der Programmkorrektheit kann in einem Aspekt ein Ausführen eines Programms in einem Haupt-Hardware-Thread in einem spekulativen Ausführungsmodus beinhalten, in dem der Zustand des Haupt-Hardware-Thread nicht an den Hauptspeicher übergeben wird. Der Haupt-Hardware-Thread kann in einem Hardwareausführungskontext auf einem Computersystem ausgeführt werden, das einen Computerchip mit einer Vielzahl von Hardwareausführungskontexten besitzt. Das Verfahren kann zudem ein Ausführen von Korrektheitsprüfungen durch eine Vielzahl von Helfer-Threads beinhalten. Jeder Helfer-Thread kann in einem separaten Hardwareausführungskontext auf dem Chip parallel mit dem Haupt-Hardware-Thread ausgeführt werden. Die Korrektheitsprüfungen können einen sicheren Punkt im Programm ermitteln, bis zu dem durch den Haupt-Hardware-Thread ausgeführte Operationen korrekt sind. Das Verfahren kann weiterhin ein Ändern des Ausführungsmodus des Haupt-Hardware-Thread am sicheren Punkt in „nicht-spekulativ” beinhalten.
-
In einem weiteren Aspekt kann das Verfahren zum Prüfen der Programmkorrektheit nach dem Herausnehmen des Ausführungsmodus des Haupt-Hardware-Thread aus seinem spekulativen Ausführungsmodus weiterhin ein Übergeben aller Zustände des Haupt-Hardware-Thread an den Hauptspeicher beinhalten. In noch einem weiteren Aspekt kann das Verfahren weiterhin ein Zurückändern des Haupt-Hardware-Thread in den spekulativen Ausführungsmodus und ein Fortsetzen des Ausführens von Korrektheitsprüfungen durch die Vielzahl von Helfer-Threads bis zum Erreichen eines nächsten sicheren Punktes beinhalten, wobei der Ausführungsmodus des Haupt-Hardware-Thread in „nicht-spekulativ” geändert wird.
-
Ein System zum Prüfen der Programmkorrektheit kann in einem Aspekt eine Vielzahl von Hardwareausführungskontexten auf einem Computerchip enthalten. Ein Haupt-Hardware-Thread kann ein Programm in einem ersten Hardwareausführungskontext der Vielzahl von Hardwareausführungskontexten in einem spekulativen Ausführungsmodus ausführen, wobei der Zustand des Haupt-Hardware-Thread nicht an den Hauptspeicher übergeben wird. Eine Vielzahl von Helfer-Threads kann ein Prüfen auf Programmkorrektheit in einem oder mehreren zweiten Hardwareausführungskontexten der Vielzahl von Hardwareausführungskontexten ausführen, wobei die Vielzahl von Helfer-Threads in der Lage ist, einen sicheren Punkt im Programm zu ermitteln, bis zu dem durch den Haupt-Hardware-Thread ausgeführte Operationen korrekt sind. Der Ausführungsmodus des Haupt-Hardware-Thread wird am sicheren Punkt in „nicht-spekulativ” geändert.
-
Das System kann in einem weiteren Aspekt zudem eine Speicherhierarchie enthalten, die mindestens einen lokal zum Chip und dem Hauptspeicher angeordneten Cachespeicher enthält, wobei der Zustand des Haupt-Hardware-Thread während der spekulativen Ausführung im Cachespeicher gespeichert wird und dem Hauptspeicher erst übergeben wird, nachdem der Ausführungsmodus des Haupt-Hardware-Thread in „nicht-spekulativ” geändert wurde. In noch einem weiteren Aspekt wird der Ausführungsmodus des Haupt-Hardware-Thread in den spekulativen Ausführungsmodus zurückgeändert und die Vielzahl von Helfer-Threads fährt mit dem Ausführen korrekten Prüfens fort, bis der nächste sichere Punkt ermittelt wird.
-
Ein computerlesbares Speichermedium, das ein Programm von durch eine Maschine ausführbaren Anweisungen zum Ausführen eines oder mehrerer hierin beschriebener Verfahren speichert, kann ebenfalls bereitgestellt werden.
-
Weitere Merkmale sowie der Aufbau und die Funktionsweise vielfältiger Ausführungsformen werden nachstehend unter Bezugnahme auf die angehängten Zeichnungen im Detail beschrieben. In den Zeichnungen bezeichnen gleiche Bezugszeichen identische oder in der Funktion ähnliche Elemente.
-
KURZBESCHREIBUNG DER MEHREREN ZEICHNUNGSANSICHTEN
-
1 veranschaulicht ein Verfahren für spekulatives Hardwareausführen in einer Ausführungsform der vorliegenden Offenbarung.
-
2 zeigt ein Blockschaubild, das ein System für feingranulares spekulatives Hardwareausführen für ein Prüfen der Programmkorrektheit in einer Ausführungsform der vorliegenden Offenbarung veranschaulicht.
-
3 veranschaulicht einen Haupt-Thread und einen Helfer-Thread, die parallel ausgeführt werden. Der Haupt-Thread führt einen Codeblock aus, bis ein sicherer Punkt spekulativ erreicht wird.
-
DETAILLIERTE BESCHREIBUNG
-
In einer Ausführungsform wird ein Mechanismus beschrieben, der spekulatives Ausführen verwendet, um die Auswirkungen der Korrektheitsprüfungen auf die Leistung zu verringern. Der Mechanismus der vorliegenden Offenbarung kann in einer Ausführungsform die Auswirkungen des Aufwands durch Prüfen auf Speicherfehler verringern, indem Hardware-Spekulation über einen Cachespeicher mit mehreren Werten eingesetzt wird. In einer Ausführungsform der vorliegenden Offenbarung kann der „Haupt”-Thread (der Code der Anwendung ohne Korrektheitsprüfungen) spekulativ ausgeführt werden, während andere „Helfer”-Threads die zugehörigen Korrektheitsprüfungen parallel bei feiner Granularität durchführen, wenn der Bedarf entsteht. Der Haupt-Thread hört auf, spekulativ zu sein, falls und/oder zu dem Zeitpunkt, an dem die Helfer-Threads zustimmen; andernfalls (fehlgeschlagene Korrektheitsprüfung) wird der derzeitige Block spekulativen Ausführens des Haupt-Thread abgebrochen, wodurch das System in einem ordnungsgemäßen Zustand verbleibt und sichergestellt wird, dass das (spekulative) fehlerhafte Ausführen keine unberechtigten Nebeneffekte aufweist. Darüber hinaus können die Helfer-Threads dem Benutzer den Fehler berichten.
-
Spekulatives Ausführen oder spekulative Operation oder spekulativer Task bezieht sich auf ein Ausführen, bei dem ein Prozess oder Thread Programmanweisungen ausführt, ohne den Zustand des Programms an den permanenten Speicher zu übergeben.
-
Unterstützung von Speicherspekulation oder spekulativem Ausführen kann durch Hardwarearchitektur bereitgestellt werden, die einen Computerchip (Chip mit integrierter Schaltung) mit einer Vielzahl von Prozessorkernen enthält, von denen jeder eine Vielzahl von Hardware-Threads aufweist. Weitere Elemente können auf dem Chip bereitgestellt werden. Die Unterstützung für spekulatives Mehrfach-Threading ermöglicht ein Zuweisen unterschiedlicher spekulativer Tasks zu jedem der Hardware-Threads. Der Begriff „Thread” kann sich entweder auf die Hardware (normalerweise als Hardware-Threading oder symmetrisches Mehrfach-Threading (symmetric multithreading SMT) bezeichnet) einschließlich der Ausführungseinheiten, des Registerzustands usw. beziehen, die einem Satz von Hardware zugehörig sind, der zum Ausführen einer Reihe von Anweisungen in der Lage ist, oder es bezieht sich auf das Softwarekonstrukt, das auf der Hardware ausgeführt wird. Ein Thread ist daher als Entität in der Lage, einen Anweisungsstrom auszuführen. Mehrere Software-Threads können auf einem einzigen Hardware-Thread gemultiplext werden. In Bezug auf Threads bezieht sich der Begriff älter/jünger oder früher/später auf deren relative Programmreihenfolge (und nicht auf die Zeit, die sie tatsächlich auf der Hardware ausgeführt werden).
-
Bei spekulativem Ausführen werden aufeinander folgende Abschnitte von sequenziellem Code oder aufeinander folgende Iterationen in einer Schleife Hardware-Threads zugewiesen, um gleichzeitig ausgeführt zu werden. Jeder Thread hat die Illusion, seine Tasks in Programmreihenfolge auszuführen. Er sieht seine eigenen Schreibvorgänge und Schreibvorgänge, die früher im Programm auftraten. Wenn die Hardware (wegen unterschiedlicher spekulativer Threads, die denselben Speicher berühren) erkennt, dass das Programm Speicherreferenzen ausführt, die die Fähigkeit verletzen, es so aussehen zu lassen, dass die ursprüngliche Programmreihenfolge eingetreten ist, wird die Hardware diesen und nachfolgende spekulative Threads abbrechen und den Code sequenziell ausführen.
-
Um diesen Task abzuschließen, bietet der L2 die Fähigkeit, mehrere Werte unter jeder beliebigen gegebenen Speicheradresse zu speichern. Somit kann der L2 mehrere unterschiedliche Datenwerte für eine einzige Adresse aufweisen. Jede belegt einen L2-Pfad, und das L2-Verzeichnis speichert zusätzlich zu den üblichen Verzeichnisinformationen einen Verlauf darüber, welche Threads die Zeile gelesen oder geschrieben haben. Ein spekulativer Schreibvorgang darf nicht in den Hauptspeicher ausgeschrieben werden.
-
In einer Ausführungsform kann eine Situation auftreten, welche die Programmreihenfolge aufbricht, wenn ein in der Programmreihenfolge früherer Thread auf eine Adresse schreibt, die ein in der Programmreihenfolge späterer Thread bereits gelesen hat. Der spätere Thread sollte diese Daten gelesen haben, hat dies aber nicht getan. Eine Lösung besteht darin, den Thread abzubrechen sowie alle Zeilen, die er in den L2 geschrieben hat, für ungültig zu erklären und dies für alle jüngeren Threads zu wiederholen. Wenn auf der anderen Seite keine solche Wechselwirkung auftritt, kann ein Thread erfolgreich abgeschlossen werden, und seine Schreibvorgänge können auf einen externen Hauptspeicher verschoben werden, wenn ein geleertes Übergeben auftritt, das die Spekulation beendet.
-
Nicht alle Threads müssen spekulativ sein. Der in der Programmreihenfolge früheste ausgeführte Thread kann als nicht-spekulativ ausgeführt werden und läuft herkömmlich; insbesondere können seine Schreibvorgänge direkt an den externen Hauptspeicher gehen. Die in der Programmreihenfolge späteren Lesevorgänge sind spekulativ und stehen unter dem Vorbehalt, abgebrochen zu werden. Wenn der nicht-spekulative Thread abgeschlossen wird, kann der nächstälteste Thread-Zustand übergeben werden, und er beginnt dann, nicht-spekulativ ausgeführt zu werden.
-
Der folgende Algorithmus kann eine effiziente Helfer-Thread-Überprüfungsverwendung des vorstehend beschriebenen spekulativen Ausführens in einer Ausführungsform der Offenbarung realisieren.
- 1. Der Benutzer fügt im Code des Benutzers eine Anweisung für Regionen hinzu, die ein Benutzer mit dieser Technik überprüfen möchte.
- 1a. Die Anweisungen können immer im Code verbleiben und über Compilermarkierungen und/oder Umgebungsvariablen aktiviert/deaktiviert werden.
- 2. Wenn die Compilermarkierung/Umgebungsvariable den Wunsch des Benutzers nach einem Ausführen mit Korrektheitsüberprüfung anzeigt, werden die folgenden Schritte 3 bis 6 unternommen, andernfalls wird das Programm ohne jeglichen zusätzlichen ausgeführten Code (oder Störung des Verhaltens) normal ausgeführt.
- 3. Die Laufzeitumgebung veranlasst den Haupt-Thread, in das spekulative Ausführen einzutreten.
- 4. Die Laufzeitumgebung startet Helfer-Threads, um einen durch den Benutzer festlegbaren Satz von Prüfungen durchzuführen.
- 4a. Im Falle, dass einer der Helfer-Threads ein Problem erkennt, wird der Haupt-Thread angehalten, die Laufzeit fragt den Zustand der Helfer-Threads ab, um Debuginformationen zu erhalten, und optional wird die Kontrolle dem Benutzer zurückgegeben, um eine sorgfältigere Untersuchung des erkannten Fehlers vorzunehmen, oder optional fährt das Programm mit einem vom erkannten Prüffehler angefertigten Protokoll fort.
- 5. An stabilen Punkten (die dadurch festgelegt werden, dass sich alle Prüfungen als erfolgreich herausgestellt haben und keine ausstehenden Operationen vorhanden sind) übergibt die Laufzeitumgebung (sie verlässt das spekulative Ausführen) die Aktualisierungen des Haupt-Thread und Verfolgungsinformationen und tritt dann für den Haupt-Thread erneut in die Spekulation ein. Der Haupt-Thread verlässt die Spekulation und tritt wieder in sie ein, weil die Menge an Zustandsinformationen für ein spekulatives Ausführen schließlich überlaufen und einen spekulativen Fehler verursachen kann.
- 6. Der Haupt-Thread fährt in diesem Modus fort, bis er auf eine Benutzeranweisung stößt, die das Ende der zu prüfenden Coderegion angibt oder das Programm normal endet.
-
1 veranschaulicht ein Verfahren zum Prüfen auf potenzielle Fehlerbedingungen durch Verwenden eines spekulativen Hardware-Ausführens in einer Ausführungsform der vorliegenden Offenbarung. In einer Ausführungsform kann das Verfahren mittels eines Chips mit integrierter Schaltung mit mehreren Hardwareausführungskontexten und einer Speicherhierarchie realisiert werden. Ein Hardwareausführungskontext bezieht sich auf die Fähigkeit eines Prozessors, einen Ausführungs-Thread zu steuern. Mehrere Hardwareausführungskontexte können ausgebildet werden, indem mehrere Kerne auf einem Chip vorhanden sind. Ein Kern kann eine logische Ausführungseinheit mit L1-Cachespeicher und Funktionseinheiten enthalten und besitzt die Fähigkeit, Threads unabhängig auszuführen. Eine Speicherhierarchie kann auf die folgende Weise organisiert sein: lokal zu jedem Kern angeordneter L1-Cachespeicher, unter einer Gruppe von Kernen gemeinsam genutzter L2-Cachespeicher, Hauptspeicher und Festplattendatenspeicher, die hier in der Hierarchiereihenfolge von niedrig zu hoch aufgeführt sind. Das Verfahren beinhaltet in einer Ausführungsform ein Ausführen einer Vielzahl von Threads jeweils in der Vielzahl von Hardwarekontexten, nutzt die Speicherhierarchie, um mindestens einen der Threads spekulativ zu machen und prüft dynamisch ein korrektes Ausführen eines Programms. Das Verfahren der vorliegenden Offenbarung kann in einer Ausführungsform als eine zum Beispiel durch einen Programmierer in einen Programmcode eingefügte Anweisung initiiert oder gestartet werden. Eine Compilerlaufzeitumgebung oder ähnliches erkennt die Anweisung und aktiviert die Verfahrensweise der vorliegenden Offenbarung, die während der Programmausführung stattfindet. Zum Beispiel kann Software wie beispielsweise der Compiler (oder ähnliches) eine Markierung setzen, welche die Laufzeitumgebung des Programms erkennen kann, und die Verfahrensweise der vorliegenden Offenbarung initiieren.
-
Unter Bezugnahme auf 1 kann ein Benutzer einem Programmcode eine Anweisung für die Regionen hinzufügen, die der Benutzer bei 102 überprüfen möchte. Die Anweisung kann immer im Code verbleiben und über eine Compilermarkierung und/oder Umgebungsvariablen aktiviert oder deaktiviert werden. Wenn bei 104 die Compilermarkierung oder die Umgebungsvariable angibt, dass die Überprüfungsverfahrensweise aktiviert werden soll, veranlasst die Laufzeitumgebung bei 106 den Haupt-Thread, der den Programmcode ausführt, in das spekulative Ausführen einzutreten. In diesem Ausführungsmodus (spekulatives Ausführen) werden die Daten des Programms nicht in den Hauptspeicher ausgeschrieben. Wenn andernfalls die Compilermarkierung oder die Umgebungsvariable bei 104 angibt, dass die Überprüfungsverfahrensweise deaktiviert werden soll, kann das Programm bei 108 den herkömmlichen Ausführungspfad einschlagen.
-
Bei 110 generiert die Laufzeitumgebung einen oder mehrere Hardware-Helfer-Threads, um einen durch den Benutzer ausgewählten Satz von Prüfungen durchzuführen. Die Anzahl generierter Helfer-Threads kann von der Größe oder Charakteristik der Regionen des Programms abhängen, die für die Prüfung festgelegt sind. Bei 112 wird jeder Helfer-Thread in seinem eigenen Kontext auf einem Hardwareprozessorkern ausgeführt und läuft parallel zum Hauptprogramm-Thread. Jeder Helfer-Thread geht den Code durch (die Region, die ihm zur Prüfung zugewiesen wurde) und prüft ihn auf jegliche Fehlerbedingungen im Code. Auf diese Weise wird der Haupt-Thread durch die zusätzlichen Tasks des Prüfens auf Fehler nicht verlangsamt.
-
Wenn bei 114 ein Helfer-Thread eine Fehlerbedingung erkennt, kann der Helfer-Thread den Fehler der Laufzeit mitteilen, die wiederum das Ausführen des Haupt-Thread anhalten kann. Debuginformationen können gesammelt und protokolliert (gespeichert) werden, und die Kontrolle kann dem Benutzer zurückgegeben werden, um den erkannten Fehler zu analysieren, z. B. wie bei 118 und 120 gezeigt. Wenn das Ausführen des Haupt-Thread angehalten ist, kann die Laufzeitumgebung automatisch einen Debugger an den Haupt-Thread anhängen und die Kontrolle an den Benutzer übergeben. In einem weiteren Aspekt kann der Helfer-Thread den erkannten Fehler protokollieren, dem Haupt-Thread jedoch gestatten, mit seiner Verarbeitung fortzufahren. Dies kann der Fall sein, wenn der erkannte potenzielle Fehler für das Ausführen des Haupt-Thread nicht ernst oder kritisch ist. Diese Feststellung kann durch einen durch den Benutzer festlegbaren Satz von Einstellungen erfolgen und wird davon beeinflusst, wie ernst der erkannte Fehler ist. Für Fehler, die ernst genug sind, um nicht wiederherstellbar zu sein, oder für die der Benutzer keinen Ausnahmeabwickler bereitgestellt hat, kann das Hauptprogramm im Falle, dass die Benutzereinstellungen angeben, den Fehler zu protokollieren und fortzufahren, zum Beispiel abstürzen und anormal beendet werden, wenn das Hauptprogramm die Ausführung wieder aufnimmt.
-
Bei 116 haben alle Helfer-Threads einen sicheren Punkt erreicht, den der Haupt-Thread ohne Fehler erreichen kann, und die Helfer-Threads teilen diese Information der Laufzeitumgebung mit. Die Laufzeitumgebung prüft das Erreichen des sicheren Punktes durch den Haupt-Thread. Sobald der Haupt-Thread den sicheren Punkt erreicht, nimmt die Laufzeitumgebung den Haupt-Thread aus seinem spekulativen Ausführungsmodus. Der Zustand des Haupt-Thread (z. B. durch den Haupt-Thread während der spekulativen Ausführung bis zu diesem sicheren Punkt durchgeführte Berechnungen und Speicherschreibvorgänge) wird an den Hauptspeicher übergeben.
-
Sobald der Zustand des Haupt-Thread übergeben wurde, führt die Laufzeitumgebung den Haupt-Thread wie in 106 erneut im spekulativen Ausführungsmodus aus (in dem der Zustand des Haupt-Thread nicht an den Hauptspeicher übergeben wird). Die Laufzeitumgebung führt auch wie in 108 einen oder mehrere Helfer-Threads parallel mit dem Haupt-Thread aus. Da der Haupt-Thread spekulativ ausgeführt wird, führen die Helfer-Threads Code aus und prüfen im selben Codeblock, den der Haupt-Thread ausführt. Diese Helfer-Threads können auf einen durch einen Benutzer auswählbaren Satz von Bedingungen hin prüfen, wie beispielsweise Teilen durch Null, außerhalb eines Arrays liegende gültige Bereiche, Nullzeiger-Dereferenzierung, Speicherlecks, Referenzierung von nicht definierten Speichern oder jede beliebige der zusätzlichen Prüfungen (zum Beispiel die in den bestehenden Werkzeugen bereitgestellten).
-
Die Verarbeitung wird mit 112 fortgesetzt, wo der Haupt-Thread spekulativ ausgeführt wird und die Helfer-Threads parallel mit dem Haupt-Thread ausgeführt werden und ein Prüfen auf Fehler vornehmen. Die Schritte 106 bis 116 können fortgesetzt werden, bis der Haupt-Thread auf eine Benutzeranweisung trifft, die das Ende der zu prüfenden Coderegion anzeigt, oder bis das Programm beendet wird, z. B. wie bei 122 gezeigt.
-
Bei sicheren Punkten oder einem stabilen Punkt, an denen der Haupt-Thread seinen spekulativen Ausführungsmodus beenden kann, kann es sich um Punkte im Code (Programm) handeln, die Nachrichtenanweisungen oder Eingabe/Ausgabe-Operationen durchführen. Das Ende der Prüfregion oder des Programms kann ebenso als sicherer Punkt angesehen werden. Ein Ende eines Grundblocks der Programmausführung kann ebenso als ein sicherer Punkt festgelegt werden. Die Punkte im Programm, an denen es Aktionen durchführt, die Konsequenzen außerhalb des Knotens (Chips) haben, wie beispielsweise das Senden einer Nachricht, das Durchführen von E/A oder das Überlaufen der Cacheebene, in welcher der spekulative Zustand gespeichert ist, werden in einer Ausführungsform der vorliegenden Offenbarung auch als sichere Punkte ausgewählt. Bei den ersten beiden handelt es sich um klar definierte Punkte im Programm, der letztere kann unbekannt sein. In einer Ausführungsform der vorliegenden Offenbarung kann die Hardware jedoch ein Signal bereitstellen, wenn sie einen Eintrag vom Überlaufen des L2-Cachespeichers entfernt ist, so dass die Laufzeit einen sicheren Punkt an dem Ort in die Programmausführung hineinzwängen kann.
-
Weitere sichere Punkte können bestimmt werden. Häufigere sichere Punkte sorgen für weniger Versatz zwischen dem Haupt-Thread und den Helfer-Threads und machen es unwahrscheinlicher, dass ein externes Ereignis eine Beendigung des Prüfens verursacht. Es kann jedoch zusätzlich zum Synchronisieren der Helfer-Threads ein mit dem Verlassen der Spekulation und dem Wiedereintreten in diese verbundener Aufwand vorhanden sein.
-
In einem weiteren Aspekt kann ein Bericht der durch die Helfer-Threads erkannten Fehler erzeugt werden.
-
2 zeigt ein Blockschaubild, das ein System für feingranulares spekulatives Hardwareausführen für ein Prüfen der Programmkorrektheit in einer Ausführungsform der vorliegenden Offenbarung veranschaulicht. Ein Chip mit integrierter Schaltung 200 kann eine Vielzahl von Kernen enthalten (die auch als Verarbeitungskerne bezeichnet werden). Ein Kern 202 kann eine Funktionseinheit und Cachespeicher 204, zum Beispiel einen lokal zu diesem Kern 202 angeordneten L1-Cachespeicher, enthalten. Jeder Kern ist in der Lage, eine Vielzahl von Hardware-Threads auszuführen. Zum Beispiel ist der Kern 202 in der Lage, einen Hardware-Thread 218 auszuführen. Gleichermaßen kann ein Kern 206 eine Funktionseinheit und Cachespeicher 208, zum Beispiel einen lokal zu diesem Kern 206 angeordneten L1-Cachespeicher, enthalten. Der Kern 206 ist in der Lage, einen Hardware-Thread 220 auszuführen. Desgleichen kann ein Kern 210 eine Funktionseinheit und Cachespeicher 212, zum Beispiel einen lokal zu diesem Kern 210 angeordneten L1-Cachespeicher, enthalten. Der Kern 206 ist in der Lage, eine Vielzahl von Hardware-Threads 212 auszuführen. Der Chip 200 kann zudem einen lokal zum Chip 200 angeordneten Speicher 214, zum Beispiel einen L2-Cachespeicher, enthalten, der unter der Vielzahl von Kernen auf dem Chip gemeinsam genutzt werden kann. Der Chip ist mit einem Hauptspeicher 216 verbunden, bei dem es sich zum Beispiel um einen synchronen dynamischen Speicher mit wahlfreiem Zugriff (synchronous dynamic random access memory (SDRAM)) handeln kann. Der Chip 200 kann Teil eines Computersystems sein, das eine Vielzahl derselben oder unterschiedlicher integrierter Schaltungen enthält, die über eine Netzwerkverbindung verbunden sind.
-
Ein Haupt-Thread eines Programms, das überprüft wird, kann als ein einziger Hardware-Thread, z. B. 218 auf Kern 202, ausgeführt werden. Helfer-Threads können erzeugt und auf demselben oder einem anderen Kern ausgeführt werden. Zum Beispiel kann ein Helfer-Thread 220 auf dem Kern 202 oder 208 ausgeführt werden; ein weiterer Helfer-Thread 222 kann auf dem Kern 210 ausgeführt werden. Der Haupt-Thread 218 wird durch die Programmanweisungen in einem spekulativen Ausführungsmodus ausgeführt. Das bedeutet, die während dieses Ausführungsmodus durchgeführten Datenschreibvorgänge werden nicht an den Speicher übergeben. Gleichzeitig oder parallel werden ein oder mehrere Helfer-Threads 220, 222 durch Teile der Programmanweisungen ausgeführt und prüfen auf Fehlerbedingungen im Code. Wenn ein Helfer-Thread (z. B. 220 und/oder 222) einen Fehler im Code erkennt, protokolliert der Helfer-Thread die Fehlerbedingung und sendet eine Benachrichtigung des Fehlers an die Laufzeit, die wiederum das Ausführen des Haupt-Thread abhängig vom Typ des erkannten Fehlern anhalten kann.
-
Sobald die Helfer-Threads (220, 222) an einen sicheren Punkt oder einen stabilen Punkt im Programm (Code) gelangen, ohne einen Fehler zu erkennen, werden sie entweder beendet oder warten, bis der Haupt-Thread denselben sicheren Punkt erreicht. Nachdem der Haupt-Thread den sicheren Punkt erreicht, wird der Haupt-Thread aus dem spekulativen Ausführungsmodus herausgenommen, und der Zustand des Haupt-Thread wird dem Hauptspeicher 216 vom lokalen Speicher 214 übergeben. Sobald der Zustand dem Hauptspeicher 216 übergeben wurde, wird der Haupt-Thread erneut in einen spekulativen Ausführungsmodus versetzt, wobei der Zustand des Haupt-Thread nicht in den Hauptspeicher 216 ausgeschrieben, sondern nur im lokalen Speicher 214 und bis die Helfer-Threads den nächsten sicheren Punkt erreichen gespeichert wird. Dieser Prozess wird bis zum Ende des Codes oder bis zum Erreichen des Endes der Prüfregion beim Ausführen des Programms fortgesetzt.
-
Die Leistungsnachteile des Wechselns in die Spekulation und aus ihr heraus sind relativ klein. Dies ermöglicht eine rasche und häufige Synchronisierung zwischen den Helfer-Threads und dem Haupt-Thread. Einige der Helfer-Threads können sogar auf demselben Kern, jedoch anderen Hardware-Threads als der Haupt-Thread, ausgeführt werden. Mit diesen Mechanismen werden aufgrund der einfachen Erzeugung und Wiederintegration eines Helfer-Thread in den Haupt-Thread neue Fähigkeiten ermöglicht. Helfer-Threads können bei entstehendem Bedarf dynamisch erzeugt werden, anstatt im Voraus und mit seltener Interaktion geplant zu werden. Zusätzlich zum Standardtyp von Prüfungen ermöglicht dies das Instanziieren von flinkeren und reaktionsfreudigeren Prüfungen.
-
3 veranschaulicht einen Haupt-Thread und einen Helfer-Thread, die parallel ausgeführt werden. Der Haupt-Thread führt einen Codeblock aus, bis ein sicherer Punkt spekulativ erreicht wird. Der Helfer-Thread prüft auf Fehlerbedingungen und ermittelt einen sicheren Punkt, an dem der Haupt-Thread aus dem spekulativen Ausführungsmodus herausgenommen wird. Der Zustand des Haupt-Thread während des spekulativen Ausführens wird an den Hauptspeicher übergeben. Dann wird durch den Haupt-Thread der nächste Codeblock erneut im spekulativen Ausführungsmodus ausgeführt, während der Helfer-Thread diesen Codeblock auf Fehlerbedingungen prüft. Am nächsten sicheren Punkt wird der Haupt-Thread aus dem spekulativen Ausführungsmodus herausgenommen, und seine Zustände werden dem Hauptspeicher übergeben. Der Prozess wird bis zum Ende des Codes oder dem Ende der Prüfregion im Code fortgesetzt.
-
Wie für den Fachmann ersichtlich ist, können Aspekte der vorliegenden Erfindung als ein System, Verfahren, oder Computerprogrammprodukt ausgebildet werden. Dementsprechend können Aspekte der vorliegenden Erfindung in Form einer vollständigen Hardwareausführungsform, einer vollständigen Softwareausführungsform (darunter Firmware, residente Software, Mikrocode usw.) oder in einer Ausführungsform ausgebildet werden, die Software- und Hardwareaspekte kombiniert, was hierin sämtlich allgemein als „Schaltung”, „Modul” oder „System” bezeichnet sein kann. Weiterhin können Aspekte der vorliegenden Erfindung in Form eines Computerprogrammprodukts ausgebildet werden, das in einem oder mehreren computerlesbaren Medien mit darauf enthaltenem computerlesbarem Programmcode enthalten sein kann.
-
Jede beliebige Kombination aus einem oder mehreren computerlesbaren Medien kann verwendet werden. Bei dem computerlesbaren Medium kann es sich um ein computerlesbares Signalmedium oder ein computerlesbares Speichermedium handeln. Bei einem computerlesbaren Speichermedium kann es sich zum Beispiel, ohne auf diese beschränkt zu sein, um ein System, eine Vorrichtung oder eine Einheit elektronischer, magnetischer, optischer, elektromagnetischer, Infrarot oder Halbleiter verwendender Art sowie jede beliebige geeignete Kombination des Vorgenannten handeln. Zu spezielleren Beispielen für das computerlesbare Speichermedium kann Folgendes gehören (nicht abschließende Liste): eine elektrische Verbindung mit einer oder mehreren Leitungen, eine transportable Computerdiskette, eine Festplatte, ein Speicher mit wahlfreiem Zugriff (RAM), ein Nur-Lese-Speicher (ROM), ein löschbarer programmierbarer Nur-Lese-Speicher (EPROM oder Flash-Speicher), ein Lichtwellenleiter, ein transportabler Compact-Disk-Nur-Lese-Speicher (CD-ROM), eine optische Speichereinheit, eine magnetische Speichereinheit oder eine beliebige geeignete Kombination des Vorgenannten. Im Kontext dieses Dokuments kann es sich bei einem computerlesbaren Speichermedium um jedes gegenständliche Medium handeln, das ein Programm zur Verwendung durch oder in Verbindung mit einem System, einer Vorrichtung oder einer Einheit zur Ausführung von Anweisungen beinhalten oder speichern kann.
-
Zu einem computerlesbaren Signalmedium kann ein verbreitetes Datensignal mit darin zum Beispiel in einem Basisband oder als Teil einer Trägerwelle ausgebildetem computerlesbarem Programmcode zählen. Solch ein verbreitetes Signal kann in jeder beliebigen einer Vielfalt von Formen ausgebildet werden, darunter, ohne auf diese beschränkt zu sein, elektromagnetische, optische oder jede geeignete Kombination davon. Bei einem computerlesbaren Signalmedium kann es sich um jedes computerlesbare Medium handeln, das kein computerlesbares Speichermedium ist und das ein Programm zur Verwendung durch oder in Verbindung mit einem System, einer Vorrichtung oder einer Einheit zur Ausführung von Anweisungen übertragen, verbreiten oder transportieren kann.
-
Der in einem computerlesbaren Medium enthaltene Programmcode kann mittels eines beliebigen geeigneten Mediums übertragen werden, einschließlich, ohne auf diese beschränkt zu sein, kabellose, kabelgebundene, Lichtwellenleiterkabel, Hochfrequenz (HF) usw. oder eine beliebige geeignete Kombination des Vorgenannten.
-
Computerprogrammcode zum Ausführen von Operationen für Aspekte der vorliegenden Erfindung kann in jeder Kombination einer oder mehrerer Programmiersprachen, darunter eine objektorientierte Programmiersprache wie Java, Smalltalk, C++ oder Ähnliches und herkömmliche verfahrensorientierte Programmiersprachen wie die Programmiersprache „C” oder ähnliche Programmiersprachen, eine Skriptsprache wie Perl, VBS oder ähnliche Sprachen und/oder funktionale Sprachen wie Lisp und ML und logikorientierte Sprachen wie Prolog, geschrieben sein. Der Programmcode kann vollständig auf dem Computer des Benutzers, teilweise auf dem Computer des Benutzers, als eigenständiges Softwarepaket, teilweise auf dem Computer des Benutzers und teilweise auf einem entfernt angeordneten Computer oder vollständig auf dem entfernt angeordneten Computer oder Server ausgeführt werden. In letzterem Szenario kann der entfernt angeordnete Computer mit dem Computer des Benutzers über jede beliebige Art von Netzwerk, darunter ein lokales Netzwerk (local area network (LAN)) oder ein Weitverkehrsnetzwerk (wide area network (WAN)) verbunden sein, oder es kann eine Verbindung zu einem externen Computer (zum Beispiel mittels eines Internetdienstanbieters über das Internet) hergestellt werden.
-
Aspekte der vorliegenden Erfindung werden unter Bezugnahme auf Abbildungen von Ablaufplänen und/oder Blockschaubildern von Verfahren, Vorrichtungen (Systemen) und Computerprogrammprodukten gemäß Ausführungsformen der Erfindung beschrieben. Es versteht sich, dass jeder Block der Abbildungen von Ablaufplänen und/oder der Blockschaubilder sowie Kombinationen von Blöcken in den Abbildungen von Ablaufplänen und/oder den Blockschaubildern durch Computerprogrammanweisungen realisiert werden kann. Diese Computerprogrammanweisungen können einem Prozessor eines universellen Computers, eines zweckbestimmten Computers oder einer anderen programmierbaren Datenverarbeitungsvorrichtung bereitgestellt werden, um eine Maschine so zu erzeugen, dass die Anweisungen, die über den Prozessor des Computers oder der anderen programmierbaren Datenverarbeitungsvorrichtung ausgeführt werden, ein Mittel zum Realisieren der im Block oder in den Blöcken des Ablaufplans und/oder Blockschaubildes angegebenen Funktionen/Handlungen erzeugen.
-
Diese Computerprogrammanweisungen können auch in einem computerlesbaren Medium gespeichert sein, das einen Computer, eine andere programmierbare Datenverarbeitungsvorrichtung oder andere Einheiten anleiten kann, auf eine bestimmte Weise zu funktionieren, so dass die in dem computerlesbaren Medium gespeicherten Anweisungen einen Herstellungsartikel einschließlich Anweisungen erzeugen, welche die im Block oder in den Blöcken des Ablaufplans und/oder des Blockschaubildes angegebene Funktion/Handlung ausführen.
-
Die Computerprogrammanweisungen können auch auf einen Computer, eine andere programmierbare Datenverarbeitungsvorrichtung oder andere Einheiten geladen werden, um eine Reihe von auf dem Computer, der anderen programmierbaren Vorrichtung oder den anderen Einheiten auszuführenden Operationsschritten hervorzurufen, um einen auf dem Computer realisierten Prozess so zu erzeugen, dass die auf dem Computer oder der anderen programmierbaren Vorrichtung ausgeführten Anweisungen Prozesse zum Realisieren der im Block oder in den Blöcken des Ablaufplans und/oder Blockschaubildes angegebenen Funktionen/Handlungen bereitstellen.
-
Der Ablaufplan und die Blockschaubilder in den Figuren veranschaulichen die Architektur, Funktionalität und die Arbeitsweise möglicher Realisierungen von Systemen, Verfahren und Computerprogrammprodukten gemäß verschiedener Ausführungsformen der vorliegenden Erfindung. In dieser Hinsicht kann jeder Block im Ablaufplan oder den Blockschaubildern für ein Modul, ein Segment oder einen Codeabschnitt stehen, der eine oder mehrere ausführbare Anweisungen zum Realisieren der angegebenen logischen Funktion(en) aufweist. Es soll zudem angemerkt werden, dass bei einigen alternativen Realisierungen die im Block angegebenen Funktionen in anderer Reihenfolge als der in den Figuren angegebenen auftreten können. Zum Beispiel können zwei aufeinander folgend abgebildete Blöcke tatsächlich im Wesentlichen gleichzeitig ausgeführt werden, oder die Blöcke können manchmal abhängig von der betreffenden Funktionalität in umgekehrter Reihenfolge ausgeführt werden. Es wird ebenfalls angemerkt, dass jeder Block der Blockschaubilder und/oder Abbildung von Ablaufplänen und Kombinationen von Blöcken in den Blockschaubildern und/oder der Abbildung von Ablaufplänen durch zweckbestimmte hardwaregestützte Systeme oder Kombinationen von zweckbestimmter Hardware und Computeranweisungen realisiert werden kann, welche die angegebenen Funktionen oder Handlungen durchführen.
-
Die Systeme und Verfahrensweisen der vorliegenden Offenbarung können auf einem Computersystem ausgeführt werden, das eine Verarbeitungseinheit beinhaltet, die einen oder mehrere Prozessoren und/oder Kerne, Arbeitsspeicher und andere (in der Zeichnung nicht ausdrücklich gezeigte) Systemkomponenten beherbergt, die ein Computerverarbeitungssystem oder einen Computer realisieren, der ein Computerprogrammprodukt ausführen kann. Das Computerprogrammprodukt kann Medien, zum Beispiel eine Festplatte, ein kompaktes Speichermedium wie eine Compact Disk oder andere Speichereinheiten, umfassen, die durch die Verarbeitungseinheit durch jede beliebige dem befähigten Handwerker bekannte oder in Zukunft bekannte Technik gelesen werden kann, um dem Verarbeitungssystem das Computerprogrammprodukt für die Ausführung bereitzustellen.
-
Das Computerprogrammprodukt kann all die entsprechenden Merkmale umfassen, welche die Realisierung der hierin beschriebenen Verfahrensweisen ermöglichen und die – bei Laden in ein Computersystem – in der Lage sind, die Verfahren auszuführen. „Computerprogramm”, „Softwareprogramm”, „Programm” oder „Software” bedeuten im vorliegenden Kontext jeglichen Ausdruck eines Satzes von Anweisungen in jeder beliebigen Sprache, jedem beliebigen Code oder jeder beliebigen Notation, dessen Absicht es ist, ein System mit der Fähigkeit zur Datenverarbeitung dazu zu veranlassen, eine bestimmte Funktion entweder direkt oder nach einem oder beiden der folgenden Elemente durchzuführen: (a) Konvertierung in eine andere Sprache, einen anderen Code oder eine andere Notation; und/oder (b) Reproduktion in einer anderen materiellen Form.
-
Das Computerverarbeitungssystem, welches das System und das Verfahren der vorliegenden Offenbarung ausführt, kann zudem eine Anzeigeeinheit wie einen Monitor oder Anzeigebildschirm zum Darstellen von Ausgabeanzeigen und Bereitstellen einer Anzeige beinhalten, durch die der Benutzer Daten eingeben und mit dem Verarbeitungssystem zum Beispiel in Zusammenarbeit mit Eingabeeinheiten wie der Tastatur- und Mauseinheit oder einer Zeigeeinheit interagieren kann. Das Computerverarbeitungssystem kann auch direkt oder über Fernverbindungen mit einer oder mehreren Peripherieeinheiten wie beispielsweise einem Drucker, Scanner, Lautsprecher und jeden beliebigen anderen Einheiten verbunden oder gekoppelt sein. Das Computerverarbeitungssystem kann mit einem oder mehreren Verarbeitungssystemen wie beispielsweise einem Server, einem anderen entfernt angeordneten Computerverarbeitungssystem, Netzwerkspeichereinheiten über ein oder mehrere beliebige der folgenden Elemente verbunden oder gekoppelt sein: lokales Ethernet, eine WAN-Verbindung, Internet usw. oder über beliebige andere Netzwerkverfahrensweisen, die unterschiedliche Computersysteme verbinden und ihnen den Datenaustausch miteinander ermöglichen. Die vielfältigen Funktionalitäten und Module der Systeme und Verfahren der vorliegenden Offenbarung können auf verschiedenen Verarbeitungssystemen verteilt oder auf jeder beliebigen Einzelplattform ausgeführt werden, die zu Beispiel auf lokal gespeicherte oder auf dem Netzwerk verteilt gespeicherte Daten zugreifen.
-
Die hierin verwendete Terminologie dient lediglich dem Zwecke des Beschreibens besonderer Ausführungsformen und ist nicht als die Erfindung einschränkend aufzufassen. Die hierin verwendeten Singularformen „ein”, „eine” und „der”, „die”, „das” sowie deren Deklinationen sollen ebenso die Pluralformen einschließen, es sei denn dies ist im Kontext deutlich anderweitig angegeben. Es versteht sich weiterhin, dass die Begriffe „aufweist” und/oder „aufweisend” in diesem Dokument das Vorhandensein von angegebenen Merkmalen, ganzen Zahlen, Schritten, Vorgängen, Elementen und/oder Komponenten angeben, jedoch nicht das Vorhandensein oder Hinzufügen eines oder mehrerer Merkmale, ganzer Zahlen, Schritte, Vorgänge, Elemente, Komponenten und/oder Gruppen davon ausschließen.
-
Die entsprechenden Strukturen, Materialien, Handlungen und Entsprechungen aller Mittel oder Schritte sowie Funktionselemente in den nachfolgenden Ansprüchen, sofern vorhanden, sollen alle Strukturen, Materialien oder Handlungen zum Durchführen der Funktion in Kombination mit anderen beanspruchten Elementen, wie sie im Einzelnen beansprucht sind, einschließen. Die Beschreibung der vorliegenden Erfindung wurde zum Zwecke der Veranschaulichung und Beschreibung vorgelegt, ist jedoch nicht als erschöpfend oder auf die Erfindung in der offenbarten Form beschränkt aufzufassen. Viele Änderungen und Variationen sind für den Fachmann naheliegend, ohne vom Umfang und Geist der Erfindung abzuweichen. Die Ausführungsform wurde gewählt und beschrieben, um die Grundgedanken der Erfindung und die praktische Anwendung am besten zu erklären und anderen Fachleuten ein Verständnis der Erfindung für vielfältige Ausführungsformen mit vielfältigen Änderungen, wie sie für den besonderen betrachteten Gebrauch geeignet sind, zu ermöglichen.
-
Vielfältige Aspekte der vorliegenden Offenbarung können als ein in einem computer- oder maschinenlesbaren oder durch einen Computer- oder eine Maschine verwendbaren Medium enthaltenes Programm, eine solche Software oder solche Computeranweisungen ausgeführt werden, die den Computer oder die Maschine bei Ausführung auf dem Computer, Prozessor und/oder der Maschine dazu veranlassen, die Schritte des Verfahrens durchzuführen. Eine durch eine Maschine lesbare Programmspeichereinheit, die ein durch die Maschine ausführbares Anweisungsprogramm gegenständlich beinhaltet, das dazu dient, vielfältige in der vorliegenden Offenbarung beschriebene Funktionalitäten und Verfahren durchzuführen, wird ebenfalls bereitgestellt.
-
Das System und das Verfahren der vorliegenden Offenbarung können auf einem universellen Computer oder einem zweckbestimmten Computersystem realisiert und ausgeführt werden. Bei dem Computersystem kann es sich um jeden beliebigen Typ bekannter oder in Zukunft bekannter Systeme handeln und es kann typischerweise einen Prozessor, eine Arbeitsspeichereinheit, eine Datenspeichereinheit, Eingabe/Ausgabe-Einheiten, interne Busse und/oder eine Datenübertragungsschnittstelle zum Kommunizieren mit anderen Computersystemen in Verbindung mit Datenübertragungshardware und -software usw. beinhalten.
-
Die in der vorliegenden Anmeldung möglicherweise verwendeten Begriffe „Computersystem” und „Computernetzwerk” können eine Vielzahl von Kombinationen fest eingebauter und/oder transportabler Computerhardware, -software, Peripherieeinheiten und Speichereinheiten beinhalten. Das Computersystem kann eine Vielzahl einzelner Komponenten beinhalten, die über ein Netzwerk oder anderweitig verbunden sind, um zusammenzuarbeiten, oder es kann eine oder mehrere Einzelkomponenten beinhalten. Die Hardware- und Softwarekomponenten des Computersystems der vorliegenden Anmeldung können in fest eingebauten und transportablen Geräten wie einem Arbeitsplatzrechner (desktop), Laptop und/oder Server enthalten sein oder diese enthalten. Bei einem Modul kann es sich um eine Komponente einer Einheit, Software, ein Programm oder System handeln, das „Funktionalität” realisiert, die als Software, Hardware, Firmware, elektronischer Schaltung oder usw. ausgeführt sein kann.
-
Die vorstehend beschriebenen Ausführungsformen stellen veranschaulichende Beispiele dar und sind nicht so anzusehen, dass die vorliegende Erfindung auf diese speziellen Ausführungsformen beschränkt ist. Daher können durch den Fachmann vielfältige Änderungen und Modifikationen vorgenommen werden, ohne vom Geist oder Umfang der Erfindung, wie sie in den angehängten Ansprüchen festgelegt ist, abzuweichen.