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.474 Aufrufe

Veröffentlicht am

Vorteile & Neuerungen und Einsatzmöglichkeiten der Parallel Extensions

Veröffentlicht in: Technologie, Unterhaltung & Humor
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

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

Keine Downloads
Aufrufe
Aufrufe insgesamt
2.474
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
140
Aktionen
Geteilt
0
Downloads
18
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

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 />

×