OberonCore
https://forum.oberoncore.ru/

Оберон против Си и Си++, часть 2
https://forum.oberoncore.ru/viewtopic.php?f=61&t=6683
Страница 4 из 5

Автор:  adimetrius [ Вторник, 08 Декабрь, 2020 22:24 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

arlean1 писал(а):
"Особенность потоков эрланг в том, что они легковесные. Это значит, что они:

быстро стартуют и завершаются;
быстро переключаются;
потребляют мало памяти.

А я думал это про активные объекты А2. Не?

Автор:  budden [ Вторник, 08 Декабрь, 2020 23:14 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

arlean1 писал(а):
Цитата:
...Изменяемый и не принадлежит одному потоку.

Вы все сравниваете с С++ ))) Для многоядерных архитектур он отстой.

Я не сравниваю. Я просто отметил, что не все задачи могут быть решены при любом одном подходе к параллельности. Ну т.е. можно, конечно, попробовать ввести сущность "мастер унитаза" со своим потоком. Тогда возникает вопрос, иммутабельны ли "данные", которыми обмениваются клиенты унитаза с мастером унитаза. У меня в их иммутабельности есть какие-то сомнения. Я не ругаю Эрланг в общем-то, просто призываю отказаться от надежды найти серебряную пулю в том, что касается параллельности. Нужен какой-то серебряный арсенал, а не одна пуля.

Автор:  budden [ Вторник, 08 Декабрь, 2020 23:15 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

adimetrius писал(а):
arlean1 писал(а):
"Особенность потоков эрланг в том, что они легковесные. Это значит, что они:

быстро стартуют и завершаются;
быстро переключаются;
потребляют мало памяти.

А я думал это про активные объекты А2. Не?

Я так понимаю, что активные объекты A2 "ещё легковеснее", т.к. у них нет своей кучи. Но в этом же и минус их. Я, правда, честно сказать, не знаю, не создаётся ли тред на каждый активный объект, но я думаю, это не так сложно поменять в ядре. Можно спросить у Сергея, когда он будет выступать, хотя это наверняка где-то написано. Уж в кооперативной-то версии точно есть "легковесные" активные ообъекты.

Автор:  arlean1 [ Среда, 09 Декабрь, 2020 01:02 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

budden писал(а):
adimetrius писал(а):
arlean1 писал(а):
"Особенность потоков эрланг в том, что они легковесные. Это значит, что они:

быстро стартуют и завершаются;
быстро переключаются;
потребляют мало памяти.

А я думал это про активные объекты А2. Не?

Я так понимаю, что активные объекты A2 "ещё легковеснее", т.к. у них нет своей кучи. Но в этом же и минус их. Я, правда, честно сказать, не знаю, не создаётся ли тред на каждый активный объект, но я думаю, это не так сложно поменять в ядре. Можно спросить у Сергея, когда он будет выступать, хотя это наверняка где-то написано. Уж в кооперативной-то версии точно есть "легковесные" активные ообъекты.


Вот здесь более подробно написано об устройстве потоков в Erlang:
https://club.cnews.ru/blogs/entry/import_erlang_v_internetproektah_a49b

А в статье, которая цитировалсь ранее:
https://queue.acm.org/detail.cfm?id=3212479
Цитата:
SVE от ARM (Scalar Vector Extensions) - и аналогичная работа из Berkeley 4 - дает еще один взгляд на лучший интерфейс между программой и оборудованием. Обычные векторные единицы предоставляют векторные операции фиксированного размера и ожидают, что компилятор попытается сопоставить алгоритм с доступным размером единицы. В отличие от этого, интерфейс SVE ожидает, что программист описывает степень доступного параллелизма, и полагается на оборудование, чтобы сопоставить его с доступным количеством исполнительных блоков. Использовать это из C сложно, потому что автовекторизатор должен вывести доступный параллелизм из циклических структур. Сгенерировать код для него из операции сопоставления в функциональном стиле тривиально: длина сопоставленного массива - это степень доступного параллелизма.

Кеши большие, но их размер - не единственная причина их сложности. Протокол согласования кэша - одна из самых сложных частей современного ЦП, которую нужно сделать как быстрой, так и правильной. Большая часть сложности возникает из-за поддержки языка, в котором данные должны быть как общими, так и изменяемыми, как само собой разумеющееся. Рассмотрим для сравнения абстрактную машину в стиле Erlang, где каждый объект является либо локальным для потока, либо неизменяемым (в Erlang есть упрощение даже для этого, где есть только один изменяемый объект на поток). Протокол согласованности кэша для такой системы будет иметь два случая: изменяемый или совместно используемый. Программный поток, переносимый на другой процессор, потребует явной недействительности кэша, но это относительно необычная операция.

Неизменяемые объекты могут еще больше упростить кеширование, а также удешевить некоторые операции. Проект Sun Labs Максвелл отметил, что объекты в кэше и объекты, которые будут размещены в молодом поколении, имеют почти одинаковый набор. Если объекты мертвы до того, как их нужно удалить из кеша, то никогда не записывать их обратно в основную память можно сэкономить много энергии. Project Maxwell предложил сборщик мусора (и распределитель) молодого поколения, который работал бы в кеше и позволял бы быстро перерабатывать память. С неизменяемыми объектами в куче и изменяемым стеком сборщик мусора становится очень простым конечным автоматом, который легко реализовать на оборудовании и позволяет более эффективно использовать относительно небольшой кеш.

Автор:  Борис Рюмшин [ Среда, 09 Декабрь, 2020 12:47 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

В Эрланге многое проще организуется ввиду того, что он виртуальную машину из себя представляет.

Автор:  arlean1 [ Четверг, 10 Декабрь, 2020 01:19 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

А вот такой подход пригодится для Оберона?
https://askdev.ru/q/erlang-na-mnogoyade ... re-191937/
Цитата:
поведение по умолчанию Erlang исторически заключалось в запуске одного планировщика, который в основном является родным потоком ОС, который выбирает задачи Erlang для запуска из очереди. С появлением многоядерных и многопроцессорных систем среда выполнения была расширена, чтобы воспользоваться преимуществами. Запуск среды выполнения с помощью -smp enabled заставит среду выполнения создать несколько планировщиков, обычно по одному на логический процессор. Вы можете вручную указать количество планировщиков с -S флаг например -S 16.

это описано в Erlang Run-Time System Справочное Руководство.

более глубокое обсуждение поддержки SMP можно найти в этой теме.


Я должен также отметить, что, начиная с R12B, SMP включен по умолчанию на платформах, которые его поддерживают (эквивалентно -smp auto флаг). Если вам интересно узнать о вашей собственной среде выполнения, приведенная ниже цитата из потока обсуждения будет интересно:

"... вы можете увидеть, что было выбрано в первой строке распечатки из команда "Ерл". Например. Erlang (BEAM) emulator версия 5.6.4 [источник] [smp:4] [asynch-потоки:0] .....

"[smp:4]" выше говорит, что SMP VM запущен и с 4 планировщиками".

Автор:  arlean1 [ Четверг, 10 Декабрь, 2020 01:41 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

https://itc.ua/articles/yazyk_erlang_i_ ... rov_26721/
Цитата:
История знает много примеров решений, которые опередили свое время и, не получив признания современности, отправлялись пылиться на полку. Сегодня IT-индустрия переживает очередной виток развития, вызванный переходом к многоядерным микропроцессорам, и сталкивается с новыми проблемами – например, рост количества ядер центрального процессора совсем не приводит к пропорциональному увеличению скорости исполнения приложений на нем. Быть может, наилучшее решение этой проблемы следует искать не в новых методах оптимизации прикладных программ, а в радикальной смене парадигмы программирования, оживив ранее забытые проекты?

На самом деле системы на Erlang вовсе не масштабируемые и не надежные. Это системы на Java такие. Системы на Erlang просто непробиваемы как скалы.

Вячеслав Ахмечет, Functional Programming For The Rest of Us

Автор:  Rifat [ Четверг, 10 Декабрь, 2020 14:33 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

В предыдущих Oberon Day я рассказывал про то, какая есть простая модель параллельности. Она масштабируемая: может работать с любым количеством потоков. Простая для понимания, что соотносится с Oberon Way. И ее по сути можно реализовать на любом Обероне, если доработать сборщик мусора. Если выделять динамическую память в параллельной программе не требуется, то можно и сборщик мусора не дорабатывать.

Автор:  budden [ Четверг, 10 Декабрь, 2020 17:36 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

А это интерес практический или просто в рамках общей дискуссии?

Автор:  arlean1 [ Четверг, 10 Декабрь, 2020 21:32 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

budden писал(а):
А это интерес практический или просто в рамках общей дискуссии?

Практический.
+ Если добавить к вашему списку преимуществ:
Rifat писал(а):
... есть простая модель параллельности. Она масштабируемая: может работать с любым количеством потоков. Простая для понимания, что соотносится с Oberon Way.

Есть, конечно, пример с библиотекой mpich, но в её внутренности не влезешь. Пробовал с ней работать, но успехи не такие впечатляющие, как ожидал.

Автор:  arlean1 [ Четверг, 10 Декабрь, 2020 21:48 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

Rifat писал(а):
В предыдущих Oberon Day я рассказывал про то, какая есть простая модель параллельности. Она масштабируемая: может работать с любым количеством потоков. Простая для понимания, что соотносится с Oberon Way. И ее по сути можно реализовать на любом Обероне, если доработать сборщик мусора. Если выделять динамическую память в параллельной программе не требуется, то можно и сборщик мусора не дорабатывать.

ссылку не уточните?

А что надо доделать в сборщике мусора?

Автор:  Rifat [ Четверг, 10 Декабрь, 2020 22:38 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

arlean1 писал(а):
ссылку не уточните?

https://www.youtube.com/watch?v=M0uvLtP7Gjg
https://www.youtube.com/watch?v=IV3Ewv82Zq4

arlean1 писал(а):
А что надо доделать в сборщике мусора?

Обычный сборщик мусора в Обероне не рассчитан на то, что его могут одновременно вызывать из разных потоков. Поэтому необходимо, чтобы в каждом компоненте параллельной программы был свой сборщик мусора, который работает со своим куском памяти.

Автор:  budden [ Пятница, 11 Декабрь, 2020 03:49 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

В целом я хочу сделать такое в ЯОС. В "активном обероне" уже есть хорошие предпосылки для этого. Сделать, кажется, можно. Но проект ЯОС начинается с перевода на русский язык, этот этап далёк от завершения, требует больших трудозатрат, а для многих неприемлемо использовать русский язык для программирования. Можно вернуться к вопросу, когда (если) перевод удастся достаточно продвинуть, чтобы было возможно приступить к такой задаче. Кому русский язык неприемлем или некогда ждать - можете сами взять A2 и покопаться в нём.

Автор:  arlean1 [ Суббота, 12 Декабрь, 2020 10:04 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

Rifat писал(а):
arlean1 писал(а):
ссылку не уточните?

https://www.youtube.com/watch?v=M0uvLtP7Gjg
https://www.youtube.com/watch?v=IV3Ewv82Zq4

arlean1 писал(а):
А что надо доделать в сборщике мусора?

Обычный сборщик мусора в Обероне не рассчитан на то, что его могут одновременно вызывать из разных потоков. Поэтому необходимо, чтобы в каждом компоненте параллельной программы был свой сборщик мусора, который работает со своим куском памяти.

Спасибо, Рифат!
В одном из докладов вы говорите, что начали реализацию по своей программе. Планируете что-то разместить на https://oberon.org/ ?

Автор:  budden [ Суббота, 12 Декабрь, 2020 17:43 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

Кстати, надо вернуться к вопросу об унитазе. Как в такой программе, где у каждого потока своя куча, работать с журналом отладки, например? Видимо, это стоит сделать в отдельной теме, если есть желание, и даже не в этом форуме.

Автор:  Trurl [ Суббота, 12 Декабрь, 2020 19:01 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

budden писал(а):
Кстати, надо вернуться к вопросу об унитазе. Как в такой программе, где у каждого потока своя куча, работать с журналом отладки, например?

Совсем же просто: чья куча, тот и смыл. А вот если куча общая, поди договорись.

Автор:  budden [ Суббота, 12 Декабрь, 2020 19:15 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

Т.е. если я хочу написать в общий журнал, я копирую все свои данные в буфер обмена и отправляю их сообщением менеджеру системного журнала. И возникает ряд проблем, например, вывод сообщения подразумевает обмен цепочкой сообщений, а не одним сообщением, если текст не влезает в буфер, разрыв сообщений. Дальше может возникнуть нарушение последовательности событий, подвисание всей системы на время вывода сообщения от одного потока, разрыв сообщения, дедлок с участием менеджера лога, отсутствие гарантии доставки сообщения и много чего другого интересного. Или же файловая система без динамической памяти - тоже не сахар.

Автор:  arlean1 [ Суббота, 12 Декабрь, 2020 22:32 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

budden писал(а):
Т.е. если я хочу написать в общий журнал, я копирую все свои данные в буфер обмена и отправляю их сообщением менеджеру системного журнала. И возникает ряд проблем, например, вывод сообщения подразумевает обмен цепочкой сообщений, а не одним сообщением, если текст не влезает в буфер, разрыв сообщений. Дальше может возникнуть нарушение последовательности событий, подвисание всей системы на время вывода сообщения от одного потока, разрыв сообщения, дедлок с участием менеджера лога, отсутствие гарантии доставки сообщения и много чего другого интересного. Или же файловая система без динамической памяти - тоже не сахар.

Все сообщения в модели Рифата - это ведь все сообщения, которые передаются со всех потоков - вы их имееете в виду?
- здесь возможно просто переполнение буфера. Если это возможно, то нужно предусмотреть режим отладочной работы, когда при приближении к "барьеру" переполнения буфера, менеджер системного журнала, посылает сообщения о приостановке всем потокам, которые шлют сообщения - остановки до момента освобождения буфера (кэша ). Это, конечно, замедлит работу, но зато будет надёжно и выявит поток, который продолжает слать сообщения .

Автор:  budden [ Воскресенье, 13 Декабрь, 2020 01:12 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

Я имею в виду лишь то, что лог отладки не будет работать достаточно хорошо в этой модели, т.к. отправитель будет отделён от получаетеля. А как это на самом деле надо организовывать - я не знаю, с таким способом организации многопоточности не сталкивался, на эрланге не писал. Один раз почти столкнулся, но дойти до конца не довелось.

Автор:  Rifat [ Воскресенье, 13 Декабрь, 2020 20:17 ]
Заголовок сообщения:  Re: Оберон против Си и Си++, часть 2

По поводу журнала. Если несколько параллельных компонентов будут писать в один и тот же журнал, то, конечно, они будут смешаны в этом журнале. Но, если все это будет аккуратно записано, то почему бы и нет, например:
Время1;Компонент1;Сообщение
Время2;Компонент2;Сообщение
Время3;Компонент1;Сообщение
Время4;Компонент3;Сообщение
и т.д.
По поводу переполнения буфера. В простейшем случае никакого переполнения нет, так как и буфера нет. Посылка сообщения происходит только в том случае, если один компонент хочет послать сообщение, а другой готов принять сообщение. Если добавить буфер, то можно сгладить некоторые моменты, когда одному компоненту нужно быстро записать сообщение и продолжить работу, а компонент, который пишет в журнал занят записью другого сообщения. При этом буфер будет работать как отдельный компонент параллельной программы.
Может быть проблема, если сообщение настолько большое, что оно не вмещается в пересылаемое сообщение, тогда надо пересылать это сообщение несколько раз. И на этот случай надо добавить некоторые адреса компонентам, чтобы в этом случае журнал ожидал продолжения сообщения только от заданного компонента, иначе части сообщений перемешаются.

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