Dieser Artikel wurde maschinell übersetzt.

Parallelität

Eingeschränkte Parallelität im ThreadPool von CLR 4.0

Erika Fuentes

Der CLR-ThreadPool in der neuesten Version (CLR 4.0) kann mehrere wichtige Änderungen seit der CLR 2.0 angezeigt werden. Die aktuelle Schicht in Technologie Trends, wie z. B. die weit verbreitete Verwendung von vielkerniges Architekturen und der resultierende Wunsch zu parallelisieren von vorhandene Anwendungen oder neuer parallelen Code geschrieben wurde eine der größten motivierende Faktoren bei der Verbesserung der von der CLR-ThreadPool.

In der Dezember 2008 MSDN Magazine TIEFE Einblicke in CLR Spalte “ Thread Management in the CLR ” ( msdn.microsoft.com/magazine/dd252943 ), beschriebenen ich einige der Motivation und zugeordnete Probleme wie z. B. Parallelität und Rauschen. Nun beschrieben werden haben wie wir lösen diese in der CLR-ThreadPool 4.0, die zugeordnete Implementierung Auswahlmöglichkeiten und wie diese sein Verhalten auswirken können. Außerdem, konzentriere ich mich auf der Ansatz zum Automatisieren der Parallelitätssteuerung in den aktuellen CLR-4.0-ThreadPool (im folgenden als ThreadPool der Einfachheit halber nur bezeichnet). Ich erhalten ebenfalls eine kurze Gliederung der ThreadPool-Architektur. Dieser Artikel behandelt die Implementierung Details Betreff in zukünftigen Versionen ändern. Jedoch können diese Leser entwerfen und neue gleichzeitige Anwendungen schreiben, die alte Anwendungen verbessern, indem dauert Vorteil der Gleichzeitigkeit oder Durchführung Verwendung von ASP.NET oder parallel-Erweiterung-Technologien (alle im Kontext der CLR 4.0) interessiert sind nützliche dieses Materials zu verstehen und nutzen aktuellen ThreadPool-Verhalten.

Übersicht über den ThreadPool

Ein Threadpool sollen wichtige Dienste wie z. B. Threadverwaltung, Abstraktionen für die verschiedenen Typen von Parallelität und Drosselung der gleichzeitige Vorgänge bereitzustellen. Durch die Bereitstellung dieser Dienste, nimmt ein Threadpool einige Belastung Weg vom Benutzer manuell durchführen. Der unerfahrene Benutzer ist es praktisch keine zu erlernen und befassen sich mit den Details einer Multithreading-Umgebung auftreten. Für erfahrenere Benutzer müssen eine zuverlässige threading System bedeutet, die Sie zur Verbesserung der verschiedenen Aspekte der Anwendung konzentrieren kann. Der ThreadPool bietet diese Dienste für verwaltete Anwendungen und Unterstützung für die Portabilität plattformübergreifend, bestimmte Microsoft .NET Framework-Anwendungen z. B. auf Mac-Betriebssystems ausgeführt.

Es gibt verschiedene Arten von Parallelität, die zu den verschiedenen Teilen des Systems miteinander verknüpft werden können. Die wichtigsten sind: CPU-Parallelität, e/a-Parallelität; Zeitgeber und Synchronisierung; und Lastenausgleich und Ressourcennutzung. Wir können umreißen die Architektur der ThreadPool hinsichtlich der die verschiedenen Aspekte der Parallelität (Weitere Details auf den ThreadPool-Architektur und verwandten APIs-Syntax finden Sie unter “ the CLR den Thread Pool ” (msdn.microsoft.com/magazine/cc164139 ). Insbesondere ist erwähnenswert, dass zwei unabhängige Implementierungen der ThreadPool sind: eine befasst sich mit der CPU-Parallelität und wird als ThreadPool-Arbeitsthread, bezeichnet; das andere befasst sich mit e/a-Parallelität und kann E/a-ThreadPool-TortoiseSVN werden. Im nächste Abschnitt konzentriert sich auf die CPU-Parallelität und die zugeordnete Implementierung Arbeit im ThreadPool – insbesondere zu Strategien für die Drosselung der Parallelität.

Der ThreadPool Worker Zum Bereitstellen von Diensten auf der Ebene der CPU Parallelität ausgelegt, nutzt der ThreadPool-Arbeitsthread Multi-Core-Architekturen. Es gibt zwei wichtigste Überlegungen zur CPU-Parallelität: Verteilen der Arbeit schnell und optimal; und den Grad an Parallelität zu drosseln. Für den ersten Verwenden der ThreadPool Implementierung der Strategien, wie z. B. Sperren frei Warteschlangen zur Vermeidung von Konflikten und Arbeit stehlen für Lastenausgleich, Bereiche, die im Rahmen dieser Diskussion, (siehe msdn.microsoft.com/magazine/cc163340 Weitere Informationen über diese Themen). Die letztere – Drosselung des Grades der Parallelität – umfasst Parallelitätssteuerung damit Ressourcenkonflikte aus der Gesamtdurchsatz verlangsamt.

CPU-Parallelität kann insbesondere eine Herausforderung darstellen, da es viele Parameter, z. B. feststellen, wie viele Arbeitsaufgaben zu einem beliebigen Zeitpunkt gleichzeitig ausgeführt werden können. Ein weiteres Problem ist die Anzahl der Kerne und für verschiedene Arten von Arbeitsauslastungen zu optimieren. Zum Beispiel ist, dass einen Thread pro CPU optimal (theoretisch), aber wenn die Arbeitsauslastung ständig blockiert, dann CPU-Zeit ist ungenutzt da mehrere Threads verwendet werden können, um weitere arbeiten auszuführen. Größe und Typ der Arbeitsauslastung ist tatsächlich ein anderer Parameter. Ist z. B. im Fall von blockierenden Arbeitsauslastung es äußerst schwierig, die Anzahl der Threads zu bestimmen, der Gesamtdurchsatz optimiert werden, da es schwer zu bestimmen, ob eine Anforderung abgeschlossen wird (oder vielleicht sogar wie oft es eintreffen – Dies ist eng miteinander im Zusammenhang mit e/a-Blockierung). Die API, die dieser ThreadPool zugeordnet ist QueueUserWorkItem, die eine Methode (die Arbeitsaufgabe) einer Warteschlange für die Ausführung (siehe msdn.microsoft.com/library/system.threading.threadpool.queueuserworkitem-). Es wird für Anwendungen empfohlen, die Arbeit, die potenziell parallel (mit anderem) ausgeführt werden. Die Arbeit wird an den ThreadPool übergeben, die automatisch “ wann es berechnet, ”. Diese Funktion übernimmt aus dem Programmierer die Notwendigkeit, machen Sie sich Sorgen darüber, wie und wann threads erstellen; es ist jedoch nicht die effizienteste Lösung für alle Szenarien.

Die e/a-ThreadPool Dieser Teil der ThreadPool-Implementierung, die im Zusammenhang mit e/A-Parallelität behandelt blockierende Arbeitsauslastungen (d. h., e/a-Anforderungen, die eine relativ lange-Dienst dauern) oder asynchrone e/A. Asynchrone Aufrufe Threads sind nicht gesperrt und können weiterhin andere Arbeit zu tun, während die Anforderung verarbeitet wird. Dieser ThreadPool übernimmt die Koordination zwischen den Anforderungen und den Threads. E/a-ThreadPool – wie den ThreadPool Worker – verwendet einen Algorithmus für die Drosselung der Parallelität; er verwaltet die Anzahl der Threads, die basierend auf der Anzahl der asynchrone Vorgänge abgeschlossen. Dieser Algorithmus ist jedoch ganz anders aus als die im ThreadPool-Arbeitsprozess und es den Rahmen dieses Dokuments ist.

Parallelität im ThreadPool

Umgang mit Parallelität ist es schwierig, jedoch erforderlich, die direkt auf die Gesamtleistung eines Systems auswirkt. Wie das System Parallelität direkt drosselt wirkt sich auf andere Vorgänge, z. B. Synchronisierung, die Ressourcennutzung und Lastenausgleich (und umgekehrt).

Das Konzept der “ Parallelitätssteuerung ” oder mehrere entsprechend “ Drosselung Parallelität, ” bezeichnet die Anzahl der Threads, die zu einem bestimmten Zeitpunkt im ThreadPool funktionieren; es handelt sich um eine Richtlinie zu entscheiden, wie viele Threads gleichzeitig ausgeführt werden können, ohne die Leistung beeinträchtigt. Parallelitätssteuerung in unsere Diskussion ist nur in Bezug auf den ThreadPool-Arbeitsthread. Im Gegensatz zu was intuitiv sein mag, Parallelitätssteuerung ist über Drosselung und reduzieren die Anzahl der Arbeitsaufgaben, die parallel zu den ThreadPool Worker-Durchsatz verbessern ausgeführt werden kann (d. h. steuern den Grad der Parallelität wird verhindert Arbeit ausgeführt wird).

Steuerungsalgorithmus mit der Parallelität im ThreadPool wählt automatisch die Ebene der Parallelität; er entscheidet sich für den Benutzer wie viele Threads erforderlich, um die Leistung in der Regel eine optimale beibehalten werden. Die Implementierung dieses Algorithmus ist eine besonders komplex und interessante Teile der ThreadPool. Es gibt verschiedene Ansätze zur Optimierung der Leistung über dem ThreadPool im Kontext der Grad an Parallelität (mit anderen Worten, bestimmen die “ richtige ” Anzahl an Threads, die gleichzeitig ausgeführt werden). Im nächsten Abschnitt werden einige dieser Methoden besprochen, die in der CLR verwendet oder berücksichtigt wurden.

Die Entwicklung von Parallelitätssteuerung im ThreadPool

Eine der ersten Ansätze entnommen wurde zur Optimierung basierend auf den festgestellten CPU-Auslastung und Hinzufügen Threads zu maximieren, so viel Arbeit wie möglich, damit die CPU überlastet ausgeführt. Verwenden die CPU-Auslastung als eine Metrik empfiehlt sich, beim Umgang mit langen oder Variable Arbeitsauslastungen. Dieser Ansatz nicht jedoch geeignet, da die Kriterien zum Auswerten der Metrik irreführend sein können. Betrachten Sie z. B. eine Anwendung, in denen eine Vielzahl von Speicherauslagerung geschieht. Wäre die beobachtete CPU-Auslastung Low und Hinzufügen von mehr Threads in einer solchen Situation ergibt mehr Arbeitsspeicher verwendet wird, was daher noch weniger CPU-Auslastung zur Folge. Ein weiteres Problem bei diesem Ansatz ist, die in Szenarien, in denen viele Konflikte, die CPU-Zeit wirklich aufgewendet wird die Synchronisierung ausführen, nicht aktuelle Arbeit tun, damit mehr Threads hinzufügen nur die Situation schlimmer machen.

Eine weitere Idee war nur das Betriebssystem den Grad an Parallelität erledigen lassen. In der Tat Dies ist die Funktionsweise der e/a-ThreadPool, aber die ThreadPool-Arbeitsthread hat eine höhere Abstraktion bieten weitere Portabilität und effizientere Ressourcenverwaltung erforderlich. Für einige Szenarios ist dieser Ansatz funktioniert, aber der Programmierer muss noch wissen, wie Drosselung (z. B. wenn Tausende von Threads erstellt werden, Ressourcenkonflikte kann ein Problem darstellen, und Threads hinzugefügt, wird tatsächlich Dinge schlimmer machen) über die Sättigung von Ressourcen zu vermeiden. Darüber hinaus bedeutet dies, dass der Programmierer noch kümmern Parallelität, der den Zweck des Thread-Pool müssen untergräbt.

Ein neuer Ansatz wurde das Konzept der Durchsatz, gemessen als Abschluss von Arbeitsaufgaben pro Einheit der Zeit, als eine Metrik zum Optimieren der Leistungsfähigkeit aufnehmen. Wenn die CPU-Auslastung Low ist, werden in diesem Fall Threads hinzugefügt, sehen Sie, wenn dies den Durchsatz verbessert. Wenn dies der Fall ist, mehr Threads hinzugefügt werden; Threads werden entfernt, wenn Sie es nicht. Dieser Ansatz ist als vorherige vernünftiger, da es wie viel Arbeit abgeschlossen werden ist berücksichtigt, anstatt einfach wie die Ressourcen verwendet werden. Leider Durchsatz von vielen Faktoren ab, nicht nur die Anzahl der aktiven Threads (z. B. Arbeit Objektgröße), beeinträchtigt, kann eine Herausforderung darstellen, zu optimieren.

Steuerelement-Theorie für die Drosselung der Parallelität

Um einige der Einschränkungen des früheren Implementierungen zu vermeiden, wurden neue Ideen mit CLR 4.0 eingeführt. Die erste Methodik angesehen werden, aus dem Bereich der Theorie Steuerelement war der Hostcontroller (Hill beruflich)-Algorithmus. Diese Technik ist eine automatische Optimierung Ansatz basierend auf einer Feedbackschleife ein-/ Ausgabe. System-Ausgabe überwacht und in kleinen Abständen, welche Effekte finden Sie unter kontrollierte Eingabe hatte gemessen wird, und diese Informationen wieder in den Algorithmus, die Eingabe noch weiter zu optimieren eingezogen wird. Betrachten die Eingabe und Ausgabe als Variablen, das System als eine Funktion dieser Variablen verwendet werden. Das Ziel besteht darin, die gemessene Ausgabe zu optimieren.

Die Eingabe ist im Kontext der Worker-ThreadPool-System, die Anzahl der Threads, die Arbeit gleichzeitig ausgeführt werden (oder Grad an Parallelität), und die Ausgabe ist der Durchsatz (siehe Abbildung 1 ).

image: ThreadPool Feedback Loop

Abbildung 1 ThreadPool Feedback Loop

Wir beobachten und messen mit der Zeit die Änderungen in den Durchsatz des hinzufügen oder Entfernen von Threads, dann entscheiden, ob zum Hinzufügen oder Entfernen von mehr Threads, die basierend auf dem beobachteten Durchsatz beeinträchtigen oder die Verbesserung. Abbildung 2 veranschaulicht die Idee.

image: Throughput Modeled as a Function of Concurrency Level

Abbildung 2 Durchsatz als eine Funktion der Grad der Parallelität Modelle

Durchsatz als Funktion (polynomischen) von dem Grad an Parallelität zu müssen, fügt der Algorithmus Threads bis das Maximum der Funktion (ca. 20 in diesem Beispiel) erreicht ist. Zu diesem Zeitpunkt wird eine Abnahme der Durchsatz angezeigt werden und der Algorithmus werden Threads entfernt. Über jedes ZeitintervallEin Beispiel von über ­ platzieren Messungen ausgeführt, und “ gemittelt ”. Dies wird verwendet, um eine Entscheidung für das nächste Zeitintervall. Es ist einfach zu verstehen, dass wenn die Maße lauten, statistische Informationen nicht repräsentativ für die aktuelle Situation ist, außer vielleicht über ein großes Zeitintervall stammt. Es ist schwierig zu erkennen, ob eine Verbesserung der Änderung in Grad an Parallelität oder aufgrund weiterer Faktor z. B. Schwankungen der Arbeitsauslastung wurde.

Adaptive Ansätze in realen Systemen sind kompliziert; in diesem Fall Ihre Verwendung war besonders problematisch wegen der Schwierigkeiten beim Erkennen von kleine Abweichungen oder Extrahieren von Änderungen aus einer sehr lauten Umgebung über einen kurzen Zeitraum. Das erste Problem beobachtet, die bei diesem Ansatz ist, dass modellierten-Funktion (siehe den schwarzen Trend Abbildung 2 ) nicht statische Ziel in realen Situationen (Siehe Blaue Punkte im Diagramm auch) ist messen so kleine Änderungen ist schwierig. Das nächste Problem vielleicht mehr betreffen, ist, dass Rauschen (Variationen in Messungen verursacht, die von der Systemumgebung, z. B. bestimmte OS-Aktivität, Garbagecollection und vieles mehr) macht es schwierig, feststellen, ob es eine Beziehung zwischen der Eingabe und Ausgabe, d. h., um mitzuteilen, wenn nur eine Funktion die Anzahl der Threads für der Durchsatz ist nicht. In der Tat bildet der Durchsatz in den ThreadPool nur einen kleinen Teil die echten beobachtete Ausgabe wird – die meisten davon ist Rauschen. Nehmen Sie z. B. eine Anwendung, deren Arbeitsauslastung viele Threads verwendet. Hinzufügen von ein paar einen Unterschied in der Ausgabe wird nicht machen; eine Verbesserung in einem Zeitintervall beobachtet möglicherweise nicht selbst zurückzuführen, die Änderung der Grad an Parallelität ( Abbildung 3 trägt zur Veranschaulichung dieses Problems).

image: Example of Noise in the ThreadPool, part 1

image: Example of Noise in the ThreadPool, part 2

Abbildung 3 Beispiel von Rauschen im ThreadPool

Abbildung 3 auf der x-Achse ist an der Zeit, auf der y-Achse Durchsatz und Parallelität Ebene Messungen over-imposed sind. Die obere Grafik zeigt, dass in einigen Arbeitsauslastungen, selbst wenn die Anzahl der Threads (Rot) konstant gehalten wird, kann es möglicherweise werden beobachtet Änderungen in den Durchsatz (Blau). In diesem Beispiel sind die Schwankungen Rauschen. Das Diagramm unten ist ein weiteres Beispiel, in dem der allgemeinen Steigerung des Durchsatzes langfristig auch bei Vorhandensein von Rauschen beobachtet. Die Anzahl der Threads wurde jedoch konstant beibehalten, daher ist die Verbesserung der Durchsatz aufgrund von einem anderen Parameter im System.

Ein Verfahren zum Umgang mit den Füllwort werden im nächsten Abschnitt erläutert.

Schalten bei Signal-Verarbeitung

Signal-Verarbeitung wird in vielen Bereichen von engineering um in Signale Füllwort zu verringern; die Idee ist das Eingabe-Signal Muster in den Ausgabe-Signal gefunden. Diese Theorie kann im Zusammenhang mit dem ThreadPool angewendet werden, wenn wir die Eingabe (Grad an Parallelität) und die Ausgabe (Durchsatz) Steuerungsalgorithmus Parallelität Signale behandeln. Wenn wir eine absichtlich geänderte Gleichzeitigkeitsgrad als “ Wave ” bekannten Punkt und Amplituden Eingaben, und suchen Sie nach der ursprünglichen Wave-Muster in der Ausgabe, können wir erkennen, was Störungen aus die tatsächlichen Auswirkungen der Eingaben auf den Durchsatz ist. Abbildung 4 veranschaulicht dieses Konzept.

image: Determining Factors in ThreadPool Output

Abbildung 4 Bestimmen von Faktoren im ThreadPool Ausgabe

In Betracht ziehen Sie, einen Augenblick, das System als schwarzes Rechteck, das eine Eingaben Ausgabe generiert. Abbildung 4 zeigt ein vereinfachtes Beispiel der Hostcontroller-Eingabe und Ausgabe (Grün), darunter ist ein Beispiel für die Eingabe und Ausgabe als Wellen Erscheinungsbildes mithilfe einer Filterung Technik (Schwarz).

Statt eingezogen eine flache, Konstante eingeben, stellen ein Signal und versuchen Sie es dann in der Ausgabe Rauschen zu suchen. Dieser Effekt kann erreicht werden, mithilfe von Verfahren wie die Band übergeben Filter oder Filter entspricht , im Allgemeinen für extrahieren "Wellenlinien" andere "Wellenlinien" oder Suchen in der Ausgabe sehr spezifische Signale verwendet. Dies bedeutet auch, dass durch die Einführung von Änderungen mit der Eingabe, der Algorithmus Entscheidungen an jedem Punkt, basierend auf der letzten kurze Eingabedaten macht.

Der bestimmte Algorithmus in den ThreadPool verwendet eine diskrete Fourier-Transformation eine Methodik, die Informationen wie z. B. die Größe und die Phase des eine Welle. Diese Informationen kann dann verwendet werden, um festzustellen, ob und wie die Eingabe die Ausgabe auswirken. Das Diagramm im Abbildung 5 zeigt ein Beispiel für den ThreadPool-Verhalten mit dieser Methodologie auf einer Arbeitsauslastung, die mehr als 600 Sekunden ausgeführt.

image: Measuring How Input Affects Output

Abbildung 5 messen, wie auf die Input Output

Im Beispiel Abbildung 5 kann das bekannte Muster der Eingabe Reihe (Phase, Häufigkeit und Amplituden) in der Ausgabe verfolgt werden. Das Diagramm veranschaulicht das Verhalten des Algorithmus Parallelität mit Filterung auf eine Beispiel-Arbeitsauslastung. Rote Trend entspricht der Eingabe, und der blaue entspricht die Ausgabe. Wir variiert die Anzahl der Threads nach oben oder unten im Laufe der Zeit, dies bedeutet nicht, sind wir erstellen oder Zerstören von Threads, sondern wir Sie um beibehalten.

Obwohl die Dezimalstellen die Anzahl der Threads unterscheidet sich von dem des Durchsatzes, sehen Sie wie es ist möglich, ordnen Sie die Auswirkungen auf der Ausgabe der Eingabe. Die Anzahl der Threads wird mindestens einem in einer Zeitscheibe ständig geändert, aber dies bedeutet nicht, dass ein Thread gerade erstellt oder zerstört. Stattdessen werden Threads im Pool “ alive ” gehalten werden, aber Sie sind nicht aktiv Arbeit tun.

Verbesserte Methodik bestimmt nur im Gegensatz zu der ersten Ansatz mit Hostcontroller, wobei Ziel war zu modellieren, die Kurve für die Durchsatz und die Entscheidung über die Berechnung basieren, unabhängig davon, ob eine Änderung in der Eingabe, geholfen um die Ausgabe zu verbessern. Intuitiv, besteht eine erhöhte darauf vertrauen, dass die Änderungen, die wir künstlich einführen die Auswirkung auf die Ausgabe beobachtet haben (die maximale Anzahl von Threads überwachten bisher auf das Signal eingeführt werden 20, die durchaus sinnvoll ist, insbesondere für Szenarios, in denen viele Threads). Einer der Nachteile des Ansatzes, das Signal Processing wird darin, dass aufgrund von der künstlichen Wave-Muster eingeführt, die optimale Gleichzeitigkeitsgrad immer Deaktivieren von mindestens ein Thread wird. Darüber hinaus erfolgen Anpassungen an den Grad an Parallelität relativ langsam (schnellere Algorithmen werden basierend auf der CPU-Auslastung Metriken) da sammeln Sie genügend Daten, um sicherzustellen, das Modell stabil ist. Und die Geschwindigkeit hängt von der Länge der Arbeitsaufgaben.

Dieser Ansatz ist nicht perfekt und funktioniert besser, für einige Arbeit ­ Lasten als für andere; es ist jedoch wesentlich besser als die früheren Methoden. Die Arten von Arbeitsauslastungen für die unsere Algorithmus am besten funktioniert werden mit relativ kurzen einzelne Arbeitsaufgaben da kürzere Arbeitsaufgabe, desto schnellere Algorithmus zulässig ist, anpassen. Beispielsweise funktioniert recht gut mit Arbeit Element dauern weniger als 250ms, aber es ist besser der Dauer, wenn weniger als 10 ms sind.

Parallelität Management – wir werden es für Sie

Nachbereiten, stellt der ThreadPool bereit, die den Fokus Programmierer auf Dinge außer Parallelitätsverwaltung helfen. Um eine solche Funktionalität bereitzustellen, hat die ThreadPool-Implementierung High-End-engineering Algorithmen integriert, die viele Entscheidungen für den Benutzer automatisieren können. Ein Beispiel ist die Parallelität Steuerelement Algorithmus, der sich entwickelt hat basiert auf der Technologie und die Anforderungen von verschiedenen Szenarien, z. B. auf nützliche Fortschritt der Arbeit Ausführung messen müssen angegeben werden.

Die Steuerungsalgorithmus mit Parallelität in CLR 4.0 dient automatisch entscheiden, wie viele Arbeitsaufgaben effizient, optimieren daher den Durchsatz der ThreadPool gleichzeitig ausgeführt werden können. Dieser Algorithmus ist es schwierig, die aufgrund von Störungen und Parameter, z. B. die Art der Arbeitsauslastung optimieren; es auch auf der Annahme, dass jede Arbeitsaufgabe eine nützliche Arbeitskomponente ist abhängig ist. Das aktuelle Design und Verhalten hat wurde stark beeinflusst durch ASP.NET und parallelen Framework Szenarios, für die es guten Leistung verfügt. In der Regel erreichen der ThreadPool gut arbeiten effizient ausführen. Der Benutzer sollte Bedenken Sie jedoch, kann es für einige Arbeitslasten unerwartetes Verhalten werden oder wenn z. B. mehrere ThreadPools zur gleichen Zeit ausgeführt.

Erika Fuentes, Ph.D., ist eine Software Development Engineer in Test im CLR-Team, wo Sie im Team Leistung mit bestimmten Schwerpunkt auf dem zentralen Betriebssystem Bereich Threading arbeitet. Sie hat mehrere akademische Publikationen über wissenschaftlichen computing, anpassungsfähige Systeme und Statistiken geschrieben.

*Dank an die folgenden technischen Experten für die Überprüfung der in diesem Artikel:*Eric Eilebrecht und Mohamed Abd El Aziz