Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Parallele Softwareentwicklung mit .NET 4.0<br />Vorteile & Neuerungen und Einsatzmöglichkeiten der Parallel Extensions<br />
Was istparalleleProgrammierung?<br />AufteilungeinerAufgabe in Teilaufgaben die parallel bearbeitetwerden<br />Machtsich d...
WozuparalleleProgrammierung?<br />Single Core Systeme<br />User Interface nichtblockieren<br />AsynchroneOperationen<br />...
WozuparalleleProgrammierung?<br />Server skalierenschonmit Multi-CPU<br />User Systemebesitzen Multi-Core<br />Ressourcenm...
Statistik<br />
ParalleleProgrammierung – vor .NET 4.0<br />Synchrones & Asynchrones Threading<br />Nachteil Thread Overhead<br />ThreadPo...
Von Threads zu Tasks<br />Threads und Tasks sindsehrähnlich<br />Threads<br />erlaubenparalleleAusführunginnerhalbeinesPro...
ThreadPool<br />Global Queue<br />Worker Thread 1<br />Worker Thread 1<br />…<br />Item 4<br />Item 5<br />Program Thread<...
Idle Thread Retirement</li></li></ul><li>Task Management<br />Local<br />Work-Stealing Queue<br />Local Work-Stealing Queu...
Idle Thread Retirement
Hill-climbing</li></li></ul><li>Die Task Klasse<br />Integriertals Subset von System.Threading<br />Erstellbardurch<br />E...
Der Action/Func Delegate<br />BeinhalteteineMethode die keinenRückgabewertbesitzt<br />Kannmehrere Parameter besitzen<br />
Task ohne Parameter und Rückgabewert<br />staticvoid Main(string[] args)<br />{<br />Action Action1 = newAction(Compute);<...
Task mit Parameter und ohneRückgabewert<br />Action Delegat mit Parameter vom Typ object<br />staticvoid Main(string[] arg...
Task ohne Parameter mitRückgabewert<br />Func dem Task mit Rückgabetyp string zuweisen<br />Func Delegat mit Rückgabetyp s...
Task mit Parameter und Rückgabewert<br />Func Delegat mit Rückgabetyp string<br />und Parameter object<br />staticvoid Mai...
Lambda Ausdrücke<br />BildenanonymeFunktion die Ausdrücke und Anweisungenenthält<br />Syntax<br />WichtigeOperatoren<br />...
Lambda Ausdrücke<br />Delegat zum speichern der Anonymen Funktion<br />Lambda Ausdruck<br />x wird zu x * x<br />delegatei...
TaskCreationOptions<br />BietetOptionenfür die Behandlung des Tasks durch den Taskmanager<br />None<br />PreferFairness<br...
Task Abbruch<br />EinheiklesThemamit Multithreading<br />Ziele<br />Wahren von Teilergebnissen<br />Vermeiden von Holzhamm...
CancellationSource<br />BeinhaltetCancellationToken<br />Threadsicherevom Framework zurVerfügunggestellteAbortvariable<br ...
CancellationToken<br />MehrereMöglichkeiten auf Cancel Request zureagieren<br />Polling<br />RegelmäßigIsCancellationReque...
Exception Handling<br />AggregateExceptionwirdgeworfenwenneineodermehrere Exceptions auftreten<br />Wird an den Thread gel...
Die Parallel Klasse<br />BietetZugriff auf parallelisierteSchleifenund Regionen<br />WichtigeMethoden<br />Parallel.Invoke...
Parallel.Invoke<br />Leichtgewichtigste Tasking Art<br />Wenig Code<br />WenigKontrolle<br />
Parallel.For<br />Ersetztdas for Schlüsselwort<br />GibtParallelLoopResultzurück<br />EnthältInformationenüber die letzte ...
EinfacheParallel.ForSchleife<br />Zählerendwert<br />Zählerstartwert<br />Zählervariable<br />Parallel.For(0, 100, (i) =><...
Schleifenabbrechen<br />ParallelLoopStateliefert die Methoden<br />Stop() <br />Bricht die Iteration so schnellwiemöglicha...
ErweiterteParallel.ForSchleife<br />Rückgabewert<br />Rückgabewert<br />ParallelLoopResultForResult = Parallel.For(0, 100,...
Parallel.ForEach<br />ParallelesÄquivalentzurforeachSchleife<br />VerwendungwieParallel.ForSchleife<br />
EinfacheParallel.ForEachSchleife<br />List<string> Books = newList<string>{"Die Kreutzersonate", "Anna Karenina", "Krieg u...
Von LINQ zu PLINQ<br />LINQ – Language Integrated Query<br />CodekomponentezurAbfrage von Datenquellen<br />PLINQ – Parall...
ParallelEnumerableKlasse<br />AsParallel()<br />Einstiegspunktfür PLINQ<br />Legt fest dass der Rest des Querysparallelisi...
Einfacher PLINQ Query<br />Zahlen von 1 bis 10000<br />var source = Enumerable.Range(1, 10000);<br /> <br />varsmallerfift...
Reihenfolge & PLINQ<br />Aufgrund von Parallelitätist die Reihenfolgenichtgewährleistet<br />AbhilfeschafftAsOrdered()<br ...
PLINQ Abbruch<br />AsParallel().WithCancellation(CancellationToken) <br />Bricht den Query abwenn das Token ein Cancel Sig...
DatenstrukturenfürparalleleProgrammierung<br />Thread-safe, scalable collections<br />IProducerConsumerCollection<T><br />...
Visual Studio 2010 & ParalleleProgrammierung<br />Multithread Debugging früherlästig und umständlich<br />Mit Visual Studi...
ParalleleAufgaben<br />Ähnlichwie Threads Fenster<br />Listet Tasks statt Threads auf<br />
Parallele Stacks<br />ZeigtAbhängigkeitenzwischen Threads<br />Thread oder Task Darstellung<br />
Nächste SlideShare
Wird geladen in …5
×

Parallele Softwareentwicklung mit .NET 4.0

2.617 Aufrufe

Veröffentlicht am

Vorteile & Neuerungen und Einsatzmöglichkeiten der Parallel Extensions

Veröffentlicht in: Technologie, Unterhaltung & Humor
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Parallele Softwareentwicklung mit .NET 4.0

  1. 1. Parallele Softwareentwicklung mit .NET 4.0<br />Vorteile & Neuerungen und Einsatzmöglichkeiten der Parallel Extensions<br />
  2. 2. Was istparalleleProgrammierung?<br />AufteilungeinerAufgabe in Teilaufgaben die parallel bearbeitetwerden<br />Machtsich die RechenkraftmehrererProzessoren / Cores zunutzen<br />
  3. 3. WozuparalleleProgrammierung?<br />Single Core Systeme<br />User Interface nichtblockieren<br />AsynchroneOperationen<br />Synchronisation<br />
  4. 4. WozuparalleleProgrammierung?<br />Server skalierenschonmit Multi-CPU<br />User Systemebesitzen Multi-Core<br />Ressourcenmüssengenutztwerden<br />
  5. 5. Statistik<br />
  6. 6. ParalleleProgrammierung – vor .NET 4.0<br />Synchrones & Asynchrones Threading<br />Nachteil Thread Overhead<br />ThreadPool<br />Geeignetfür Fire and Forget<br />Einmalgestartete Threads könnennichtkontrolliertwerden<br />Nachteile<br />Warten<br />Abbruch<br />Weitermachen<br />Debugging<br />Etc.<br />
  7. 7. Von Threads zu Tasks<br />Threads und Tasks sindsehrähnlich<br />Threads<br />erlaubenparalleleAusführunginnerhalbeinesProzesses<br />Symbolisch die Arbeiter des Prozesses<br />Tasks <br />basieren auf Threads<br />Symbolisch die Arbeit die den Arbeiternaufgetragenwird<br />Mit der Task Parallel Library in .NET 4.0 eingeführt<br />
  8. 8. ThreadPool<br />Global Queue<br />Worker Thread 1<br />Worker Thread 1<br />…<br />Item 4<br />Item 5<br />Program Thread<br />Item 1<br />Item 2<br />Item 3<br />Item 6<br />Thread Management:<br /><ul><li>Starvation Detection
  9. 9. Idle Thread Retirement</li></li></ul><li>Task Management<br />Local<br />Work-Stealing Queue<br />Local Work-Stealing Queue<br />Lock-Free<br />Global Queue<br />…<br />Worker Thread 1<br />Worker Thread p<br />…<br />Task 6<br />Task 3<br />Program Thread<br />Task 4<br />Task 1<br />Task 5<br />Task 2<br />Thread Management:<br /><ul><li>Starvation Detection
  10. 10. Idle Thread Retirement
  11. 11. Hill-climbing</li></li></ul><li>Die Task Klasse<br />Integriertals Subset von System.Threading<br />Erstellbardurch<br />Erstellungeines Task Objektes<br />StartNew() Erstellt und starteteinen Task in einemSchritt<br />AlternativParallel.Invoke()<br />Interessant<br />Task.ContinueWith()<br />
  12. 12. Der Action/Func Delegate<br />BeinhalteteineMethode die keinenRückgabewertbesitzt<br />Kannmehrere Parameter besitzen<br />
  13. 13. Task ohne Parameter und Rückgabewert<br />staticvoid Main(string[] args)<br />{<br />Action Action1 = newAction(Compute);<br />Task Task1 = newTask(Action1);<br /> Task1.Start();<br />}<br />staticvoid Compute()<br />{<br />Console.WriteLine("Computing...");<br />System.Threading.Thread.Sleep(1000);<br />Console.WriteLine("Computing finished...");<br />}<br />Action Delegat<br />Action dem Task Objekt zuweisen<br />Task Starten<br />
  14. 14. Task mit Parameter und ohneRückgabewert<br />Action Delegat mit Parameter vom Typ object<br />staticvoid Main(string[] args)<br />{<br />Action<object> Action1 = newAction<object>(Compute);<br />Task Task1 = newTask(Action1, "Parameter 1");<br /> Task1.Start();<br />}<br />staticvoid Compute(object Parameter)<br />{<br />Console.WriteLine("Computing with Parameter " + Parameter + "...");<br />System.Threading.Thread.Sleep(1000);<br />Console.WriteLine("Computing finished...");<br />}<br />Action dem Task Objekt zuweisen & Parameter übrgeben<br />Parameter verarbeiten<br />
  15. 15. Task ohne Parameter mitRückgabewert<br />Func dem Task mit Rückgabetyp string zuweisen<br />Func Delegat mit Rückgabetyp string<br />staticvoid Main(string[] args)<br />{<br />Func<string> Func1 = newFunc<string>(Compute);<br />Task<string> Task1 = newTask<string>(Func1);<br /> Task1.Start();<br />Console.WriteLine("Result was " + Task1.Result);<br />}<br />staticstring Compute()<br />{<br />Console.WriteLine("Computing...");<br />System.Threading.Thread.Sleep(1000);<br />Console.WriteLine("Computing finished...");<br />return"Result";<br />}<br />Rückgabewert abrufen<br />Passende Signatur<br />Wert zurückgeben<br />
  16. 16. Task mit Parameter und Rückgabewert<br />Func Delegat mit Rückgabetyp string<br />und Parameter object<br />staticvoid Main(string[] args)<br />{<br />Func<object, string> Func1 = newFunc<object, string>(Compute);<br />Task<string> Task1 = newTask<string>(Func1, "Parameter1");<br /> Task1.Start();<br />Console.WriteLine("Result was " + Task1.Result);<br />}<br />staticstring Compute(object Parameter)<br />{<br />Console.WriteLine("Computing with Parameter " + Parameter + "...");<br />System.Threading.Thread.Sleep(1000);<br />Console.WriteLine("Computing finished...");<br />return"Result";<br />}<br />Func dem Task mit Rückgabetyp string zuweisen & Parameter übergeben<br />
  17. 17. Lambda Ausdrücke<br />BildenanonymeFunktion die Ausdrücke und Anweisungenenthält<br />Syntax<br />WichtigeOperatoren<br />=> “wirdzu”<br />() definiertEingangsparameter<br />{} umschließteineReihe von Anweisungen<br />Werden oft zusammenmit LINQ verwendet<br />Wichtig<br />Lambda Expressions können auf Variablen der einschließendenMethode / Typzugreifen<br />
  18. 18. Lambda Ausdrücke<br />Delegat zum speichern der Anonymen Funktion<br />Lambda Ausdruck<br />x wird zu x * x<br />delegateintdel(int i);<br />staticvoid Main(string[] args)<br />{<br />delmyDelegate = x => x * x;<br />int j = myDelegate(5); //j = 25<br />}<br />Aufruf der Anonymen Funktion mittels Delegat<br />
  19. 19. TaskCreationOptions<br />BietetOptionenfür die Behandlung des Tasks durch den Taskmanager<br />None<br />PreferFairness<br />LongRunning<br />AttachedToParent<br />
  20. 20. Task Abbruch<br />EinheiklesThemamit Multithreading<br />Ziele<br />Wahren von Teilergebnissen<br />Vermeiden von HolzhammerwieThread.Abort<br />Zuverlässige und sichereAbbruchmethode<br />Tasks werdendurchCancellationTokenbeendet<br />Abbruchwird von CancellactionSourceangefordert, abernichtunbedingtsofortausgeführt<br />GewährleistetsicheresAbbrechen von Tasks<br />ImwesentlichenwieAbortvariable<br />
  21. 21. CancellationSource<br />BeinhaltetCancellationToken<br />Threadsicherevom Framework zurVerfügunggestellteAbortvariable<br />Wirdfür Tasks verwendet, kannaberauchfürkonventionelles Threading benutztwerden<br />Aufruf von CancellationSource.CancelsetztCancellationToken.IsCancellationRequested auf true (irreversibel)<br />
  22. 22. CancellationToken<br />MehrereMöglichkeiten auf Cancel Request zureagieren<br />Polling<br />RegelmäßigIsCancellationRequestedüberprüfenwenn Task alsOrdnungsgemäßbeendetmarkiertwerdensoll<br />ThrowIfCancellationRequestedaufrufenwenn Task als Cancelled markiertwerdensoll<br />Callback Methode<br />Wirdausgeführtwenn Token gecancelledwird<br />Wait Handle<br />Triggertwenn Token gecancelledwird<br />
  23. 23. Exception Handling<br />AggregateExceptionwirdgeworfenwenneineodermehrere Exceptions auftreten<br />Wird an den Thread geleitet der auf den Task joint bzw das Ergebnisabruft<br />Task istCancelled wennOperationCancelledExceptiongeworfenwurde<br />Task ist Faulted wennandere Exceptions geworfenwurden<br />Wichtig!<br />Just My Code unterDebugoptionendeaktivieren<br />
  24. 24. Die Parallel Klasse<br />BietetZugriff auf parallelisierteSchleifenund Regionen<br />WichtigeMethoden<br />Parallel.Invoke()<br />Parallel.For()<br />Parallel.ForEach()<br />
  25. 25. Parallel.Invoke<br />Leichtgewichtigste Tasking Art<br />Wenig Code<br />WenigKontrolle<br />
  26. 26. Parallel.For<br />Ersetztdas for Schlüsselwort<br />GibtParallelLoopResultzurück<br />EnthältInformationenüber die letzte Iteration etc.<br />
  27. 27. EinfacheParallel.ForSchleife<br />Zählerendwert<br />Zählerstartwert<br />Zählervariable<br />Parallel.For(0, 100, (i) =><br /> {<br />Console.WriteLine(i);<br />DoStuff();<br /> });<br />
  28. 28. Schleifenabbrechen<br />ParallelLoopStateliefert die Methoden<br />Stop() <br />Bricht die Iteration so schnellwiemöglichab<br />Break()<br />WartetbisalleIterationen in allen Threads vor der aktuellenIterationenabgeschlossensind und bricht die Iteration dannab,<br />RückgabewertParallelLoopResultliefertInformationenüber das Resultat der Schleife<br />
  29. 29. ErweiterteParallel.ForSchleife<br />Rückgabewert<br />Rückgabewert<br />ParallelLoopResultForResult = Parallel.For(0, 100, (i, LoopState) =><br /> {<br />Console.WriteLine(i);<br />DoStuff();<br />if (i > 20)<br /> {<br />LoopState.Break();<br /> }<br /> });<br />if (!ForResult.IsCompleted)<br /> {<br />Console.WriteLine(ForResult.LowestBreakIteration);<br /> }<br />ParallelLoopState<br />Iteration Abbrechen<br />Ergebnis abfragen<br />
  30. 30. Parallel.ForEach<br />ParallelesÄquivalentzurforeachSchleife<br />VerwendungwieParallel.ForSchleife<br />
  31. 31. EinfacheParallel.ForEachSchleife<br />List<string> Books = newList<string>{"Die Kreutzersonate", "Anna Karenina", "Krieg und Frieden", "Der Tod des Ivan Illitsch", "Herr und Knecht"};<br /> <br /> <br />Parallel.ForEach<string>(Books, (Element) =><br /> {<br />Console.WriteLine(Element);<br />});<br />Iterationselement<br />Collection<br />
  32. 32. Von LINQ zu PLINQ<br />LINQ – Language Integrated Query<br />CodekomponentezurAbfrage von Datenquellen<br />PLINQ – Parallel Language Integrated Query<br />Erweiterung des LINQ Befehlssatzes um paralleleElemente<br />
  33. 33. ParallelEnumerableKlasse<br />AsParallel()<br />Einstiegspunktfür PLINQ<br />Legt fest dass der Rest des Querysparallelisiertausgeführtwerdensoll<br />AsSequential()<br />Legt fest dass der Rest des Queryssequentiellausgeführtwerdensoll<br />
  34. 34. Einfacher PLINQ Query<br />Zahlen von 1 bis 10000<br />var source = Enumerable.Range(1, 10000);<br /> <br />varsmallerfiftynumbers = from number insource.AsParallel()<br />where number < 50<br />select number;<br />Parallele Bearbeitung<br />
  35. 35. Reihenfolge & PLINQ<br />Aufgrund von Parallelitätist die Reihenfolgenichtgewährleistet<br />AbhilfeschafftAsOrdered()<br />Verarbeitet parallel<br />Buffert und sortiertEinträge um ursprünglicheReihenfolgezuwahren<br />
  36. 36. PLINQ Abbruch<br />AsParallel().WithCancellation(CancellationToken) <br />Bricht den Query abwenn das Token ein Cancel Signal erhält<br />
  37. 37. DatenstrukturenfürparalleleProgrammierung<br />Thread-safe, scalable collections<br />IProducerConsumerCollection<T><br />ConcurrentQueue<T><br />ConcurrentStack<T><br />ConcurrentBag<T><br />ConcurrentDictionary<TKey,TValue><br />Phases and work exchange<br />Barrier <br />BlockingCollection<T><br />CountdownEvent<br />Partitioning<br />{Orderable}Partitioner<T><br />Partitioner.Create<br />Exception handling<br />AggregateException<br />Initialization<br />Lazy<T><br />LazyInitializer.EnsureInitialized<T><br />ThreadLocal<T><br />Locks<br />ManualResetEventSlim<br />SemaphoreSlim<br />SpinLock<br />SpinWait<br />Cancellation<br />CancellationToken{Source}<br />
  38. 38. Visual Studio 2010 & ParalleleProgrammierung<br />Multithread Debugging früherlästig und umständlich<br />Mit Visual Studio 2010 gibtes Debug Fenster<br />ParalleleAufgaben<br />ParalleleStapel<br />Profiling von Multithread Anwendungenmöglich<br />Concurrency Visualizer<br />
  39. 39. ParalleleAufgaben<br />Ähnlichwie Threads Fenster<br />Listet Tasks statt Threads auf<br />
  40. 40. Parallele Stacks<br />ZeigtAbhängigkeitenzwischen Threads<br />Thread oder Task Darstellung<br />
  41. 41. Vielen Dank für die Aufmerksamkeit!<br />Qiong Wu<br />qiong.wu@studentpartners.de<br />

×