Часть 1. Архитектура 30
Глава 2. TM для потоков. 31
Вычисления в потоке 32
- полезная работа- потери времени
Два вида потерь времени 33
1. Поток ждет ответа 34
Эдгар Дейкстра, 1967
Задача о спящем парикмахере 35
Асинхронность
На время ожидания освободить поток, чтобы дать возможность выполнить другую задачу
Что делать? 36
Императивные языки
Vs
Функциональные языки
Жадные операции 37
Почему функциональные языки? 38
int c = 0;for(int i =0; ; ++i){
c += i;}
void print(int i, int *c){
*c += i ;print(i+1, c);
}
Что будет с эффективностью? 39
Что если, ожидание > 50 милисекунд?
Время отклика > 100 милисекунд?
Стайер vs спринтер 40
benchmarksgame.alioth.debian.org 41
benchmarksgame.alioth.debian.org 42
benchmarksgame.alioth.debian.org 43
benchmarksgame.alioth.debian.org 44
while(условие){//тело цикла
Здесь может быть код, который будет передавать эстафету в другой поток вычислений}
Императивность тоже может! 45
А как же эффективность? 46
Philipp Haler, Martin Odersky
Event-Based Programming Without Inversion Control
2006Scala, C# 5 (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); }}
Пример await на C# 47
2. Лишние действия 48
Делегирование
Передать выполнение задач в другой поток
Что делать? 49
Трудоемкость делегируемой задачи vs время на ее передачу
• Чем меньше размер делегируемой задачи, тем ниже КПД (закон Амдала)
• => Запуск потока по требованию – слишком дорогая операция
Ограничения делегирования 50
Количество потоков vs время на управление потоками
• Слишком большое число потоков приводит к потерям производительности
• При небольшом числе потоков количество текущих задач больше числа потоков => нужна очередь задач
Ограничения делегирования 51
Архитектура Fog cutter 52
Gul A. Agha, Karmani 2011
Распространенная архитектура для вычислительных агентов
1. Пул потоков
public static void Main() {ThreadPool.QueueUserWorkItem(
new WaitCallback(ThreadProc)); Thread.Sleep(1000);
} static void ThreadProc(Object stateInfo) { …}
Эволюция асинхронности 53
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");}}
Эволюция асинхронности 54
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); }}
Эволюция асинхронности 55
4. Библиотеки для параллельных циклов и не только
foreach (var item in sourceCollection) { Process(item); } Parallel.ForEach(sourceCollection, item => Process(item));
Эволюция асинхронности 56
Встраивание конструкций в язык
?????par_foreach (var item in sourceCollection) { Process(item); }
Эволюция асинхронности 57
1. Пул потоков2. Асинхронные callback’s3. Оператор await4. Библиотеки для параллельного циклов и не только5. Встраивание конструкций в язык
Эволюция асинхронности 58
Пул потоков 59
http://www.regfordev.com/2010/12/thread-pool.html
Простой пул потоков 60
http://www.regfordev.com/2010/12/thread-pool.html
Пул потоков в .Net 4.0 61
Еще один пул потоков 62
Балансировщик Очереди потоков Потоки
Производитель-потребитель 63
http://alice.pnzgu.ru/~dvn/complex/gl5.htm