OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 05:12

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 55 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения: Re: Coroutines вместо потоков
СообщениеДобавлено: Суббота, 08 Апрель, 2017 13:55 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Дмитрий Дагаев писал(а):
За один цикл таймера Actions можно вызвать один цикл вычислений, как в ObxActions, а можно несколько. Планировщик SchedTasks вызывает фоновую задачу снова и снова, пока есть время до следующего цикла. У меня разница в 400000 раз.
Правильно я понимаю, что это что-то вроде специального фонового Action'а, который добавляет опций управления очередью Экшенов сверх тех, что есть в ББ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Coroutines вместо потоков
СообщениеДобавлено: Воскресенье, 09 Апрель, 2017 11:23 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
Подробнее про ObxActions против Co_ObxActions.
Изначальный пример ObxActions в BlackBox вызывает за один цикл Services.Action (период около 50 миллисекунд) процедуру
Код:
   PROCEDURE Step (VAR cur, divisor: INTEGER; f: TextMappers.Formatter);
      VAR end, sqrtCur: INTEGER;
   BEGIN
      end := divisor + stepSize;
      sqrtCur := SHORT(ENTIER(Math.Sqrt(cur)));
      WHILE (divisor <= sqrtCur) & (divisor < end) & (cur MOD divisor # 0) DO divisor := divisor + 2 END;
      IF divisor > sqrtCur THEN   (* cur is a prime *)
         f.WriteInt(cur); f.WriteLn;
         divisor := 3; cur := cur + 2
      ELSIF divisor < end THEN   (* cur is not a prime, test next one *)
         divisor := 3; cur := cur + 2
      ELSE   (* time exhausted, continue test next time *)
      END
   END Step;

После одной итерации расчетов происходит выход из процедуры, чем завершается содержательная часть (a: PrimeAction) Do.

Пример с Co_ObxActions вызывается планировщиком Co_SchedTasks.
Код:
   PROCEDURE Do (t: Ct.Task) ;
      VAR a: PrimeAction; end, sqrtCur, n: INTEGER;
   BEGIN
      a := t(PrimeAction);
      FOR n := 0 TO a.attempts-1 DO
         a.current := 3; a.divisor := 3;
         REPEAT
            end := a.divisor + stepSize;
            sqrtCur := SHORT(ENTIER(Math.Sqrt(a.current)));
            WHILE (a.divisor <= sqrtCur) & (a.divisor < end) & (a.current MOD a.divisor # 0) DO
               a.divisor := a.divisor + 2
            END;
            IF a.divisor > sqrtCur THEN   (* cur is a prime *)
               IF n = 0 THEN
                  a.f.WriteInt(a.current); a.f.WriteLn
               END;
               a.divisor := 3; a.current := a.current + 2
            ELSIF a.divisor < end THEN   (* cur is not a prime, test next one *)
               a.divisor := 3; a.current := a.current + 2
            END
         UNTIL a.current > a.to;
         Co.Yield
      END;
      Co.Stop
   END Do;

Здесь после каждой итерации вызывается Co.Yield, после чего управление передается планировщику. Планировщик смотрит, есть ли время до следующего цикла. По умолчанию (load_pct - может быть изменено) фоновым задачам отводится до 40% процессорного времени. Если есть время 40% от времени цикла - шаг планировщика повторяется и вновь вызывается задача Do.

Что выяснилось? За время 9 сек на моем компьютере пример ObxActions выполняется 1 раз (Upper Bound= 256), а Co_ObxActions выполняется 400000 раз (Upper Bound= 256, N Attempts= 400000). Значит, фоновая задача в ObxActions использует имеющееся время неэффективно.

Иван Денисов писал(а):
А что тогда происходит во время срабатывания следующего цикла? Возврат в главную сопрограмму?

Каждый цикл Action вызывает планировщик Co_SchedTasks
Код:
   PROCEDURE (a: Action) Do ();
   BEGIN
      IF a.s.enabled THEN
         a.s.Step(a.s); Services.DoLater(a, a.s.p.interval)
      END
   END Do;

А Step планировщика передает управление сопрограммам и получает управление назад, когда те делают Co.Yield.

Info писал(а):
Правильно я понимаю, что это что-то вроде специального фонового Action'а, который добавляет опций управления очередью Экшенов сверх тех, что есть в ББ?

Один Action, на нем висит планировщик, он управляет очередью сопрограмм.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Coroutines вместо потоков
СообщениеДобавлено: Воскресенье, 09 Апрель, 2017 17:17 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Спасибо, попытаюсь понять.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Coroutines вместо потоков
СообщениеДобавлено: Воскресенье, 09 Апрель, 2017 18:19 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
Если совсем простым языком, 2 варианта работы в фоновом режиме.
1. ObxActions - Вы пришли ночью накопать червей для утренней рыбалки. Много не накопаете - коробочку, и можно уходить.
2. Co_ObxActions - Вы работаете ночью под руководством "Планировщика" на сборе овощей, которому передаете ящик овощей за ящиком, пока он не скажет: Все, рабочий день окончен.
Во втором случае наработаете больше (только про физическую работу).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Coroutines вместо потоков
СообщениеДобавлено: Воскресенье, 09 Апрель, 2017 22:33 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Фу, червяки )) Даже уклейку ловлю активно, ультралайтом ))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Coroutines вместо потоков
СообщениеДобавлено: Понедельник, 10 Апрель, 2017 11:01 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 592
Info21 писал(а):
Фу, червяки )) Даже уклейку ловлю активно, ультралайтом ))

Динамит (: "Пять карасей и два водолаза"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Coroutines вместо потоков
СообщениеДобавлено: Понедельник, 10 Апрель, 2017 14:28 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Поглядите, пожалуйста, вот такую организацию встроенной поддержки сопрограмм:
http://blackboxframework.org/unstable/i ... a1.843.zip

Это пока без обсуждения странной версии планировщика Йозефа.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Coroutines вместо потоков
СообщениеДобавлено: Понедельник, 10 Апрель, 2017 14:43 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
На самом деле странно, что вы сравниваете тогда их. Вроде как Actions и не задуманы как непрерывные задачи... это просто отложенные действия и они не должны как-то эффективно использовать фоновое время. Предполагается, что все это время занимает основная программа Блэкбокса. Поэтому получается некая подозрительная спекуляция при сравнении.

Но в целом вещь крайне полезная. Начинаю въезжать потихоньку. Раньше приходилось в интенсивные вычисления самому вставлять обработку сообщений, чтобы GUI не зависал.
Код:
   PROCEDURE ProcessMessages;
      VAR msg: Win.MSG; res: INTEGER;
   BEGIN
      WHILE Win.PeekMessage(msg, 0, 0, 0, Win.PM_REMOVE) # 0 DO
         res := Win.TranslateMessage(msg); res := Win.DispatchMessageA(msg)
   END END ProcessMessages;

Кажется это Александр Ильин когда-то предложил, если не ошибаюсь.

Либо надо было еще ставить Services.actionHook.Step; в цикл своих долгих вычислений, чтобы остальные события отложенные тоже выполнялись.

Это была такая творческая ручная балансировка. А так получается, что возможно все автоматизировать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Coroutines вместо потоков
СообщениеДобавлено: Понедельник, 10 Апрель, 2017 23:08 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
Иван Денисов писал(а):
На самом деле странно, что вы сравниваете тогда их. Вроде как Actions и не задуманы как непрерывные задачи... это просто отложенные действия и они не должны как-то эффективно использовать фоновое время. Предполагается, что все это время занимает основная программа Блэкбокса. Поэтому получается некая подозрительная спекуляция при сравнении.

Заметьте, не я это предложил
Overview by Example: ObxActions писал(а):
This example demonstrates how background tasks can be implemented using actions. An action is an object which performs some action later when the system is idle, i.e., between user interactions. An action can be scheduled to execute as soon as possible, or after some time has passed. Upon execution, an action may re-schedule itself for a later point in time. In this way, an action can operate as a background task, getting computation time whenever the system is idle. This strategy is called cooperative multitasking.

Неверно, не фоновый процесс и не кооперативная многозадачность. Да, это просто отложенные действия и они не используют эффективно фоновое время.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Coroutines вместо потоков
СообщениеДобавлено: Вторник, 11 Апрель, 2017 09:33 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
Иван Денисов писал(а):
Поглядите, пожалуйста, вот такую организацию встроенной поддержки сопрограмм:
http://blackboxframework.org/unstable/i ... a1.843.zip

Это пока без обсуждения странной версии планировщика Йозефа.


Примерно да. У меня была версия под 1.6, недоделанная, которую я направлял Йозефу. Если интересно, пришлите email-адрес в личку, направлю.
Йозеф настаивает на своем, даже пропатчил Co_ своими вызовами. Интерфейсно нормально, но развивать проще, когда стеки отдельно, а Host Coroutines отдельно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Coroutines вместо потоков
СообщениеДобавлено: Понедельник, 19 Июнь, 2017 20:32 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
В сборку OberonCore вошёл вариант изменений в ядро из нашей платформы приложений.

viewtopic.php?f=116&t=6070

Итого, третий вариант? Ппц. )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Coroutines вместо потоков
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 17:36 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
Доклад на дне Оберона "Сопрограммы и кооперативная многозадачность" https://forum.oberoncore.ru/viewtopic.php?f=127&t=6091&p=101972#p101972
Видео доклада https://www.youtube.com/watch?v=oo2ZhZHSDNg&list=PLoKr-_Vv5yq7Hdxq1edBtyxvkTehP4t09&index=2


Последний раз редактировалось Дмитрий Дагаев Воскресенье, 01 Октябрь, 2017 19:55, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Coroutines вместо потоков
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 18:22 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 583
Откуда: Москва
Последняя версия Co_ для BlackBox обновлена у H.Zinn http://www.zinnamturm.eu/downloadsAC.htm#Co_
Внимание!
Если вы ставите ее с BB 1.7.1, т.е. модифицированным J.Templ ядром, то ставьте без изменений.
Если вы ставите ее с BB ранее, чем 1.7.1, то перед компиляцией скопируйте Routines6.odc в Routines.odc.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Coroutines вместо потоков
СообщениеДобавлено: Среда, 04 Октябрь, 2017 13:51 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1134
Откуда: СССР v2.0 rc 1
Да, смотрел доклад. Согласен, что лезть в ядро -- очень сомнительное занятие.
Чем оно меньше, тем лучше во всех смыслах. Завтра кто-то пожелает перетащить ББ под Андроид, а там "всё не так". Опять ядро кромсать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Coroutines вместо потоков
СообщениеДобавлено: Суббота, 10 Февраль, 2018 21:34 

Зарегистрирован: Среда, 31 Январь, 2018 19:54
Сообщения: 244
Дмитрий Дагаев писал(а):
... Кстати, для развлечения там есть:
- Задача обедающих философов, ...

Спасибо!!!
эта задача вряд ли для развлечений, скорее тестовый эталон.

Если кто-то не сталкивался, то можно почитать в книге "Взаимодействующие последовательные процессы" Х.Хоар Мир 1989 год стр. 69
Книга доступна в Интернете для скачивания.
Ещё интересный пример на эту тему в Главе 6 Планирование ресурсов - Алгоритм поликлиники.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 55 ]  На страницу Пред.  1, 2, 3

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB