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

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