1. Mehrere wichtige Konzepte über hohe Parallelität
1.1 synchron und asynchron
Zunächst beziehen sich die hier erwähnte Synchronisation und Asynchron auf Funktions-/Methodenaufrufaspekte.
Offensichtlich wartet ein synchroner Anruf auf die Rückkehr der Methode, und ein asynchroner Anruf wird sofort zurückgegeben, aber ein asynchroner Anruf wird sofort zurückgegeben, bedeutet nicht, dass Ihre Aufgabe abgeschlossen wurde. Es wird einen Thread im Hintergrund eingerichtet, um die Aufgabe fortzusetzen.
1.2 Parallelität und Parallelität
Parallelität und Parallelität sind im externen Erscheinungsbild ähnlich. Wie in der Abbildung gezeigt, ist die Parallelität, wenn zwei Aufgaben gleichzeitig ausgeführt werden, während die Parallelität jeweils eine Aufgabe erledigt und dann zu einer anderen Aufgabe wechselt. Daher kann eine einzelne CPU nicht parallel sein, sie kann nur gleichzeitig gleichzeitig sein.
1.3 Kritische Zone
Der kritische Bereich wird verwendet, um eine öffentliche Ressource oder gemeinsame Daten darzustellen. Es kann von mehreren Threads verwendet werden, aber nur ein Thread kann es gleichzeitig verwenden. Sobald die Ressource für kritische Bereiche besetzt ist, müssen andere Threads warten, wenn sie diese Ressource verwenden möchten.
1.4 Blockieren und Nicht blockierende
Blockieren und Nichtblockieren beschreiben normalerweise den gegenseitigen Einfluss zwischen mehreren Fäden. Wenn beispielsweise ein Thread die Ressource für kritische Bereiche einnimmt, müssen alle anderen Threads, die diese Ressource benötigen, in diesem kritischen Bereich warten, und das Warten führt dazu, dass der Thread hängt. Das blockiert. Wenn der Thread, der die Ressource besetzt, nicht bereit ist, die Ressource freizugeben, können alle anderen Threads, die in diesem kritischen Bereich blockieren, nicht funktionieren.
Durch Nicht-Blocking ermöglicht mehrere Threads gleichzeitig die kritische Zone
Daher ist die Leistung der Blockierung im Allgemeinen nicht sehr gut. Laut allgemeinen Statistiken dauert der Kontextschalter, wenn ein Thread auf Betriebssystemebene ausgesetzt ist, normalerweise 80.000 Zeitzyklen, um dies zu tun.
1,5 Deadlock, Hunger, Live -Lock
Der sogenannte Deadlock bezieht sich auf eine Blockade, die durch konkurrierende Ressourcen verursacht oder während des Ausführungsprozesses von zwei oder mehr Prozessen miteinander kommuniziert wird. Ohne externe Kräfte können sie nicht voranschreiten. Zu diesem Zeitpunkt heißt das System Deadlocked oder das System hat einen Deadlock. Diese Prozesse, die immer aufeinander warten, werden als Deadlock -Prozesse bezeichnet. Genau wie die Autos auf dem Bild unten vorwärts gehen möchten, aber niemand kann sich vorwärts bewegen.
Obwohl Deadlock ein schlechtes Phänomen ist, ist es ein statisches Problem. Sobald ein Deadlock auftritt, steckt der Prozess und die CPU -Belegungsrate ist ebenfalls 0. Es wird die CPU nicht besetzt, sondern wird gerufen. Relativ gesehen ist es relativ leicht zu entdecken und zu analysieren.
Entsprechend dem Deadlock ist das Live -Schloss.
Live Lock bedeutet, dass die Dinge 1 Ressourcen nutzen können, aber es ermöglicht es anderen Dingen, zuerst Ressourcen zu verwenden. Dinge 2 können Ressourcen nutzen, aber es ermöglicht auch andere Dinge, zuerst Ressourcen zu nutzen, sodass beide bescheiden waren und keine Ressourcen verwenden können.
Zum Beispiel ist es so, als ob Sie jemanden auf der Straße treffen, der zufällig in die entgegengesetzte Richtung von Ihnen geht und Sie direkt begegnen. Sie möchten sich alle loslassen. Sie sind nach links gezogen und er ist nach links gezogen, aber die beiden konnten immer noch nicht dorthin gehen. Zu diesem Zeitpunkt bewegen Sie sich nach rechts und er bewegt sich nach rechts und fahren auf diese Weise fort.
Wenn ein Thread eine Ressource erhält, wird festgestellt, dass andere Threads auch an diese Ressource denken, da sie nicht alle Ressourcen erhalten haben. Um die Deadlocking zu vermeiden, geben sie alle Ressourcen auf, die sie enthalten. Wenn ein anderer Thread dasselbe tut, benötigen sie dieselben Ressourcen, wie z. B. eine Ressource, b hält B -Ressource, und nach dem Aufgeben der Ressource erhält eine Ressource eine Ressource, und B erhält eine Ressource, und dies wird wiederholt. Es kommt zu einem Live -Schloss.
Live -Schlösser sind schwerer zu erkennen als Deadlocks, da lebende Schlösser ein dynamischer Prozess sind.
Hunger bedeutet, dass ein oder mehrere Threads die erforderlichen Ressourcen aus verschiedenen Gründen nicht erhalten können, was sie nicht ausführen kann.
1,6 Parallelitätsniveau
Parallelitätsniveaus: Blockierung und nicht blockierende (nicht blockierende ist in barrierefrei, lockfrei und wartungsfrei unterteilt)
1.6.1 Blockierung
Wenn ein Thread in den kritischen Abschnitt eintritt, müssen andere Threads warten
1.6.2 Zugänglichkeit
Im Vergleich zur nicht blockierenden Planung ist die Blockierung der Zeitplanung eine pessimistische Strategie, die der Ansicht ist, dass das Zusammen Ändern von Daten die Daten wahrscheinlich schlecht macht. Anstatt die Zeitplanung zu blockieren, ist es eine optimistische Strategie, die der Ansicht ist, dass das Ändern von Daten die Daten möglicherweise nicht unbedingt schlecht macht. Es ist jedoch eine Strategie des breiten Eintritts und des strengen Ausstiegs. Wenn er feststellt, dass ein Prozess Datenwettbewerb und Konflikte im kritischen Bereich hat, wird die Daten mit der Barriere-freie Planung die Daten zurückdrehen.
Bei dieser barrierefreien Planungsmethode entsprechen alle Threads einer Momentaufnahme eines Systems. Sie werden immer wieder versuchen, die Schnappschüsse zu machen, bis sie gültig sind.
1.6.3 locklos
Es ist zugänglich
Stellen Sie sicher, dass ein Thread gewinnen kann
Im Vergleich zur Zugänglichkeit garantiert Barrierefreiheit nicht, dass Operationen abgeschlossen werden können, wenn Wettbewerbe vorliegt. Wenn sie in den einzelnen Operationen Konflikte findet, wird dies weiterhin versucht. Wenn sich die Fäden im kritischen Bereich ineinander stören, werden alle Fäden im kritischen Bereich hängen, und dann hat die Systemleistung einen großen Einfluss.
Lockless fügt eine neue Bedingung hinzu, um sicherzustellen, dass ein Thread jeden Wettbewerb gewinnen kann, was das Problem der Barriere-Frähnheit löst. Zumindest stellt es sicher, dass alle Threads reibungslos ausgeführt werden.
Der folgende Code ist ein typischer lock-freier Berechnungscode in Java
Lockless ist in Java üblich
while (! atomicvar.comPareandset (localvar, localVar+1)) {localvar = atomicvar.get (); }1.6.4 Kein Warten
Locklos
Alle Themen müssen innerhalb eines begrenzten Schritts abgeschlossen sein
Kein Hunger
Zunächst ist die Prämisse von kein Warten auf der Grundlage von lock-freien. Lock-Free stellt nur sicher, dass es Eintritt und Ausstieg im kritischen Bereich geben muss. Wenn die Priorität des Eintritts jedoch sehr hoch ist, können einige Threads mit geringem Priorität im kritischen Bereich hungrig sein und den kritischen Bereich nicht verlassen. Dann löst kein Warten dieses Problem, was sicherstellt, dass alle Threads innerhalb eines begrenzten Schrittes abgeschlossen sein müssen, und natürlich gibt es keinen Hunger.
Kein Warten ist die höchste Parallelität, die es diesem System ermöglichen kann, den optimalen Zustand zu erreichen.
Typische Fälle ohne zu warten:
Wenn es nur Lesefäden und keine Thread -Threads gibt, muss dies ohne zu warten.
Wenn es beide Lesen von Threads gibt und Threads schreibt und vor jedem Schreibbeauftrag die Daten kopieren und dann die Kopie ändern, anstatt die Originaldaten zu ändern, da in der Änderung der Kopie keinen Konflikt vorhanden ist, ist auch der Änderungsprozess ohne Warten. Die endgültige Synchronisation besteht nur darin, die schriftlichen Daten zu überschreiben.
Da die wartungsfreie Anforderung relativ hoch ist und schwierig zu implementieren ist, wird lock-freier dauerhaft verwendet.
2. Zwei wichtige Gesetze zur Parallelität
Beide Gesetze beziehen sich auf das Beschleunigungsverhältnis
2.1 Amdahls Gesetz
Definieren Sie die Berechnungsformel und die theoretische Obergrenze des Beschleunigungsverhältnisses nach Parallelisierung des seriellen Systems
Beschleunigungsverhältnis Definition: Beschleunigungsverhältnis = Systemzeitverbrauch vor der Optimierung / Systemzeit nach der Optimierung
Zum Beispiel:
Beschleunigungsverhältnis = Systemzeitverbrauch vor der Optimierung / Systemzeit nach der Optimierung = 500/400 = 1,25
Dieser Satz zeigt, dass die Erhöhung der Anzahl der CPU -Prozessoren nicht unbedingt eine wirksame Rolle bei der Erhöhung des Anteils der parallelen Module im System spielt. Nur durch ein vernünftiges Erhöhen der Anzahl der parallelen Prozessoren kann die maximale Beschleunigungsquote mit der kleinsten Investition erhalten werden.
2.2 Gustafsons Gesetz
Erklären Sie die Beziehung zwischen der Anzahl der Prozessoren, des seriellen Verhältnisses und der Beschleunigungsverhältnis
Dann wird das Beschleunigungsverhältnis = NF (N-1) // Der Ableitungsprozess wird weggelassen
Solange eine ausreichende Parallelisierung vorliegt, ist das Beschleunigungsverhältnis proportional zur Anzahl der CPUs.