3. Сопрограммы
„ Подпрограммы – это частные случаи более общих программных
компонентов, называемых сопрограммами. В противоположность
нессиметричной связи между главной программой и подпрограммой, между
сопрограммами, которые вызывают одна другую, существует полная
симметрия. “
Д.Кнут, «Искусство программирования»
30. Параллельная обработка данных
✔ Написание программы в синхронном
(интуитивном) стиле
p1 = connect(); ✔ Поддежка многоядерных систем
read(p1, buff);
p2 = connect();
write(p2, buff);
31. Параллельная обработка данных
✔ Написание программы в синхронном
(интуитивном) стиле
p1 = connect(); ✔ Поддежка многоядерных систем
read(p1, buff); ✗ Проблемы синхронизации
p2 = connect(); ✗ Число потоков сильно ограничено
write(p2, buff);
33. Параллельная обработка данных
Reactor I/O
✔ Однопоточность - нет проблем
while(true) синхронизации
{
✔ Поддержка новой задачи дешевле
e = r.events.dequeue(); создания потока
r.dispatch(e);
}
read_h(...)
{
read(s,buff)
}
r.registerHandler(
connect_h(...)
events::Read, {
read_h);
}
34. Параллельная обработка данных
Reactor I/O
✔ Однопоточность - нет проблем
while(true) синхронизации
{
✔ Поддержка новой задачи дешевле
e = r.events.dequeue(); создания потока
r.dispatch(e);
✗ Большую задачу приходится разбивать на
} множество мелких.
✗ Одна задача может повесить всю систему
read_h(...)
{
read(s,buff)
}
r.registerHandler(
connect_h(...)
events::Read, {
read_h);
}
36. Параллельная обработка данных
Proactor I/O
✔ Однопоточность - нет проблем
while(true) синхронизации
{
✔ Поддержка новой задачи дешевле
e = r.events.dequeue(); создания потока
r.dispatch(e);
✔ Одновременное выполнение кода и
} выполнение операций I/O
read_h(...)
{
}
read(s, read_h, buff); connect_h(...)
{
}
37. Параллельная обработка данных
Proactor I/O
✔ Однопоточность - нет проблем
while(true) синхронизации
{
✔ Поддержка новой задачи дешевле
e = r.events.dequeue(); создания потока
r.dispatch(e);
✔ Одновременное выполнение кода и
} выполнение операций I/O
✗ Необходимость управлять буферами
read_h(...)
{
}
read(s, read_h, buff); connect_h(...)
{
}
55. Boost.Asio
Асинхронное программирование (в частности паттерны Reactor и
Proactor) требует чтобы задача, пусть и не сложная, была разбита на
несколько подзадач. Иногда такое деление неприемлимо,
трудозатратно и делает логику в целом трудной для понимания.
Есть ли выход?
Представим себе алгоритм описанный как синхронный, но
работающий асинхронно. Что-то способное приостанавливать свое
выполнение и продолжать его позже.
Например – сопрограмма.
58. Синхронное асинхронно
Реализации сопрограмм для С++
strcpy(to, from, count) Безстековые сопрограммы
register char *to, *from; (протопотоки)
register count;
{
register n = (count + 7) / 8;
if (!count) return;
switch (count % 8) {
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while (--n > 0);
}
}
Устройство „Даффа“
59. Синхронное асинхронно
Реализации сопрограмм для С++
Стековые сопрограммы
● POSIX ucontext;
● Windows fibers (легковесные потоки);
● Платформенно зависимые игры со стеком через asm.
60. Синхронное асинхронно
Реализации сопрограмм для С++
Стековые сопрограммы
● POSIX swapcontext;
● Windows fibers (легковесные потоки);
● Платформенно зависимые игры со стеком через asm.
Существующие:
● Boost.Coroutines ● Coro
● Boost.Context ● LibCoroutine
● LibCoro
● State threads
61. Синхронное асинхронно
Boost.Coroutines:
● Stackfull сопрограммы
● Cимметричные/асимметричные сопрограммы
● Основа библиотеки – класс coroutine
● Сопрограммы разделены на тело (ф-цию) и состояние
● Не развивается с 2009 года
64. Синхронное асинхронно
Boost.Context:
● Stackfull сопрограммы
● Cимметричные/асимметричные сопрограммы
● Основа библиотеки – класс context
● Библиотека общего назначения, на ее основе разрабатывается функционал
boost.Fibers, „продолжений“ и генераторов (enumeration)
● С весны 2011 года находится на ревью по включению ее в состав Boost.
70. Сопрограммы:
✔ Сокращение числа обработчиков, упрощение логики;
✔ Сохранение в некоторой мере синхронного стиля написания в
асинхронной модели;
71. Сопрограммы:
✔ Сокращение числа обработчиков, упрощение логики;
✔ Сохранение в некоторой мере синхронного стиля написания в
асинхронной модели;
✗ Отсутствие поддержки в языке;
✗ Сложность реализации;
✗ Подверженность ошибкам;