OberonCore
https://forum.oberoncore.ru/

Coroutines вместо потоков
https://forum.oberoncore.ru/viewtopic.php?f=31&t=5219
Страница 1 из 3

Автор:  Дмитрий Дагаев [ Пятница, 19 Сентябрь, 2014 13:08 ]
Заголовок сообщения:  Coroutines вместо потоков

Статья в объектных системах - 2014 по сопрограммам, как альтернативе потокам.
Пакет для BlackBox/XDS http://sourceforge.net/projects/ta1/files/co2.0/

Вложения:
not_only_threads.pdf [143.73 КБ]
Скачиваний: 633

Автор:  Info21 [ Пятница, 19 Сентябрь, 2014 19:12 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Большое спасибо!

Автор:  Дмитрий Дагаев [ Пятница, 05 Декабрь, 2014 11:08 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Пару ложек дегтя использующим или разрабатывающим сопрограммы
Шиперски писал(а):
The lack of allowing garbage collection while stacks may contain valid pointers, and the impossibility to provide coroutines stacks that are protected against overflows render the coroutine packages less usefull


1. Отсутствует защита от переполнения стека. Не знаю насчет невозможности, но вставлять компилятором ASSERT(SP-initialSP>stacksize) при вызове процедур только приходит в голову.

2. Сборщик мусора, видимо, не анализирует локальные стеки сопрограмм. Если в сопрограмме происходит NEW(ptr), то это может привести к преждевременному освобождению памяти.

У меня в Co эти проблемы не решены.

Илья Ермаков,
думаю стоит обратить на это внимание в Вашей разработке Tasks.

Автор:  Илья Ермаков [ Пятница, 05 Декабрь, 2014 12:26 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

У нас решены обе эти проблемы.

Автор:  Штирлиц [ Четверг, 16 Апрель, 2015 10:42 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

А что это за модуль Tasks?

Автор:  Илья Ермаков [ Четверг, 16 Апрель, 2015 14:27 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Спасибо за вопрос, отвечу в ЛС обязательно в ближайшие пару дней.

Автор:  Иван Кузьмицкий [ Четверг, 16 Апрель, 2015 17:09 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Штирлиц писал(а):
А что это за модуль Tasks?
Присоединяюсь к вопросу :)

Автор:  Илья Ермаков [ Четверг, 16 Апрель, 2015 18:10 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Хорошо :)

Автор:  Дмитрий Дагаев [ Вторник, 28 Март, 2017 20:46 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

У меня была переписка с 08.03.2017 с Josef Templ по поводу пакета Coroutines - Co_, который я разработал и опубликовал в 2014 г
- на CPC: http://www.zinnamturm.eu/downloadsAC.htm#Co_
- на sourceforge http://sourceforge.net/projects/ta1/files/co2.0/
по пакетам лицензионных ограничений нет.

Далее 21.03 появилась заметка "adding Coroutines to BlackBox" в https://forum.blackboxframework.org/viewtopic.php?f=41&t=610.
Сказано, вдохновленный пакетом Co_.
А, поскольку написать прямо в blackboxframework я не могу, я изложу свою позицию здесь, пусть читают по-русски (хорошо бы, Ивану Андреевичу любезно дать им ссылку на этот пост).

1-ADDING COROUTINES TO BLACKBOX https://redmine.blackboxframework.org/issues/156
- звучит неправильно, мой пакет давно добавлен. Другой разрабатывает Josef Templ. Если использует что-то из меня - замечательно.
Но нужно бы написать -
Josef Templ писал(а):
integration into Kernel services such as garbage collection, trap handling and trap cleaners
.
И нужно сделать поддержку со стороны ядра сборку мусора для локальных стеков и очистку трапов. Чтобы работало для всех пакетов. Кстати, есть еще и пакет сопрограмм Ермакова.

2-BASED ON WINDOWS FIBERS
Как справедливо замечено
Иван Денисов писал(а):
Your design is binding BlackBox to Windows OS forever
.
А у меня версия Co_ для BlackBox/XDS Windows/Linux.
И, между прочим, работает на 1 блоке Ростовской АЭС.

3-Есть 2 вида сопрограмм http://wiki.c2.com/?CoRoutine:
1.Anonymous coroutines - переключаются планировщиком для кооперативной многозадачности (Cooperative Multitasking). Они не обмениваются между собой данными. Сопрограмма просто уступает управление командой Yield. А планировщик выбирает, на какую программу переключить.
2.Directed coroutines - Явно осуществляется переход. Используется в генераторах и проч по схеме Transfer - Yield. Как правило, обмениваются между собой данными.
В чем проблема? На рисунке co3.png показано, как переключаются 3 сопрограммы.
Process1 вызывает Process2, Process2 вызывает Process 3, Process 3 вызывает Process 1.
Эта схема работает только, когда процессы не обмениваются данными, т.е. для анонимных сопрограмм.
Для directed coroutines реентерабельность должна быть запрещена.
Правильная последовательность :
Process1(transfer)->Process2(transfer)->Process3(yield)->Process2(yield)->Process1

В пакете Co_ это все реализовано, там есть планировщик со своими примерами и примеры с вызовами одной сопрограммы из другой.

4-a rather complex programming interface
Josef Templ писал(а):
a rather complex programming interface

Я предпочитаю AS SIMPLE AS POSSIBLE, BUT NOT SIMPLER. Простота не за счет исгнорирования проблем.
Был мой пример с SameFringe Problem
Дагаев
Код:
   IMPORT Ct := Co_Tasks, Co := Co_Routines, Log;
   
   TYPE
      Tree = POINTER TO TreeDesc;
      TreeDesc = RECORD
         name: ARRAY 16 OF CHAR;
         left, right: Tree
      END;
      
      Traverse = POINTER TO TraverseDesc;
      TraverseDesc = RECORD (Co.CoroutineDesc)
         tree, leaf: Tree
      END;
      
   PROCEDURE NextTreeLeaves (trav: Traverse; tree: Tree);
   BEGIN
      IF (tree.left = NIL) & (tree.right = NIL) THEN
         trav.leaf := tree;
         Co.Yield
      END;
      IF tree.left # NIL THEN
         NextTreeLeaves (trav, tree.left)
      END;
      IF tree.right # NIL THEN
         NextTreeLeaves (trav, tree.right)
      END;
   END NextTreeLeaves;
      
   PROCEDURE Do (t: Ct.Task);
      VAR trav: Traverse;
   BEGIN
      trav := t(Traverse);
      NextTreeLeaves(trav, trav.tree);
      Co.Stop
   END Do;
   
   PROCEDURE Problem*;
      VAR t1, t2, c1, c2: Tree; r1, r2: Traverse; same: BOOLEAN;
   BEGIN
      (* two trees are different, but have the same fringe: a, b, c *)
      NEW(t1); NEW(c1); t1.left := c1; NEW(c2); c2.name := "a"; c1.left := c2; NEW(c2); c2.name := "b";
      c1.right := c2; NEW(c1); t1.right := c1; NEW(c2); c2.name := "c"; c1.left := c2;
      NEW(t2); NEW(c1); t2.left := c1; NEW(c2); c2.name := "a"; c1.left := c2; NEW(c2); c2.name := "b";
      c1.right := c2; NEW(c1); t2.right := c1; NEW(c2); c1.left := c2;
      NEW(c1); c1.name := "c"; c2.left := c1;
      
      NEW(r1); r1.tree := t1;
      NEW(r2); r2.tree := t2;
      same := TRUE;
      Co.InitCoroutine(r1, Do); Co.InitCoroutine(r2, Do);
      r1.Start(r1); r2.Start(r2);
      WHILE ~r1.eor & ~r2.eor & same DO
         r1.Transfer(r1);
         r2.Transfer(r2);
         same := (r1.leaf.name$ = r2.leaf.name$)
      END;
      IF ~r1.eor OR ~r2.eor THEN same := FALSE END;
      Log.String("tree1(a,b,c) vs tree2(a,b,c): The Same Fringe is"); Log.Bool(same); Log.Ln;
      
      (* modify second, append 'd' *)
      NEW(c2); c2.name := "d"; c1.right := c2;
      same := TRUE;
      Co.InitCoroutine(r1, Do); Co.InitCoroutine(r2, Do);
      r1.Start(r1); r2.Start(r2);
      WHILE ~r1.eor & ~r2.eor & same DO
         r1.Transfer(r1);
         r2.Transfer(r2);
         same := (r1.leaf.name$ = r2.leaf.name$)
      END;
      IF ~r1.eor OR ~r2.eor THEN same := FALSE END;
      Log.String("tree1(a,b,c) vs tree2(a,b,c,d) The Same Fringe is"); Log.Bool(same); Log.Ln;
      
   END Problem;


Появился пример
J.Templ
https://redmine.blackboxframework.org/projects/blackbox/repository/diff?utf8=%E2%9C%93&rev=69c1383cadb025bd8eef4df48aab8fe1ac8bf0c0&rev_to=5ce6ea8c5090b35e4c93b5051e43a03634663ac9

Вложения:
co3.png
co3.png [ 15.24 КБ | Просмотров: 22913 ]

Автор:  Иван Денисов [ Вторник, 28 Март, 2017 21:59 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Дмитрий Викторович, чтобы лучше понять Вас, хочу задать несколько вопросов.

Вам не по душе попытка Йозефа внедрить базовую поддержку сопрограмм в Блэкбокс? Были допущены недопустимые упрощения?

В Вашей реализации выполнение сопрограмм также в одном потоке? Почему вообще эта тема в ветке про "параллельное и многопоточное программирование"?

Замечания по перовому пункту (ADDING COROUTINES TO BLACKBOX).
Вот замечания Темпла "This package, however has a rather complex programming interface and is not integrated with the garbage collector and other Kernel services."
Согласен, что интерфейс очень сложный из-за того, что он не интегрирован, или по другой причине.

По второму (BASED ON WINDOWS FIBERS).
Йозеф отделил по своему логику от реализации. Мне не нравится как это сделано, но так получается наиболее простой интерфейс через наследование как Actions. Реализация вынесена в ядро, что не очень с точки зрения поддержки, но терпимо. Так что отчасти моё замечание снимается.

Какова суть вашего предложения? Ничего не менять и использовать подсистему Co_ ? Что нужно сделать в Блэкбоксе для упрощения подсистемы Co_ ?

Автор:  Иван Денисов [ Вторник, 28 Март, 2017 22:09 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Как я понимаю Йозефа, он делает сейчас какой-то проект с сервером и ему приглянулись сопрограммы для журналирования чего-то. Но цель усилий по внедрению этих возможностей в Блэкбокс — дать кругу пользователей возможность более легко получить опыт использования сопрограмм.

Я например, Вашу подсистему ни за что бы не стал развлечения ради устанавливать. А так может и применю для какого-нибудь некритичного проекта элементы сопрограмм для пробы, получу опыт. После этого возможно будет уже понять лучше подсистему Co_.

Автор:  Дмитрий Дагаев [ Вторник, 28 Март, 2017 22:45 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Иван Денисов писал(а):
Вам не по душе попытка Йозефа внедрить базовую поддержку сопрограмм в Блэкбокс? Были допущены недопустимые упрощения?
Вот замечания Темпла "This package, however has a rather complex programming interface and is not integrated with the garbage collector and other Kernel services."

1. Вообще-то я добавил COROUTINES TO BLACKBOX, а не Templ.

Иван Денисов писал(а):
В Вашей реализации выполнение сопрограмм также в одном потоке? Почему вообще эта тема в ветке про "параллельное и многопоточное программирование"?

2. Co_ есть поддержка кооперативной многозадачности (Cooperative Multitasking), в новом модуле - нет.

Иван Денисов писал(а):
Согласен, что интерфейс очень сложный из-за того, что он не интегрирован, или по другой причине.

3.
Для сопрограмм используются модуль Co_Routines, Co_Tasks.
Для кооперативной многозадачности используется также планировщик SchedTasks.
Остальное - примеры.
И где тут сложность?

Иван Денисов писал(а):
По второму (BASED ON WINDOWS FIBERS).
Йозеф отделил по своему логику от реализации. Мне не нравится как это сделано, но так получается наиболее простой интерфейс через наследование как Actions. Реализация вынесена в ядро, что не очень с точки зрения поддержки, но терпимо. Так что отчасти моё замечание снимается.

4. А у меня так:
BB Win - Windows Fibers
XDS Win/Linux - Modula COROUTINES
BB Linux - ucontext_t
Это - портабельный продукт

Иван Денисов писал(а):
Какова суть вашего предложения? Ничего не менять и использовать подсистему Co_ ? Что нужно сделать в Блэкбоксе для упрощения подсистемы Co_ ?

5. в Kernel нужна поддержка очистки локальных стеков "garbage collector and other Kernel services".
Но: в Kernel не должно быть зашито вызовов Windows Fiber только для модуля J Templ: Kernel.InitCoroutines, Kernel.AddCoroutine, Kernel.SetCoroutineBase, Kernel.RemoveCoroutine, Kernel.TransferCoroutine.
6. Co_ я сам подкручу

Автор:  Дмитрий Дагаев [ Вторник, 28 Март, 2017 22:54 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Иван Денисов писал(а):
Как я понимаю Йозефа, он делает сейчас какой-то проект с сервером и ему приглянулись сопрограммы для журналирования чего-то. Но цель усилий по внедрению этих возможностей в Блэкбокс — дать кругу пользователей возможность более легко получить опыт использования сопрограмм.

Я например, Вашу подсистему ни за что бы не стал развлечения ради устанавливать. А так может и применю для какого-нибудь некритичного проекта элементы сопрограмм для пробы, получу опыт. После этого возможно будет уже понять лучше подсистему Co_.

Кстати, для развлечения там есть:
- Задача обедающих философов,
- Задача писатель - читатель,
- Задача расчетов через Action.

Все это - не дополнительные сложные модули, а Obx-примеры.

И, в отличие от Йозефа, я это уже 3 года как внедрил назад, и в кросплатформенном варианте.

Тема Coroutines очень интересна как стиль программирования. Правда, сам по себе стиль программирования этот сложен, соглашусь. Надо будет рассказать про эти стили на дне Оберона.

Автор:  Дмитрий Дагаев [ Вторник, 28 Март, 2017 23:04 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Жаль связи нету. Вот, например https://forum.blackboxframework.org/viewtopic.php?f=41&t=610&start=20#p5805,
Robert писал(а):
Some time ago I read about Python iterators and the "Yield" statement when trying to solve a problem of this type - I forget the details.
Is the Python "Yield" similar to the BlackBox "Transfer"?

Есть 2 вида сопрограмм http://wiki.c2.com/?CoRoutine
1.Anonymous. По команде Yield управление передается планировщику, который выбирает следующую сопрограмму.
2.Directed. По команде Yield управление передается вызвавшей программе/сопрограмме. Pop по отношению к стеку вызовов.

Команда Transfer - передает управление новой сопрограмме. Push стека вызовов сопрограмм. Для Anonymous не используется.

Автор:  Info21 [ Вторник, 28 Март, 2017 23:36 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Дмитрий Дагаев писал(а):
Надо будет рассказать про эти стили на дне Оберона.
Обязательно надо будет.

Автор:  Info21 [ Вторник, 28 Март, 2017 23:43 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Иван Андреевич, эти модификации ядра ББ -- они будут вшиты для всех? -- или как опция при старом ядре, которое останется как основной вариант?

Хотелось бы второго.
Очень не хочется опасных нагромождений.
В версии от Центра и так уже много каких-то изменений.
(Например, слишком уж навязчиво выглядят значки для Folds.)

Избыточная сложность -- уязвимость.

Автор:  Иван Денисов [ Среда, 29 Март, 2017 01:18 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Есть Блэкбокс, а есть расширения Блэкбокса. Не надо это путать. В Блэкбокс что-то добавить могут только мэйнтэйнеры. Для версии 1.6 это были Оминк, для 1.7 это Центр.
Йозеф не разрабатывает пакет, а интегрирует часть ваших наработок в главный дистрибутив. Не пойму, сознательно ли вы вносите путаницу?

Йозеф добавил, Вас, Дмитрий Викторович, в соавторы, так как почти все позаимствовал у вашей реализации. А то звучит так как будто Вы хотите обвинить Йозефа в воровстве или умалчивании Вашего авторства.

Ваша реализация все-таки не совсем свойственна для КП, в ней явный след Оберона. Desk нет нужды использовать. Примеры с семафорами. Йозеф сознательно упростил все и убрал планировщик, чтобы поддерживать только второй вид сопрограмм (Directed). Возможно это урезанная версия, но зато она простая. С чего-то надо начать.

Автор:  Иван Денисов [ Среда, 29 Март, 2017 01:20 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Цитата:
BB Linux - ucontext_t

Это где-то выложено?

Автор:  Иван Денисов [ Среда, 29 Март, 2017 01:25 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Info21 писал(а):
Иван Андреевич, эти модификации ядра ББ -- они будут вшиты для всех? -- или как опция при старом ядре, которое останется как основной вариант?

Хотелось бы второго.
Очень не хочется опасных нагромождений.
В версии от Центра и так уже много каких-то изменений.
(Например, слишком уж навязчиво выглядят значки для Folds.)

Избыточная сложность -- уязвимость.

Опции - это тоже сложность. Так что планируется без опций. Возможность сопрограмм пока только обсуждается. Но многим пока эта идея нравится несмотря на некоторые риски. Это будет контролируемый эксперимент.

По поводу фолдов - ваше субъективное мнение. Неприятие новых символов символично.

Автор:  Info21 [ Среда, 29 Март, 2017 08:27 ]
Заголовок сообщения:  Re: Coroutines вместо потоков

Иван Денисов писал(а):
Опции - это тоже сложность.
Смотря для кого.

Иван Денисов писал(а):
многим пока эта идея нравится несмотря на некоторые риски.
Меня пугают как раз риски. И так до конца сойти с 1.5 не могу.

Иван Денисов писал(а):
Это будет контролируемый эксперимент.
Кто его будет контролировать?
Вы предлагаете просто верить Вам и Центру.
Центр сделал много хорошего, но пока не прошёл проверку временем в отношении умения удерживать свой энтуазизм, который сейчас, после первых осторожных успехов, очевидно, вырос.
А соблазн лёгкого добавления крутых фич в Оберонах велик.
Если разработчики не видят возражений и возражающих, это не значит, что их нет или не появится, когда незамеченные разработчиками в пылу энтузиазма тонкости вдруг выстрелят на длинных временах.

Иван Денисов писал(а):
По поводу фолдов - ваше субъективное мнение.
Есть, между прочим, законы типографской эстетики, выверенные веками.

А Вы пытаетесь (независимо от осознанного намерения) таким скрытым образом придать объективности Вашему, такому же субъективному мнению.

Меня всё это, признаться, пугает. Бессмысленные эволюции Windows уже разрушили мне тщательно выстроенную личную софтосреду, в которой я работал без сучка и задоринки больше десяти лет. Не хотелось бы повторения с Блэкбоксом.

Центру не следует забывать (а они уже забывают), что опросы пользователей, которые проводил Оминк, на первое, с отрывом, место ставили стабильность Блэкбокса.

Страница 1 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/