Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

разработка серверов и серверных приложений лекция №2

414 visualizaciones

Publicado el

Причины потерь процессорного времени при организации последовательности вычислений внутри потока: 1. Ожидание ответа на запрос (поток спит). 2. Выполнение дополнительных "лишних" действий. Как способ устранения этих потерь - паттерн Пул потоков. Анализ императивного и функционального подхода к борьбе с "жадными" операциями. Эволюция методов организации параллельных вычислений на основе пула потоков.

Publicado en: Tecnología
  • Sé el primero en comentar

разработка серверов и серверных приложений лекция №2

  1. 1. Часть 1. Архитектура 30
  2. 2. Глава 2. TM для потоков. 31
  3. 3. Вычисления в потоке 32 - полезная работа - потери времени
  4. 4. Два вида потерь времени 33
  5. 5. 1. Поток ждет ответа 34
  6. 6. Задача о спящем парикмахере 35 Эдгар Дейкстра, 1967
  7. 7. Что делать? 36 Асинхронность На время ожидания освободить поток, чтобы дать возможность выполнить другую задачу
  8. 8. Жадные операции 37 Императивные языки Vs Функциональные языки
  9. 9. Почему функциональные языки? 38 int c = 0; for(int i =0; ; ++i) { c += i; } void print(int i, int *c) { *c += i ; print(i+1, c); }
  10. 10. Что будет с эффективностью? 39 Что если, ожидание > 50 милисекунд? Время отклика > 100 милисекунд?
  11. 11. Стайер vs спринтер 40
  12. 12. benchmarksgame.alioth.debian.org 41
  13. 13. benchmarksgame.alioth.debian.org 42
  14. 14. benchmarksgame.alioth.debian.org 43
  15. 15. benchmarksgame.alioth.debian.org 44
  16. 16. Императивность тоже может! 45 while(условие) { //тело цикла Здесь может быть код, который будет передавать эстафету в другой поток вычислений }
  17. 17. А как же эффективность? 46 Philipp Haler, Martin Odersky Event-Based Programming Without Inversion Control 2006 Scala, C# 5 (await)
  18. 18. Пример await на C# 47 static async Task SavePage(string file, string a) { using (var stream = File.AppendText(file)) { var html = await new WebClient().DownloadStringTaskAsync(a); await stream.WriteAsync(html); } }
  19. 19. 2. Лишние действия 48
  20. 20. Что делать? 49 Делегирование Передать выполнение задач в другой поток
  21. 21. Ограничения делегирования 50 Трудоемкость делегируемой задачи vs время на ее передачу • Чем меньше размер делегируемой задачи, тем ниже КПД (закон Амдала) • => Запуск потока по требованию – слишком дорогая операция
  22. 22. Ограничения делегирования 51 Количество потоков vs время на управление потоками • Слишком большое число потоков приводит к потерям производительности • При небольшом числе потоков количество текущих задач больше числа потоков => нужна очередь задач
  23. 23. Архитектура Fog cutter 52 Gul A. Agha, Karmani 2011 Распространенная архитектура для вычислительных агентов
  24. 24. Эволюция асинхронности 53 1. Пул потоков public static void Main() { ThreadPool.QueueUserWorkItem( new WaitCallback(ThreadProc)); Thread.Sleep(1000); } static void ThreadProc(Object stateInfo) { …}
  25. 25. Эволюция асинхронности 54 2. Асинхронные callback’s public class MyClass { public IAsyncResult BeginSend(string host, int port, byte[] buffer, int offset, int size, AsyncCallback asyncCallback, object state) { SendAsyncResult result = new SendAsyncResult( host, port, bufferБ offset, size, asyncCallback, state, this /*owner*/, "send"); result.Process(); return result; } public void EndSend(IAsyncResult result) { AsyncResultNoResult.End(result, this, "send"); } }
  26. 26. Эволюция асинхронности 55 3. Оператор await static async Task SavePage(string file, string a) { using (var stream = File.AppendText(file)) { var html = await new WebClient().DownloadStringTaskAsync(a); await stream.WriteAsync(html); } }
  27. 27. Эволюция асинхронности 56 4. Библиотеки для параллельных циклов и не только foreach (var item in sourceCollection) { Process(item); } Parallel.ForEach(sourceCollection, item => Process(item));
  28. 28. Эволюция асинхронности 57 Встраивание конструкций в язык ????? par_foreach (var item in sourceCollection) { Process(item); }
  29. 29. Эволюция асинхронности 58 1. Пул потоков 2. Асинхронные callback’s 3. Оператор await 4. Библиотеки для параллельного циклов и не только 5. Встраивание конструкций в язык
  30. 30. Пул потоков 59
  31. 31. Простой пул потоков 60 http://www.regfordev.com/2010/12/thread-pool. html http://www.regfordev.com/2010/12/thread-pool.html
  32. 32. Пул потоков в .Net 4.0 61
  33. 33. Еще один пул потоков 62 Балансировщик Очереди потоков Потоки
  34. 34. Производитель-потребитель 63 http://alice.pnzgu.ru/~dvn/complex/gl5.htm

×