Multithreading and parallelism

1,954 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,954
On SlideShare
0
From Embeds
0
Number of Embeds
1,347
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Multithreading and parallelism

  1. 1. Multithreading and Parallelism
  2. 2. Use cases- Масштабованість на multi-CPU машинах - Виконання швидше - Обробка більшої кількості запитів- Приховування затримок (hiding latency) - Обчислення, доки чекаємо на IO- Відгук UI (responsiveness) - «Усунення» блокуючих операцій
  3. 3. Threads
  4. 4. ProcessПроцес визначає virtual address space.Досягається ізоляція, оскільки- процеси не можуть напряму адресувати пам’ять інших процесів.Разом з тим, спільне використання:- спільна бібліотека може входити доадресного простору кількох процесів.
  5. 5. Процес не виконує код,а лише надає ресурси і контекст для виконання потоків
  6. 6. Потоки (threads) виконують кодПотоки виконуються в межах процесуМають доступ до всього адресного просторупроцесу.Кожен потік має свій стек та значеннярегістрів CPU
  7. 7. Windows- Багатозадачна ОС- Витісняюче планування на основі пріоритетів - (preemptive scheduling, priority-based)- Потік виконується на будь-якому CPU- CPU завжди виконує той потік, який має найвищий пріоритет (і який готовий до виконання)
  8. 8. Планування (scheduling)- Потік виконується протягом сталого періоду часу – кванту- Величина квантів може бути різна, залежить від: - Конфіга системи (короткі, довгі) - Статуса процесу (активний, фоновий)- По закінченню кванта ОС перевіряє, чи є готовий потік з таким же пріоритетом- Як тільки з’являється потік з вищим пріоритетом, поточний потік  витісняється - Навіть якщо його квант не закінчився
  9. 9. Переключення контексту(context switching)Вибравши новий потік для виконання, ОСпереключає контекст.Зберігається стан регістрів CPU + IPпопереднього потоку.Відновлюються регістри CPU нового потоку.
  10. 10. Потік звільняє CPU, коли:- Переходить в стан очікування самостійно - Диск, мережа, пам’ять (!), синхронізація- Витісняється потоком з вищим пріоритетом - Який закінчив щось очікувати (диск, мережа,...) - Його пріоритет збільшився- Завершився квант- Завершився потік
  11. 11. Динамічне підвищення пріоритету- Після закінчення вводу/виводу- Після закінчення очікування- При пробудженні GUI потоків через операції з вікнами- Готовий до виконання потік довший час не має шансу виконатисьТакож при цьому може збільшуватись квант.
  12. 12. Вибір CPU для потоку- Вибирається процесор, який простоює- Якщо немає вільного процесора – витіснення на ідеальному процесорі
  13. 13. Scheduling granularityWindows планує потоки, не процесиНаслідок: Процес А має 1 потік Процес Б має 9 потоків Процес Б отримає 90% процесорного часу (за умови однакового пріоритету потоків)
  14. 14. Threads in .NET- Створення потоку: - new Thread(Action)- Запуск: - Thread.Start()- Очікування доки потік завершиться: - Thread.Join()
  15. 15. Thread pool- Пул потоків виконує завдання використовуючи вже створений набір потоків- Додання нового завдання: - ThreadPool.QueueUserWorkItem(delegate)
  16. 16. UI message loop- Один GUI потік обробляє повідомлення з черги: - Clicks, repaints, mouse moves, key presses, …- Події обробляються послідовно- Отже, якщо одна подія займає довгий час, решта будуть чекати- Отже, довготривалі події ніколи не повинні виконуватись в UI потоці - IO, важкі обчислення
  17. 17. Оновлення контролів- Щоб змінити контрол, код повинен виконуватись в UI потоці- Інші потоки можуть програмно додати повідомлення в чергу UI потоку
  18. 18. Demo
  19. 19. Task Parallel Library (TPL)Since .NET 4.0http://msdn.microsoft.com/en-us/library/dd460717.aspxMSDN Parallel Computing Dev Center
  20. 20. Task http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspxАбстрагує значення, яке буде* доступне вмайбутньому.Значення є результатом- Обчислення (CPU)- Вводу (IO)Task є .NET реалізацією future and promise
  21. 21. Значення буде* доступне- Можливо вже є доступне - Таск завершився до звернення за результатом, - Також таск міг виконатись в цьому ж потоці- Можливо не буде, бо станеться помилка- Або обчислення буде відмінено
  22. 22. Створення і запускTask Task.Factory.StartNew(Action);Task<TResult> Task.Factory.StartNew(Func<TResult>);Або Task constructor + Task.Start() method
  23. 23. ВиконанняTask – не потік.За замовчуванням таски виконуютьсяпотоками з thread poolНаслідок 1: таск може почати виконуватись неодразуНаслідок 2: довготривалий таск буде займати потікз thread pool(цей потік не зможе працювати над рештою задач)
  24. 24. Виконання довготривалого Task`аБуде створено окремий потікTask.Factory.StartNew(() => { … }, TaskCreationOptions.LongRunning);
  25. 25. Завершення, результат- Task.Wait() // with optional timeout- Task.ResultПотік заблокується, поки таск незавершиться
  26. 26. Очікування декількох тасківTask.WaitAll(Task[]) // with optional timeoutTask.WaitAny(Task[])
  27. 27. Demo
  28. 28. Handle exceptions option 1Task<int> t = Task.Factory.StartNew(() => { ... throw new InvalidOperationException("error"); return 42; }); Тут виникне Exceptionint result = t.Result; AggregateExceptionAggregateException.InnerException(s) міститимепочатковий exception
  29. 29. Handle exceptions option 2Check Task state:- Task.IsCompleted- Task.IsFaulted- Task.Exception AggregateException- Task.Status
  30. 30. Unhandled exceptionsЯкщо не обробити exception, TPL його перевикинепри фіналізації Task’aВикличеться подіяTaskScheduler.UnobservedTaskExceptionПомилка вважається обробленою при:- Виклику Task.Result, Task.Wait() etc.- Звертанні до Task.Exception
  31. 31. Demo
  32. 32. ContinuationsЗадача: після завершення таска виконатинаступний.В наступному таску – доступний результатпопереднього.Task<U> Task<T>.ContinueWith(antecedent => {...});TaskFactory.ContinueWhenAll(Task[], tasks => {...});
  33. 33. Continuations, способи- One-to-one- Many-to-one- One-to-many- Chain
  34. 34. Demo
  35. 35. Деякі приклади використання Tasks - Досягнення паралелізму - Виконання CPU-bound задач паралельно - Виконання IO-bound задач паралельно - Responsive UI Demo
  36. 36. Синхронізація
  37. 37. Data raceint count = 0;for (int i = 0; i < data.Length; i++){ var task = Task.Factory.StartNew(() => { count++; Not atomic! }); tasks.Add(task);}Task.WaitAll(tasks.ToArray());
  38. 38. Preemption Thread Areg = read count (1) Thread B reg = read count (1) inc reg (2) write reg to count (2)inc reg (2)write reg to count (2)
  39. 39. Рішення 1 – interlockedint count = 0;for (int i = 0; i < data.Length; i++){ var task = Task.Factory.StartNew(() => { Atomic, Interlocked.Increment(ref count); Flushes caches }); tasks.Add(task);}Task.WaitAll(tasks.ToArray());
  40. 40. Рішення 2 – locking (critical section)int count = 0;object syncRoot = new object();for (int i = 0; i < data.Length; i++){ var task = Task.Factory.StartNew(() => { lock (syncRoot) Other threads { cannot acquire held lock count++; } }); tasks.Add(task);}Task.WaitAll(tasks.ToArray());
  41. 41. Parallel LoopsParallel LINQ
  42. 42. Parallel.For() and ForEach()Заблокується, доки всі ітерації не виконаються Parallel.For(0, data.Length, i => { Є можливість зробити Break, передавши state ProcessItem(data, i); }); Parallel.ForEach(data, value => { ProcessItem(value); });
  43. 43. Parallel LINQ (PLINQ)var result = from value in data.AsParallel() where value % 2 == 0 let cube = Math.Pow(value, 3) let processed = ProcessItem(value) select new { Cube = cube, Result = processed };parallelResult.ToArray(); Виконання почнеться тут
  44. 44. Варто також дізнатись про:- Task.Status, Task lifecycle http://blogs.msdn.com/b/pfxteam/archive/2009/08/30/9889070.aspx- Continuations http://msdn.microsoft.com/en-us/library/dd235663- TaskSchedulers http://msdn.microsoft.com/en-us/library/dd997402- Cancellation http://msdn.microsoft.com/en-us/library/dd997364.aspx- Synchronization primitives http://msdn.microsoft.com/en- us/library/ms228964.aspx- Concurrent collections http://msdn.microsoft.com/en- us/library/system.collections.concurrent.aspx- Безплатна книжка, ще одна

×