Для отмены генерации акторов во время работы модели применяются


Подборка по базе: Высшая нервная деятельность и сенсорные системы.docx, 4. Паттерны и фреймворки в архитектуре информационных систем.pdf, Паспортная система Российской Федерации.pptx, магнитный поток ..pptx, Доклад. Основные правовые системы современности.docx, совершенствование систем оплаты труда на прдприятии.docx, Методы и средства проектирования информационных систем и техноло, загрузочные системы.docx, Темы рефератов по дисциплине ЭБ в системе ЭН.pdf, Контрактная система РФ (практика).docx


Моделирование систем (обучение)

  1. Поток … можно считать простейшим (множественный выбор)
  1. Поездов метрополитена
  2. Пациентов поликлиники
  3. Пассажиров к билетной кассе
  1. Узлы pay, rent down … (одиночный выбор)
  1. Нельзя использовать для реализации иерархических моделей
  2. Применяются для построения моделей однотипных процессов
  3. Не запоминают точки возврата отдельных акторов на верхний слой
  4. Не допускают перемещений акторов на другие уровни модели
  1. Значение случайной величины, равномерно распределенной в произвольном интервале, получается на основе применения … (одиночный выбор)
  1. Метода обратной функции
  2. Псевдослучайного числа, равномерно распределенного в интервале (0,1)
  3. Перехода к выборке из массива неслучайных чисел

4. Размеченный граф состояний и переходов марковского процесса содержит …(множественный выбор)

1)узлы, означающие состояния процесса

2)стрелки, означающие возможность переходов процесса в другие состояния из данного состояния3)стрелки, означающие возможность перехода процесса в то же состояние4) надписи со значениями вероятностей перехода в другие состояния из данного состояния5)надписи со значениями вероятностей перехода в то же состояние

5. Максимальная точность результатов моделирования, выраженная в числе знаков после запятой, равна … (одиночный выбор)

1)двум

2) четырем

3)шести

4)восьми

6. Система массового обслуживания с очередью характеризуется такими показателями, как … (множественный выбор)

1)среднее время ожидания заявки

2)средняя длина очереди3)относительная пропускная способность4)абсолютная пропускная способность

7. Событий алгоритм моделирования целесообразно применять, когда … (одиночный выбор)

1)строится модель производственных процессов в реальном времени

2)требуется максимальная эффективность выполнения программной модели для проведения исследований

3)моделируются только процессы с дискретным временем

4)моделируются только процессы с непрерывным временем

8. Закон и параметры распределения времени обдумывания пользователем ответа системы на его запрос обычно задаются в … (множественный выбор)

1)параметрах акторов, имитирующих пользователей2)узлах serve, имитирующих работу пользователей

3)глобальных переменных модели

4)локальных переменных модели

9. Процесс называется марковским, если вероятность перехода в новое состояние .. (одиночный выбор)

1)не зависит ни от текущего состояния, ни от всех предшествующих

2)зависит только от всех предшествующих состояний

3)зависит только от текущего состояния

4)является функцией от номера перехода

10. Недостатком метода обратной функции является … (одиночный выбор)

1)малая точность получаемого результата

2)большой объем вычислений, необходимых для нахождения результата

3)сложность нахождения аналитического решения уравнения для случайной величины

4)ограничение на количество получаемых значений

11. Метод статистических испытаний применяется, если … (одиночный выбор)

1) требуется получить высокую точность

2) неизвестны внутренние взаимодействия в исследуемой системе

3) отсутствуют другие методы решения задачи

4) необходимо сократить общее время моделирования

12. Декомпозиция в системе Pilgrimпредставляет собой … (одиночный выбор)

1)детализацию узла графа модели в виде совокупности других узлов

2)изучение узла графа модели путем разработки и прогонов другой модели

3)разбиение множества входных параметров на иерархические подмножества

4)разбиение множества выходных параметров на иерархические подмножества

13. Для отмены генерации акторов во время работы модели применяются … (одиночный выбор)

1)проверки, проводимые при помощи конструкций С++

2)сигнальная функция customize

3)параметры узла term

14. Траекторию полета ракеты в системе автоматизированного контроля целесообразно описывать с помощью модели (одиночный выбор)

1)структурной

2)табличной

3)текстовой

4)аналитической

5)графической

15. Программная модель, построенная на основе компилятора, по отнощению к модели, построенной на основе интерпреатора, … (множественный выбор)

1)имеет большее быстродействие

2)требует меньше памяти3)выполняется в рабочей среде компилятора

16. Требованию адекватности отвечает любая … (одиночный выбор)

1) натурная модель

2)математическая модель

3) полунатурная модель

4)модель, прошедшая проверку своей обоснованности

17. Результатом применения методологии структруного анализа является .. модель (одиночный выбор)

1) сетевая

2) линейная

3) иерархическая

4)несвязанная

18. Файл, сгенерированный конструктором Gem, представляет собой .. (одиночный выбор)

1) исполнительный модуль программной модели

2) исходный модуль на языке С++

3) исходный модуль на специальном языке

19. Интенсивностью потока называется … число заявок в потоке в единицу времени (одиночный выбор)

1)среднее

2)максимально возможное

3)минимально возможное

20. Основное достоинство метода Монте-Карло – это его… (одиночный выбор)

1)простота реализации

2)универсальность

3)вычислительная эффективность

21. Для моделирования работы предприятия с учетом как материальных, так и финансовых потоков целесообразно использовать … (одиночный выбор)

1)модель системной динамики

2)имитационную модель с пошаговым механизмом

3)имитационную модель с событийным механизмом

4)модель теории массового обслуживания

22. Граф состояний и переходов одноканальной системы массового обслуживания с отказами содержит … (одиночный выбор)

1)один узел

2)два узла

3)три узла

4)четыре узла

23. В простейшем потоке … (множественный выбор)

1) интервал между требованиями имеет нормальное распределение

2)отсутствует последействие3)соблюдается свойство ординарности

24. Методология структурного анализа представляет собой … (одиночный выбор)

1)рассмотрение множества показателей модели на основе выделения логически связанных их подмножеств

2)проектирование системы путем выделения ее подсистем и их последовательного рассмотрения

3)замену динамической модели процессов структурно связанным набором функциональных моделей

25. Узел parent … (одиночный выбор)

1) осуществляет вставку в модель узлов, указанных в его параметрах

2)используется для повышения быстродействия программы

3)не выполняет никаких действий и при генерации программного кода просто заменяется своей декомпозицией

4)применяется для управления прохождением акторов по графу модели

26. В имитационных моделях … (одиночный выбор)

1) имитируются только входные и выходные потоки заявок

2)воспроизводятся процессы функционирования исследуемой системы с соблюдением логической и временной последовательности

3)моделируется прохождение через исследуемую систему только одной ззаявки

4) используется физические свойства исследуемой системы

27. Относительная пропускная способность системы массового осблуживания с отказами означает … (одиночный выбор)

1) реальную эффективность системы по сравнению с максимально возможной

2)долю обслуженных заявок из общего числа проходящих в систему

3)число обслуженных заявок за некоторый период наблюдения

4)число обслуженных заявок за единицу времени

28. Отнесение признака объекта к существенным определяется … (одиночный выбор)

1)целями моделирования

2)степенью сложности объекта

3)размерами объекта

4)типом структуры объекта

29. Формула Хинчина-Поллачека позволяет найти … (одиночный выбор)

1)среднее число занятых каналов обслуживания

2) интенсивность выходящего потока

3)среднюю длину очереди заявок

4)приоритетность обслуживания заявок

30. Для имитации пользователя или пользователей в моделях замкнутых систем используется узел … (одиночный выбор)

1)serve

2) queue

3)key

4)create

31. Простейшим называется поток, обладающий такими свойствами, как … (множественный выбор)

1)стационарности2)ординарности3)отсутствия последействия

4)кусочно-линейной формы функции распределения

32. В процедуре имитации наступления события используется … (одиночный выбор)

1)псевдослучайное число и величина вероятности наступления события

2)очередное значение из заранее введенных данных наблюдения о наступлении событий другого

3)выбранное по специальным алгоритмам значение из массивов данных специальных исследований

33. Параметр узла addr[#]->na в схеме зарядки нужен для… (одиночный выбор)

1)сохранения в параметре актора значения среднего времени обдумывания

2)сохранения в параметре актора значения среднего времени обработки

3)направления актора в соответствующий узел serve, имитирующий пользователя

Описание

Моделирование систем (обучение)

Поток … можно считать простейшим
1)Поездов метрополитена
2)Пациентов поликлиники
3)Пассажиров к билетной кассе

Узлы pay, rent down …
1)Нельзя использовать для реализации иерархических моделей
2)Применяются для построения моделей однотипных процессов
3)Не запоминают точки возврата отдельных акторов на верхний слой
4)Не допускают перемещений акторов на другие уровни модели

Значение случайной величины, равномерно распределенной в произвольном интервале, получается на основе применения …
1)Метода обратной функции
2)Псевдослучайного числа, равномерно распределенного в интервале (0,1)
3)Перехода к выборке из массива неслучайных чисел

Размеченный граф состояний и переходов марковского процесса содержит …(множественный выбор)
1)узлы, означающие состояния процесса
2)стрелки, означающие возможность переходов процесса в другие состояния из данного состояния
3)стрелки, означающие возможность перехода процесса в то же состояние
4) надписи со значениями вероятностей перехода в другие состояния из данного состояния
5)надписи со значениями вероятностей перехода в то же состояние

Максимальная точность результатов моделирования, выраженная в числе знаков после запятой, равна … (одиночный выбор)
1)двум
2) четырем
3)шести
4)восьми

Система массового обслуживания с очередью характеризуется такими показателями, как … (множественный выбор)
1)среднее время ожидания заявки
2)средняя длина очереди
3)относительная пропускная способность
4)абсолютная пропускная способность

Событий алгоритм моделирования целесообразно применять, когда … (одиночный выбор)
1)строится модель производственных процессов в реальном времени
2)требуется максимальная эффективность выполнения программной модели для проведения исследований
3)моделируются только процессы с дискретным временем
4)моделируются только процессы с непрерывным временем

Закон и параметры распределения времени обдумывания пользователем ответа системы на его запрос обычно задаются в … (множественный выбор)
1)параметрах акторов, имитирующих пользователей
2)узлах serve, имитирующих работу пользователей
3)глобальных переменных модели
4)локальных переменных модели

Процесс называется марковским, если вероятность перехода в новое состояние .. (одиночный выбор)
1)не зависит ни от текущего состояния, ни от всех предшествующих
2)зависит только от всех предшествующих состояний
3)зависит только от текущего состояния
4)является функцией от номера перехода

Недостатком метода обратной функции является … (одиночный выбор)
1)малая точность получаемого результата
2)большой объем вычислений, необходимых для нахождения результата
3)сложность нахождения аналитического решения уравнения для случайной величины
4)ограничение на количество получаемых значений

Метод статистических испытаний применяется, если … (одиночный выбор)
1) требуется получить высокую точность
2) неизвестны внутренние взаимодействия в исследуемой системе
3) отсутствуют другие методы решения задачи
4) необходимо сократить общее время моделирования

Декомпозиция в системе Pilgrimпредставляет собой … (одиночный выбор)
1)детализацию узла графа модели в виде совокупности других узлов
2)изучение узла графа модели путем разработки и прогонов другой модели
3)разбиение множества входных параметров на иерархические подмножества
4)разбиение множества выходных параметров на иерархические подмножества

Для отмены генерации акторов во время работы модели применяются … (одиночный выбор)
1)проверки, проводимые при помощи конструкций С++
2)сигнальная функция customize
3)параметры узла term

Траекторию полета ракеты в системе автоматизированного контроля целесообразно описывать с помощью модели (одиночный выбор)
1)структурной
2)табличной
3)текстовой
4)аналитической
5)графической

Программная модель, построенная на основе компилятора, по отнощению к модели, построенной на основе интерпреатора, … (множественный выбор)
1)имеет большее быстродействие
2)требует меньше памяти
3)выполняется в рабочей среде компилятора

Требованию адекватности отвечает любая … (одиночный выбор)
1) натурная модель
2)математическая модель
3) полунатурная модель
4)модель, прошедшая проверку своей обоснованности

Результатом применения методологии структруного анализа является .. модель (одиночный выбор)
1) сетевая
2) линейная
3) иерархическая
4)несвязанная

Файл, сгенерированный конструктором Gem, представляет собой .. (одиночный выбор)
1) исполнительный модуль программной модели
2) исходный модуль на языке С++
3) исходный модуль на специальном языке

Интенсивностью потока называется … число заявок в потоке в единицу времени (одиночный выбор)
1)среднее
2)максимально возможное
3)минимально возможное

Основное достоинство метода Монте-Карло – это его… (одиночный выбор)
1)простота реализации
2)универсальность
3)вычислительная эффективность

Для моделирования работы предприятия с учетом как материальных, так и финансовых потоков целесообразно использовать … (одиночный выбор)
1)модель системной динамики
2)имитационную модель с пошаговым механизмом
3)имитационную модель с событийным механизмом
4)модель теории массового обслуживания

Граф состояний и переходов одноканальной системы массового обслуживания с отказами содержит … (одиночный выбор)
1)один узел
2)два узла
3)три узла
4)четыре узла

В простейшем потоке … (множественный выбор)
1) интервал между требованиями имеет нормальное распределение
2)отсутствует последействие
3)соблюдается свойство ординарности

Методология структурного анализа представляет собой … (одиночный выбор)
1)рассмотрение множества показателей модели на основе выделения логически связанных их подмножеств
2)проектирование системы путем выделения ее подсистем и их последовательного рассмотрения
3)замену динамической модели процессов структурно связанным набором функциональных моделей

Узел parent … (одиночный выбор)
1) осуществляет вставку в модель узлов, указанных в его параметрах
2)используется для повышения быстродействия программы
3)не выполняет никаких действий и при генерации программного кода просто заменяется своей декомпозицией
4)применяется для управления прохождением акторов по графу модели

В имитационных моделях … (одиночный выбор)
1) имитируются только входные и выходные потоки заявок
2)воспроизводятся процессы функционирования исследуемой системы с соблюдением логической и временной последовательности
3)моделируется прохождение через исследуемую систему только одной ззаявки
4) используется физические свойства исследуемой системы

Относительная пропускная способность системы массового осблуживания с отказами означает … (одиночный выбор)
1) реальную эффективность системы по сравнению с максимально возможной
2)долю обслуженных заявок из общего числа проходящих в систему
3)число обслуженных заявок за некоторый период наблюдения
4)число обслуженных заявок за единицу времени

Отнесение признака объекта к существенным определяется … (одиночный выбор)
1)целями моделирования
2)степенью сложности объекта
3)размерами объекта
4)типом структуры объекта

Формула Хинчина-Поллачека позволяет найти … (одиночный выбор)
1)среднее число занятых каналов обслуживания
2) интенсивность выходящего потока
3)среднюю длину очереди заявок
4)приоритетность обслуживания заявок

Для имитации пользователя или пользователей в моделях замкнутых систем используется узел … (одиночный выбор)
1)serve
2) queue
3)key
4)create

Простейшим называется поток, обладающий такими свойствами, как … (множественный выбор)
1) стационарности
2) ординарности
3) отсутствия последействия
4)кусочно-линейной формы функции распределения

В процедуре имитации наступления события используется … (одиночный выбор)
1)псевдослучайное число и величина вероятности наступления события
2)очередное значение из заранее введенных данных наблюдения о наступлении событий другого
3)выбранное по специальным алгоритмам значение из массивов данных специальных исследований

Параметр узла addr[#]->na в схеме зарядки нужен для… (одиночный выбор)
1)сохранения в параметре актора значения среднего времени обдумывания
2)сохранения в параметре актора значения среднего времени обработки
3)направления актора в соответствующий узел serve, имитирующий пользователя

Оплата и получение

Оплата производится на банковскую карту. Необходимо уточнить у менеджера, на какую карту банка вам удобно совершать оплату.

После оплаты, свяжитесь пожалуйста с менеджером и пришлите ему чек (фото или скриншот). Тем самым вы подтверждаете, что оплату совершили именно вы.

Курсовую вы можете заказать любым удобным для Вас способом, достаточно обратиться к менеджеру, он поможет осуществить заказ.

Работу можно скачать из личного кабинета, или её продублируют Вам на почту.

Работаем по всей России и СНГ:

36. Для отмены генерации акторов во время работы модели применяются …

*проверки, проводимые при помощи конструкций С++

*сигнальная функция customize

*параметры узла term

37. В простейшем потоке вероятность появления более одной заявки в малом интервале времени …

*можно рассчитать по формуле Пуассона

*задается как параметр дополнительно к интенсивности

*пренебрежимо мала

38. Узлы pay, rent down Pilgrim-модели …

*не допускают перемещений транзактов на другие уровни модели *применяются для построения моделей однотипных процессов

*не запоминают точки возврата отдельных транзактов на верхний слой

*нельзя использовать для реализации иерархических моделей

39. Результатом применения методологии структурного анализа является … модель

*сетевая

*линейная

*иерархическая

*несвязанная

40. Моделирующие комплексы используются в случаях, когда …

*нельзя создать программную модель на алгоритмическом языке

*разрабатываемые модели отличает большая сложность

*будет проводиться большой объем экспериментов

Моделирование систем тест Синергия:

Простейшим называется поток, обладающий такими свойствами, как …

стационарности

ординарности

отсутствия последействия

кусочно-линейной формы функции распределения

.

Результатом применения методологии структурного анализа является … модель

сетевая

линейная

иерархическая

несвязанная

.

Метод обратной функции позволяет найти …

значение входных параметров модели по известным выходным

очередную реализацию случайной величины с заданным законом распределения

процессы модели, на которые влияет изучаемый процесс

момент модельного времени, соответствующий заданному состоянию модели

.

Файл, сгенерированный конструктором Gem, представляет собой …

исполнительный модуль программной модели

исходный модуль на языке C+ +

исходный модуль на специальном языке

.

Схема зарядки модели замкнутой системы обеспечивает …

создание специальных переменных для автоматического сбора выходных данных

настройку параметров узлов, имитирующих терминалы или рабочие компьютеры пользователей

настройку параметров узлов, имитирующих обработку пользовательских запросов

появление в начале работы модели акторов, имитирующих пользователей и отмену дальнейшей генерации акторов

.

Методология структурного анализа представляет собой …

рассмотрение множества показателей модели на основе выделения логически связанных их подмножеств

проектирование системы путем выделения ее подсистем и их последовательного рассмотрения

замену динамической модели процессов структурно связанным набором функциональных моделей

.

Для моделирования работы предприятия с учетом как материальных, так и финансовых потоков целесообразно использовать …

модель системной динамики

имитационную модель с пошаговым механизмом

имитационную модель с событийным механизмом

модель теории массового обслуживания

.

Для отмены генерации акторов во время работы модели применяются …

проверки, проводимые при помощи конструкций C+ +

сигнальная функция customize

параметры узла term

.

Интенсивностью потока называется … число заявок в потоке в единицу времени

среднее

максимально возможное

минимально возможное

.

К числу основных преимуществ имитационных моделей относится …

простота разработки моделей

универсальность применения

экономичность

высокая точность результатов

.

Основное достоинство метода Монте-Карло — это его …

простота реализации

универсальность

вычислительная эффективность

.

Случайный процесс называется процессом с дискретными состояниями, если …

возможные состояния процесса можно перечислить (перенумеровать) одно за другим

число возможных состояний процесса конечно

процесс может переходить из состояния в состояние только в определенные моменты

.

Для имитации пользователя или пользователей в моделях замкнутых систем используется узел …

serve

queue

key

create

.

Событийный алгоритм моделирования целесообразно применять, когда …

строится модель производственных процессов в реальном времени

требуется максимальная эффективность выполнения программной модели для проведения исследований

моделируются только процессы с дискретным временем

моделируются только процессы с непрерывным временем

.

Траекторию полета ракеты в системе автоматизированного контроля целесообразно описывать с помощью … модели

структурной

табличной

текстовой

аналитической

графической

.

Оценка вероятности наступления события по результатам моделирования получается на основе…

применения специальных методов, зависящих от вида события

измеренной с помощью программных счетчиков частоты наступления события

построения гистограммы распределения

сопоставления результатов моделирования с эталонными

.

Формула Хинчина-Поллачека позволяет найти …

среднее число занятых каналов обслуживания

интенсивность выходящего потока

среднюю длину очереди заявок

приоритетность обслуживания заявок

.

Для получения случайных чисел в модели системы Pilgrim используется …

один датчик для всей модели

несколько датчиков, число которых задается параметром

один датчик для каждого узла модели

один датчик для каждого актора модели

.

Автоматическое получение среднего времени реакции замкнутой системы на запрос пользователя обеспечивают узлы типа …

actor

term

serve

key

queue

.

Построение гистограммы на основе модели производится для …

приближенного представления закона распределения случайного параметра

нахождения математического ожидания случайного параметра

нахождения дисперсии случайного параметра

оценки адекватности построенной модели

.

Процесс называется марковским, если вероятность перехода в новое состояние …

не зависит ни от текущего состояния, ни от всех предшествующих

зависит только от всех предшествующих состояний

зависит только от текущего состояния

является функцией от номера перехода

.

Случайный процесс называется процессом с дискретными состояниями, если …

возможные состояния процесса можно перечислить (перенумеровать) одно за другим

число возможных состояний процесса конечно

процесс может переходить из состояния в состояние только в определенные моменты

.

Узел parent…

осуществляет вставку в модель узлов, указанных в его параметрах

используется для повышения быстродействия программы

не выполняет никаких действий и при генерации программного кода просто заменяется своей декомпозицией

применяется для управления прохождением акторов по графу модели

.

Метод обратной функции позволяет найти …

значение входных параметров модели по известным выходным

очередную реализацию случайной величины с заданным законом распределения

процессы модели, на которые влияет изучаемый процесс

момент модельного времени, соответствующий заданному состоянию модели

.

Используемые в моделях статистических испытаний псевдослучайные числа представляют собой …

предварительно вычисленную по особым правилам совокупность значений

зарегистрированные в наблюдениях значения показателя физического процесса

выходные данные работы специальной программы, отвечающие специальным требованиям

.

Недостатком метода обратной функции является …

малая точность получаемого результата

большой объем вычислений, необходимых для нахождения результата

сложность нахождения аналитического решения уравнения для случайной величины

ограничение на количество получаемых значений

.

Алгоритм Лемера относится к типу … алгоритмов

циклических

рекуррентных

оптимизационных

.

Узлы pay, rent down …

нельзя использовать для реализации иерархических моделей

применяются для построения моделей однотипных процессов

не запоминают точки возврата отдельных акторов на верхний слой

не допускают перемещений акторов на другие уровни модели

.

Метод статистических испытаний применяется, если …

требуется получить высокую точность

неизвестны внутренние взаимодействия в исследуемой системе

отсутствуют другие методы решения задачи

необходимо сократить общее время моделирования

.

Декомпозиция в системе Pilgrim представляет собой …

детализацию узла графа модели в виде совокупности других узлов

изучение узла графа модели путем разработки и прогонов другой модели

разбиение множества входных параметров на иерархические подмножества

разбиение множества выходных параметров на иерархические подмножества

.

Значение случайной величины, равномерно распределенной в произвольном интервале, получается на основе применения …

метода обратной функции

псевдослучайного числа, равномерно распределенного в интервале (0,1)

перехода к выборке из массива неслучайных чисел

.

Моделирующие комплексы используются в случаях, когда …

Тип ответа: Множественный выбор

разрабатываемые модели отличает большая сложность

будет проводиться большой объема экспериментов

нельзя создать программную модель на алгоритмическом языке

.

Относительная пропускная способность системы массового обслуживания с отказами означает …

реальную эффективность системы по сравнению с максимально возможной

долю обслуженных заявок из общего числа приходящих в систему

число обслуженных заявок за некоторый период наблюдения

число обслуженных заявок за единицу времени

.

В простейшем потоке вероятность появления более одной заявки в малом интервале времени …

можно рассчитать по формуле Пуассона

задается как параметр дополнительно к интенсивности

пренебрежимо мала

.

В процедуре имитации наступления события используется …

псевдослучайное число и величина вероятности наступления события

очередное значение из заранее введенных данных наблюдения о наступлении событий данного типа

выбранное по специальным алгоритмам значение из массивов данных специальных исследований

.

Требованию адекватности отвечает любая …

натурная модель

математическая модель

полунатурная модель

модель, прошедшая проверку своей обоснованности

.

Временной промежуток между отказами крупной информационной системы подчиняется … распределению

равномерному

экспоненциальному

треугольному

нормальному

.

Граф состояний и переходов одноканальной системы массового обслуживания с отказами содержит …

один узел

два узла

три узла

четыре узла

.

Параметр узла addr[#]->na в схеме зарядки нужен для …

сохранения в параметре актора значения среднего времени обдумывания пользователем ответа системы

сохранения в параметре актора значения среднего времени обработки системой запроса пользователя

направления актора в соответствующий узел serve, имитирующий пользователей

.

Максимальная точность результатов моделирования, выраженная в числе знаков после запятой, равна …

двум

четырем

шести

восьми

.

Случайный процесс называется процессом с непрерывным временем, если …

состояния процесса образуют непрерывное множество

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

процесс может перейти из состояния в состояние в любой момент

Моделирование систем

Внимание. В этом предмете 173 вопросов.
Вы можете купить ответы на все вопросы сразу со скидкой 20%
Цена без скидки:
10160.00 руб.
Цена со скдикой:
8128 руб.
Время хранения ответов в личном кабинете — 1 час (при отдельной покупке ответа — 20 минут).

Величина марковского процесса с дискретным множеством состояний и непрерывным временем называется …


Величина марковского процесса с дискретным множеством состояний и непрерывным временем называется …


Величина марковского процесса с дискретным множеством состояний и непрерывным временем называется …


Значения pij матрицы вероятностей переходов марковского процесса с дискретным временем и n дискретными состояниями должны удовлетворять условиям …


Процесс гибели и размножения описывает граф состояний и переходов …


автоматическое получение среднего времени реакции замкнутой системы на запрос пользователя обеспечивают узлы типа …


алгоритм лемера относится к типу … алгоритмов


аппроксимацию данных наблюдения потоков в реальной системе теоретическими распределениями проводят с целью …


в адекватности построенной модели можно убедиться путем сравнения …


вероятность нахождения марковского процесса в каком-либо состоянии зависит …


в имитационных моделях …


в математическую модель включаются те показатели, которые …


в простейшем потоке …


в простейшем потоке вероятность появления более одной заявки в малом интервале времени …


в процедуре имитации наступления события используется …


в процессе описания графа модели с помощью конструктора gem системы pilgrim в графе …


в пуассоновском потоке вероятность появления более одной заявки в малом интервале времени …


в пуассоновском потоке временной интервал между заявками подчиняется …


временной промежуток между отказами крупной информационной системы подчиняется … распределению


временные интервалы между требованиями в потоке, получаемом в результате слияния множества потоков, описываются …


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


время «разогрева» имитационной модели – это период …


в узле actor транзакту можно задать значение …


в узле serve транзакт …


в уравнениях колмогорова для предельных вероятностей марковского процесса с дискретным множеством состояний и непрерывным временем …


в уравнениях колмогорова для предельных вероятностей марковского процесса с дискретным множеством состояний и непрерывным временем в …


гистограмма на основе результатов моделирования строится для …


граф состояний и переходов одноканальной системы массового обслуживания с отказами содержит …


декомпозиция в системе pilgrim представляет собой …


диспетчеризация акторов в узлах модели осуществляется … разработчиком модели


диспетчеризация транзактов в узлах pilgrim-модели осуществляется при помощи …


дисциплина приоритетного обслуживания транзактов в узле serve задается указанием значения параметра …


для изучения солнечной системы можно создать …


для имитации пользователя или пользователей в моделях замкнутых систем используется узел …


для каждого узла модели системы pilgrim в конструкторе gem могут задаваться …


для каждой реализации эксперимента базовое значение псевдослучайного числа в алгоритме лемера обычно устанавливают равным …


для моделирования работы предприятия с учетом как материальных, так и финансовых потоков целесообразно использовать …


для моделирования работы предприятия с учетом материальных и финансовых потоков целесообразно использовать …


для отмены генерации акторов во время работы модели применяются …


для получения случайных чисел в модели системы pilgrim используется …


для реализации наиболее простой имитационной модели целесообразно применять алгоритм моделирования, известный как …


для решения задач, относящихся к стохастическим системам, не имеющим аналитических моделей, наиболее целесообразно использовать … модель


достоинство математических моделей по отношению к физическому эксперименту – …


достоинством плана эксперимента по методу наискорейшего спуска (восхождения) является…


если переходные вероятности марковской цепи не зависят от номера шага, то цепь называется …


железнодорожное расписание с точки зрения удобства пользователя лучше всего представлять как … модель


задачу создания новых транзактов в модели выполняет узел …


закон и параметры распределения времени обдумывания пользователем ответа системы на его запрос обычно задаются в …


закон распределения случайного параметра обычно приближенно представляется в виде …


запрет (разрешение) прохождений транзактов по графу модели можно выполнить с помощью узла …


значение модуля m в алгоритме лехмера должно быть …


значение модуля m в алгоритме лехмера должно быть …


значение случайной величины, равномерно распределенной в произвольном интервале, обычно получается с помощью …


значение случайной величины, равномерно распределенной в произвольном интервале, обычно получается с помощью …


значение случайной величины, равномерно распределенной в произвольном интервале, получается на основе применения …


значения предельных вероятностей марковского процесса с дискретным временем и дискретными состояниями …


имитационное моделирование стохастических систем применяется, если …


интенсивностью потока называется … число заявок в потоке в единицу времени


используемые в имитационных моделях псевдослучайные числа представляют собой …


используемые в моделях статистических испытаний псевдослучайные числа представляют собой …


к выходным параметрам моделирования в системе pilgrim относятся …


к достоинствам моделирующей системы на основе интерпретатора можно отнести …


кодирование факторов, проводимое при планировании экспериментов, позволяет…


компьютерная модель техногенной катастрофы позволяет …


конструктор gem предназначен для …


концепция декомпозиции в системе pilgrim представляет собой: …


коэффициент вариации в формуле хинчина-полачека означает отношение …


к преимуществам математических моделей можно отнести …


к преимуществам математических моделей относится …


к типу завершающихся следует отнести модель …


к числу основных преимуществ имитационных моделей относится …


к числу основных преимуществ методологии моделирования относится …


к числу основных требований, предъявляемых к моделям, относятся …


максимальная точность результатов моделирования в системе pilgrim, выраженная в числе знаков после запятой, равна …


максимальная точность результатов моделирования в системе pilgrim, выраженная в числе знаков после запятой, равна …


максимальная точность результатов моделирования, выраженная в числе знаков после запятой, равна …


максимальное число транзактов, которые могут находиться в узле queue pilgrim-модели, …


марковская цепь называется однородной, если переходные вероятности …


математическая модель объекта должна включать описания …


математические модели по отношению к другим моделям позволяют …


математическое моделирование представляет собой …


матрицу вероятностей переходов марковского процесса с дискретным временем и дискретными состояниями называют регулярной, если …


метод обратной функции позволяет задать значение случайной величины, распределенной по … закону


метод обратной функции позволяет найти …


методология структурного анализа pilgrim-модели строится на основе …


методология структурного анализа pilgrim-модели − это …


методология структурного анализа представляет собой …


метод статистических испытаний применяется, если …


метод статистических испытаний чаще всего применяется, когда …


моделирующие комплексы используются в случаях, когда …


моделирующий комплекс pilgrim позволяет моделировать … процессы


моделирующий комплекс pilgrim работает на платформах, имеющих …


модель, используемую для анализа процессов, можно применять при соблюдении …


модель облака в виде черно-белого изображения нужна для выявления таких его признаков, как …


модель отражает …


модель представляет собой объект, …


моделью называется …


наибольшая средняя длина очереди на обслуживание заявок пуассоновского потока имеет место в случае, когда время обслуживания распределено по … закону


наименьшее среднее время ожидания в очереди достигается, когда законом распределения времени обслуживания является … закон распределения.


неверно, что программная модель, построенная на основе компилятора, …


недостатком метода обратной функции является …


опытом в теории планирования эксперимента называется …


основное достоинство метода монте-карло – это его …


отнесение признака объекта к существенным определяется …


относительная пропускная способность системы массового обслуживания с отказами означает …


отсеивающий эксперимент проводится для выявления …


оценка вероятности наступления события по результатам моделирования получается на основе …


параметр узла addr[#]->na в схеме зарядки нужен для …


параметры транзакта … можно использовать только для чтения


планировать имитационные эксперименты нужно, чтобы …


планировать эксперимент на имитационной модели нужно, чтобы …


по отношению к модели справедливо утверждение о том, что …


построение гистограммы на основе модели производится для …


поток … можно считать простейшим


пошаговый алгоритм моделирования целесообразно применять, если …


преимуществом плана 2к по отношению к плану на основе матрицы адамара является …


при использовании имитационной модели в контуре автоматического управления объектом для прогона модели следует устанавливать … масштаб времени


при использовании имитационной модели для проведения научных экспериментов для прогона модели следует устанавливать … масштаб времени


приоритет транзакта хранится в параметре …


проверку формальной корректности графа модели, созданного с помощью конструктора gem системы pilgrim, осуществляют …


программная модель, построенная на основе компилятора, по отношению к модели, построенной на основе интерпретатора, …


простейшим называется поток, обладающий такими свойствами, как …


процесс называется марковским, если вероятность перехода в новое состояние …


процесс создания модели можно кратко характеризовать как …


размеченный граф состояний и переходов марковского процесса отличается от неразмеченного графа наличием в нем …


размеченный граф состояний и переходов марковского процесса содержит …


разработанная pilgrim-модель …


режим возобновления прерванного обслуживания транзакта в узле serv задается параметром …


результатом применения методологии структурного анализа в системе pilgrim является …


результатом применения методологии структурного анализа является … модель


результаты моделирования в системе pilgrim помещаются в …


свойство адекватности модели характеризует степень …


система массового обслуживания с очередью характеризуется такими показателями, как …


слой pilgrim-модели можно трактовать как …


случайный процесс, который может переходить из состояния в состояние в произвольные моменты времени, называется …


случайный процесс, который может переходить из состояния в состояние только в определенные моменты времени, называется …


случайный процесс называется процессом с дискретным временем, если …


случайный процесс называется процессом с дискретными состояниями, если …


случайный процесс называется процессом с дискретными состояниями, если …


случайный процесс называется процессом с непрерывным временем, если …


случайный процесс называется процессом с непрерывными состояниями, если …


событийный алгоритм моделирования целесообразно применять, если …


событийный алгоритм моделирования целесообразно применять, когда …


средний размер очереди в системе массового обслуживания с очередями и с пуассоновским входным потоком зависит от …


стохастической системой называется система, …


суммарное время выполнения последовательных операций на сборочной линии можно описать … распределением


схема зарядки модели замкнутой системы обеспечивает …


точность вычислений в системе pilgrim, выраженная в числе знаков после запятой, по умолчанию равна …


точность вычислений в системе pilgrim по умолчанию равна … знакам после запятой


траекторию полета ракеты в системе автоматизированного контроля целесообразно описывать с помощью … модели


транзакт в модели pilgrim может …


транзакт в модели pilgrim хранит …


транзакт в модели pilgrim – это …


транзакт может порождать новые транзакты с помощью узла …


требованию адекватности отвечает …


требованию адекватности отвечает любая …


узел ag в pilgrim-модели обеспечивает …


узел key в pilgrim-модели обеспечивает …


узел parent …


узел parent pilgrim-модели …


узел queue в pilgrim-модели имитирует …


узел serv в pilgrim-модели имитирует …


узел term в pilgrim-модели обеспечивает …


узлы pay, rent down …


узлы pay, rent down pilgrim-модели …


узлы pay, rent down pilgrim-модели реализуют …


уравнения колмогорова для марковского процесса с дискретным множеством состояний и непрерывным временем позволяют определить значения …


файл, сгенерированный конструктором gem, представляет собой …


формула хинчина-полачека позволяет найти …


формула хинчина-полачека справедлива для …


формула хинчина–поллачека позволяет найти …


число прошедших через узел ### транзактов содержится в параметре узла …


чтобы увеличить длину последовательности псевдослучайных чисел, генерируемых на основе алгоритма лемера, в формуле нужно …


Время на прочтение
20 мин

Количество просмотров 35K

Данная статья является доработанной текстовой версией одноименного доклада с конференции C++ CoreHard Autumn 2016, которая проходила в Минске в октябре прошлого года. Желание сделать эту статью возникло под впечатлением о том, что в мире C++ разработчики как бы делятся на два больших и не пересекающихся лагеря. В первом лагере находятся матерые спецы, которые все видели, все знают и все умеют, за плечами у которых десятки собственноручно написанных реализаций Модели Акторов, внутрях у которых хитрые, конечно же самостоятельно сделанные, lock-free очереди и state-of-the-art механизмы обслуживания сообщений. Такие проффи сами часами могут рассказывать про тонкости многопоточного программирования (только почему-то редко это делают). Во втором лагере — зеленые новички, которых волею судьбы занесло в мир C++, которые пока слабо представляют себе различия между unique_ptr и shared_ptr, про шаблоны только слышали, а в области многопоточности имеют поверхностное впечатление только о std::thread, std::mutex и, может быть, std::condition_variable. Для людей из первого лагеря я вряд ли что-нибудь интересное расскажу, а вот разработчикам из второго лагеря попробую вкратце рассказать о том, что Модель Акторов в C++ — это нормально. И что есть ряд готовых инструментов, на примере которых можно увидеть, что же это такое.

Введение

Разговор пойдет о Модели Акторов и о том, стоит ли ее использовать в программах на языке C++ и, если таки стоит, то чем можно воспользоваться, чтобы не изобретать собственный велосипед. Говорить о Модели Акторов будем применительно к решению проблем многопоточности, поэтому следует сузить контекст, дабы не возникало разночтений.

Многопоточность, как инструмент, используется в двух сильно разных направлениях. Первое — это parallel computing. Многопоточность здесь нужна для параллельного выполнения одних и тех же операций над разными блоками данных. Тем самым сильно сокращая время решения конкретной вычислительной задачи. Например, перекодирование видеофайла в один поток может занять час. А перекодирование в четыре параллельных потока — всего 15 минут.

Второе направление — это concurrent computing. Т.е. одновременное выполнение множества разных операций. Например, многопоточный сервер СУБД, который одновременно принимает запросы, строит планы их выполнения, производит операции ввода-вывода, отдает результаты запросы клиентам, обновляет статистику и т.д. Многопоточность здесь нужна для обеспечения действительно параллельного выполнения различных операций. Хотя, по большому счету, обеспечивать concurrency можно даже и на одном потоке (т.н. квазипараллелизм).

Так вот дальше речь пойдет о многопоточности применительно к concurrent computing. Ибо именно в этом направлении использование Модели Акторов полностью себя оправдывает.

Что же такого сложного в многопоточном программировании?

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

Как только у нас появляется объект, который нам нужно модифицировать из разных потоков, так сразу же начинаются проблемы. Чем больше потоков, чем хитрее сценарии их работы, тем сложнее вообразить хитросплетения взаимодействия между ними. Отсюда и ошибки, которые далеко не всегда просто обнаружить и исправить.

Как упростить себе жизнь?

Ничего не разделять. Принцип shared nothing, который широко известен в узких кругах.

Вместо того, чтобы иметь N потоков, которые конкурируют друг с другом за ресурсы, можно сделать M потоков, каждый из которых будет владеть собственными данными. Ни один из потоков не имеет доступа к данным других потоков.

Замечательно, но что, если потоку X потребовалась какая-то информация, которая есть у потока Y? Или если поток Y хочет, чтобы поток Z обновил какие-то данные у себя?

Значит, потоки должны каким-то образом взаимодействовать между собой. Каким образом?

На первый взгляд кажется, что вариантов два:

Либо синхронно.
Либо асинхронно.

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

Остается асинхронное взаимодействие.

Подходим к Модели Акторов издалека…

Как у нас можем происходить общение рабочих потоков на сообщениях? Например, вот так:

  • поток X отсылает сообщение-запрос потоку Y;
  • поток Y когда-то получает запрос потока X и отсылает потоку X ответ;
  • поток Y отсылает сообщение-обновление потоку Z;
  • поток Z когда-то получит сообщение-обновление от потока Y и обновит те данные, которые принадлежат потоку Z.

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

Если же потоку X нужно что-то от другого потока Y, то поток X помещает сообщение во входящую очередь потока Y.

Приятное дополнение: если сообщения переносят копию данных, а не ссылку на исходные данные где-то в разделяемой памяти, то получается внезапный бонус — прозрачный переход к распределенности.

Действительно, если поток Y отдает все необходимые данные в очередь сообщений для Z, то уже не суть важно, разгребает ли эту очередь поток Z в том же самом процессе, или это очередь на отправку данных на другой узел сети. Сообщение самодостаточно, поэтому его содержимое может быть сериализовано, передано по сети, десериализовано и доставлено получателю.

Вот мы на пальцах и показали часть основных принципов Модели Акторов.

Собственно, Модель Акторов. В двух-трех словах

Модель Акторов появилась в 1973-ем году благодаря работам Карла Хьюитта (Carl Hewitt), а затем была развита в 1981-ом году Уильямом Клингером (William Clinger) и в 1985-ом Гулом Агха (Gul Agha).

Модель Акторов несколько раз привлекала к себе широкое внимание. Последняя волна известности, по субъективному впечатлению, началась подниматься где-то лет 10-12 назад. Сначала этому способствовал язык программирования Erlang. Затем фреймворк Akka.

Желающие погрузиться в теоретическую часть Модели Акторов могут начать со следующих обзорных статей в Wikipedia и далее по ссылкам:

History of the Actor Model
Actor Model
Actor Model Theory

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

Модель Акторов «на пальцах»

Если не вдаваться в скучную формальную теорию, то Модель Акторов базируется на следующих принципах:

  • актор — это некая сущность, обладающая поведением;
  • акторы реагируют на входящие сообщения;
  • получив сообщение актор может:
    • отослать некоторое (конечное) количество сообщений другим акторам;
    • создать некоторое (конечное) количество новых акторов;
    • определить для себя новое поведение для обработки последующих сообщений.

Принципы простые. И, когда к ним привыкнешь, очевидные. Тем не менее, один важный момент нужно затронуть отдельно. Этот момент очень важен, т.к. он поясняет, почему реализации Модели Акторов могут выглядеть по-разному и очень сильно отличаются друг от друга.

Больше акторов, хороших и разных!

Актор — это некоторая сущность.

Модель акторов не говорит о том, как именно эта сущность должна быть реализована.

Актором может быть отдельный процесс. Например, так происходит в Erlang, где каждый легковесный процесс внутри Erlang VM может считаться актором.

Актором может быть отдельный поток (OS thread, «green» thread, fiber, etc…). Например, goroutines в языке Go так же можно рассматривать как акторы (с натяжкой).

Актором может быть отдельный объект, который кочует с одного рабочего контекста на другой. Например, таковыми являются акторы в Akka и не только. Могут быть и реализации, в которых вообще все акторы работают на контексте одной единственной нити.

С чем же ассоциируется Модель Акторов сейчас?

Erlang

Прежде всего — это Erlang.

Ирония в том, что я никогда не встречал, чтобы Джо Армстронг говорил, что на Erlang повлияла Модель Акторов.

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

История Erlang началась в далеком 1986-м году в одной из лабораторий компании Ericsson. Джо Армстронг экспериментировал с Prolog-ом для написания программ для телефонии. В результате этих экспериментов появился Erlang.

В 1995-ом году в Ericsson-е была закрыта неудачная разработка нового телефонного свича AXE-N (кстати, на C++). В новой разработке в качестве основного языка использовался Erlang. Итогом стал успешный программно-аппаратный продукт AXD301, внутри которого было порядка миллиона(!) строк кода на Erlang.

Правда далее история Erlang-а в Ericsson-е развивалась парадоксальным образом. Вскоре после создания AXD301 использование Erlang-а в разработке новых продуктов внутри Ericsson-а было запрещено. Джо Армстронг ушел из Ericsson-а, основал свою компанию, язык Erlang вышел в OpenSource.

Через несколько лет, когда Erlang доказал свою состоятельность находясь в «свободном» плавании, запрет в Ericsson-е был снят. В 2004-ом году Армстронг возвращается в Ericsson.

За последние 15 лет Erlang доказал свою состоятельность более чем убедительно.
Огромное количество продуктов разработано на Erlang, ряд компаний использует Erlang в качестве ключевого инструмента.

Например, WhatsApp.

Многие компании убеждаются в преимуществах Erlang-а и начинают использовать его у себя. Например, Wargaming сформировал у себя серьезную команду Erlang-разработчиков (возможно, самую серьезную в СНГ) и потихоньку переучивает Python-истов на Erlang.

Давайте посмотрим маленький пример простейшей программы на Erlang-е. Классический для Модели Акторов пример — «пинг-понг»:

-module(tut15).
-export([start/0, ping/2, pong/0]).

ping(0, Pong_PID) ->
    Pong_PID ! finished,
    io:format("ping finished~n", []);

ping(N, Pong_PID) ->
    Pong_PID ! {ping, self()},
    receive
        pong ->
            io:format("Ping received pong~n", [])
    end,
    ping(N - 1, Pong_PID).

pong() ->
    receive
        finished ->
            io:format("Pong finished~n", []);
        {ping, Ping_PID} ->
            io:format("Pong received ping~n", []),
            Ping_PID ! pong,
            pong()
    end.

start() ->
    Pong_PID = spawn(tut15, pong, []),
    spawn(tut15, ping, [3, Pong_PID]).

Akka

Вторая по известности «икона» Модели Акторов — это фреймворк Akka для языков Scala и Java.

Историю Akka можно начать с 2006-го года, когда Филипп Холлер (Philipp Haller) разработал реализацию Модели Акторов для языка Scala. Эта реализация вошла в стандартную библиотеку Scala.

Через несколько лет, когда Scala и акторы из ее стандартной библиотеки доказали свою состоятельность, Джонес Бонер (Jonas Bonér) в 2008-м приступил к созданию фреймворка Akka, первая публичная версия которого вышла в 2010-ом. Одним из существенных отличий Akka от акторов из стандартной библиотеки Scala стало то, что Akka поддерживала как Scala, так и Java. В этом смысле примечательно то, что компания Lightbend (бывший TypeSafe), которая стоит за разработкой Akka и оказывает коммерческую поддержку Akka, заявила о сдвиге своего фокуса со Scala в пользу Java.

Akka широко используется в области Web-а и онлайн-сервисов (например, Twitter, LinkedIn). Люди, стоящие за Akka, причастны к таким современным buzz-word-ам, как Reactive Manifesto и Microservices.

Ну и для того, чтобы составить впечатление о том, как выглядит код с использованием Akka, одна из реализаций «пинг-понга» для Akka на Scala (таких реализаций множество, конкретно эта найдена здесь):

import akka.actor._

case object PingMessage
case object PongMessage
case object StartMessage
case object StopMessage

class Ping(pong: ActorRef) extends Actor {
  var count = 0
  def incrementAndPrint { count += 1; println("ping") }
  def receive = {
    case StartMessage =>
        incrementAndPrint
        pong ! PingMessage
    case PongMessage => 
        incrementAndPrint
        if (count > 99) {
          sender ! StopMessage
          println("ping stopped")
          context.stop(self)
        } else {
          sender ! PingMessage
        }
  }
}

class Pong extends Actor {
  def receive = {
    case PingMessage =>
        println("  pong")
        sender ! PongMessage
    case StopMessage =>
        println("pong stopped")
        context.stop(self)
  }
}

object PingPongTest extends App {
  val system = ActorSystem("PingPongSystem")
  val pong = system.actorOf(Props[Pong], name = "pong")
  val ping = system.actorOf(Props(new Ping(pong)), name = "ping")
  // start them going
  ping ! StartMessage
}

В чем сила, брат?

Почему же Erlang, Akka и другие похожие на них инструменты получили такую популярность?

Тут уместно было бы привести цитату из Джо Армстронга (создателя языка Erlang):

I also suspect that the advent of true parallel CPU cores will make programming parallel systems using conventional mutexes and shared data structures almost impossibly difficult, and that the pure message-passing systems will become the dominant way to program parallel systems.

Что в грубом пересказе, но с сохранением смысла сказанного, может звучать как:

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

Отмечу несколько ключевых факторов, которые объясняют успех Erlang и Akka:

  • простота разработки. Использование асинхронного обмена сообщениями сильно упрощает жизнь когда приходится иметь дело с concurrent computing;
  • масштабирование. Модель Акторов позволяет создавать огромное количество акторов, каждый из которых отвечает за свою частную задачу. Принцип shared nothing и асинхронный обмен сообщениями позволяет строить распределенные приложения, горизонтально масштабируясь по мере надобности;
  • отказоустойчивость. Сбой одного актора может отлавливаться другими акторами, которые предпринимают соответствующие действия для восстановления ситуации (например, механизм супервизоров из Erlang-а).

Но это все безопасные языки и управляемые среды.

И, кстати говоря, вопросы отказоустойчивости и безопасных языков, которые работают в управляемых средах, довольно сильно увязаны друг с другом. Так, если внутри Erlang-овой VM какой-то легковесный процесс выполнит деление на ноль, то Erlang VM просто закроет один этот процесс и на работоспособность других процессов это не скажется. Однако, если мы возьмем многопоточное приложение на C++, в одном из потоков которого происходит деление на ноль, то аварийно завершит работу все приложение.

Так что в том, что в последние годы Модель Акторов стала популярна в первую очередь в безопасных языках, есть свои объективные факторы.

А есть ли смысл в реализациях Модели Акторов для языка C++?

Чтобы ответить на этот вопрос, нужно сперва ответить на другой вопрос: а нужен ли сейчас вообще C++?

Язык C++ — это старый язык с очень длинной историей. Даже если считать от момента официального релиза (осень 1985-го), то ему уже больше тридцати лет. Само название C++ появилось в 1983-ем, а работа над языком началась в 1979-ом. Т.е. скоро можно будет говорить о сорокалетней истории языка.

За это время С++ вобрал в себя множество новшеств и заимствований. Но сохранил, при этом, совместимость с изрядным подмножеством языка C.

Т.е. стал настоящим монстром. Вряд ли в мире найдется больше пары сотен человек, про которых можно сказать, что они знают C++.

Использовать C++ сложно. C++ часто критикуют. Очень часто критикуют заслуженно.

Развитие таких языков, как Java/Scala/C# с одной стороны, рост популярности функциональных языков (вроде OCaml и Haskell) с другой, а также появление новых и «современных» альтернатив, вроде Go, вытеснило C++ из многих прикладных ниш, в которых он волею судьбы оказался в 1980-х и 1990-х годах.

Поэтому последние лет 15-ть язык C++ регулярно хоронят. Я сам лет 8-мь назад всерьез считал, что у C++ нет будущего.

Тем не менее, C++ здесь. Жив-здоров. Успешно развивается. Становится еще большим монстром, чем был. Но, что удивительно, чем более сложным языком C++ становится, тем проще его использовать в повседневной работе.

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

Этот язык — C++.

Поэтому если нам нужно сделать что-то сложное и/или большое, если при этом нам не безразлична ни скорость работы результирующего продукта, ни его ресурсоемкость, если у нас не бесконечный бюджет и есть жесткие дедлайны, то альтернатив у C++ будет раз-два и обчелся.

При всем моем интересе к Rust-у, мне думается, что ему понадобиться еще несколько лет интенсивного развития чтобы стать мейнстримом. А Swift пока не может похвастаться кроссплатформенностью.

Так что хотим мы того или нет, но C++ пока что здесь. И, по всей видимости, будет здесь еще долго.

А раз так, и раз на C++ разрабатываются большие и сложные программы, в том числе и с использованием многопоточности, то почему бы не упростить себе жизнь за счет применения Модели Акторов?

Что есть готового для C++?

Давайте посмотрим, что для C++ есть готового из реализаций Модели Акторов. Дабы не переизобретать велосипед и иметь возможность взять что-то существующее, вместо того, чтобы дать что-то свое с нуля. Ну или убедиться в том, что нужной для вас реализации нет и имеет смысл убить пару-тройку человеко-лет на создание еще одного решения.

Вообще-то говоря, готовых реализаций Модели Акторов не так уж много. Один из списков можно найти в Wikipedia: Actor Libraries and Frameworks. Но там, к сожалению, перечислено не все и часть проектов уже не подает признаков жизни.

Ниже мы рассмотрим несколько реализаций, которые явно живы, здоровы, не просто подают признаки жизни, но и эволюционно развиваются. Кроме того, эти проекты могут похвастаться переносимостью между разными платформами. Например, по этой причине в обзор не включена Asynchonous Agents Library от Microsoft, которая доступна в Microsoft Visual Studio. Так же в обзор не попали OOSMOS (заточенность в первую очередь под чистый C, а не под C++) и actor-zeta (пока еще находящийся на ранней стадии своего развития).

QP/C++

Начнем с библиотеки QP/C++.

QP/C++ — это зрелый (более 15 лет развития) программный продукт под двойной лицензией, предназначенный для разработки встраиваемого ПО, в том числе и систем реального времени. В том числе и систем, которые могут работать прямо на голом железе. В том числе QP/C++ частично соответствует MISRA C++2008. Из всего этого и проистекает его специфичность. Так же это единственный фреймворк в обзоре, которому достаточно C++98.

Акторы в QP/C++ называются активными объектами и представляю из себя иерархические конечные автоматы. Код акторов можно набирать в виде обычных C++ных классов. А можно нарисовать актора в специальном инструменте для визуального моделирования и его код будет сгенерирован автоматически.

Активные объекты в QP/C++ работают на контексте, который им выделяет QP. В зависимости от окружения активные объекты могут работать каждый на своей нити или же они могут разделять общий рабочий контекст.

В качестве иллюстрации посмотрим на один из примеров из состава QP, в котором заставляют периодически мигать светодиод на каком-то устройстве.

Исходный файл blinky.h, в котором декларируется актор и все, что с ним связано:

#ifndef blinky_h
#define blinky_h

using namespace QP;

enum BlinkySignals {
    DUMMY_SIG = Q_USER_SIG,
    MAX_PUB_SIG,  // the last published signal

    TIMEOUT_SIG,
    MAX_SIG       // the last signal
};

extern QMActive * const AO_Blinky; // opaque pointer

#endif // blinky_h

Файл main.cpp, в котором инициируется работа актора:

#include "qpcpp.h"
#include "bsp.h"
#include "blinky.h"

int main() {
    static QEvt const *blinkyQSto[10]; // Event queue storage for Blinky

    BSP_init(); // initialize the Board Support Package
    QF::init(); // initialize the framework and the underlying RT kernel

    // instantiate and start the active objects...
    AO_Blinky->start(1U,                            // priority
                 	blinkyQSto, Q_DIM(blinkyQSto), // event queue
                 	(void *)0, 0U);                // stack (unused)

    return QF::run(); // run the QF application
}

Ну и файл blinky.cpp, в котором актор реализован:

#include "qpcpp.h"
#include "bsp.h"
#include "blinky.h"

class Blinky : public QActive {
private:
    QTimeEvt m_timeEvt;

public:
    Blinky();

protected:
    static QState initial(Blinky * const me, QEvt const * const e);
    static QState off(Blinky * const me, QEvt const * const e);
    static QState on(Blinky * const me, QEvt const * const e);
};

Blinky l_blinky;

QMActive * const AO_Blinky = &l_blinky; // opaque pointer

Blinky::Blinky()
  : QActive(Q_STATE_CAST(&Blinky::initial)),
    m_timeEvt(this, TIMEOUT_SIG, 0U)
{}

QState Blinky::initial(Blinky * const me, QEvt const * const e) {
    (void)e; // unused parameter

    // arm the time event to expire in half a second and every half second
    me->m_timeEvt.armX(BSP_TICKS_PER_SEC/2U, BSP_TICKS_PER_SEC/2U);
    return Q_TRAN(&Blinky::off);
}

QState Blinky::off(Blinky * const me, QEvt const * const e)
{
    QState status;
    switch (e->sig) {
        case Q_ENTRY_SIG: {
            BSP_ledOff();
            status = Q_HANDLED();
            break;
        }
        case TIMEOUT_SIG: {
            status = Q_TRAN(&Blinky::on);
            break;
        }
        default: {
            status = Q_SUPER(&QHsm::top);
            break;
        }
    }
    return status;
}

QState Blinky::on(Blinky * const me, QEvt const * const e)
{
    QState status;
    switch (e->sig) {
        case Q_ENTRY_SIG: {
            BSP_ledOn();
            status = Q_HANDLED();
            break;
        }
        case TIMEOUT_SIG: {
            status = Q_TRAN(&Blinky::off);
            break;
        }
        default: {
            status = Q_SUPER(&QHsm::top);
            break;
        }
    }
    return status;
}

Just::Thread Pro: Actors Edition

Следующий инструмент — Just::Thread Pro: Actors Edition.

Платная библиотека от очень известного в C++ном мире Энтони Уильямса (Anthony Williams). Автора книги «C++ Concurrency in Action».

Собственно, достоинства библиотеки на этом и заканчиваются :)

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

В качестве иллюстрации посмотрим на классический пример ping-pong.

#include <jss/actor.hpp>
#include <iostream>
#include <thread>

int main()
{
    struct pingpong {
        jss::actor_ref sender;

        pingpong(jss::actor_ref sender_): sender(sender_) {}
    };
    jss::actor pp1( 
        []{
            for(;;)
            {
                jss::actor::receive().match<pingpong>(
                    [](pingpong p){
                        std::cout<<"pingn";
                        p.sender.send(pingpong(jss::actor::self()));
                    });
            }
        });

    jss::actor pp2(
        []{
            for(;;)
            {
                jss::actor::receive().match<pingpong>(
                    [](pingpong p){
                        std::cout<<"pongn";
                        p.sender.send(pingpong(jss::actor::self()));
                    });
            }
        });

    pp1.send(pingpong(pp2));

    std::this_thread::sleep_for(std::chrono::seconds(2));
    pp1.stop();
    pp2.stop();
}

C++ Actor Framework

Следующий инструмент — это C++ Actor Framework. Он же CAF, он же libcppa в недавном прошлом.

OpenSource проект под BSD-лицензией.

Если можно говорить о самой известной реализации Модели Акторов для C++, то это про CAF. Пожалуй, более распиаренной библиотеки на эту тему для C++ нет.

CAF копирует Erlang в C++ настолько близко, насколько это возможно. Поэтому если вы знаете Erlang, вам нравится Erlang, но вам нужно вести разработку на C++ и вы хотели бы писать на C++ как на Erlang, то вам прямиком в CAF.

Ценой за мимикрию под Erlang являются высокие требования CAF-а к уровню поддержки стандартов в C++ в компиляторе. Из-за этого разработчики CAF-а никогда не рассматривали Windows и VC++ в качестве одной из значимых платформ для своей разработки, ограничиваясь Linux-ом, FreeBSD MacOS, а также самыми свежими версиями компиляторов gcc и clang. Кроме того, авторы CAF несколько раз заявляли, что они и впредь будут ориентироваться прежде всего на самые новые возможности языка C++ и будут переходить на фичи из новых стандартов так быстро, как это возможно.

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

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

Кроме того, за те два с половиной года, что CAF маячит в поле моего зрения, уже несколько раз заявлялось о нарушении совместимости при выпуске новых версий CAF-а.

Ну и разработчики CAF-а позиционируют его как очень шустрый фреймворк, хотя на этот счет у некоторых есть обоснованные сомнения ;)

В качестве иллюстрации можно привести код примера fixed_stack из состава самого CAF-а.

#include <cassert>
#include <cstdint>
#include <iostream>
#include "caf/all.hpp"

using std::endl;
using namespace caf;

namespace {

using pop_atom = atom_constant<atom("pop")>;
using push_atom = atom_constant<atom("push")>;

enum class fixed_stack_errc : uint8_t { push_to_full = 1, pop_from_empty };

error make_error(fixed_stack_errc x) {
  return error{static_cast<uint8_t>(x), atom("FixedStack")};
}

class fixed_stack : public event_based_actor {
public:
  fixed_stack(actor_config& cfg, size_t stack_size)
      : event_based_actor(cfg),
        size_(stack_size)  {
    full_.assign(
      [=](push_atom, int) -> error {
        return fixed_stack_errc::push_to_full;
      },
      [=](pop_atom) -> int {
        auto result = data_.back();
        data_.pop_back();
        become(filled_);
        return result;
      }
    );

    filled_.assign(
      [=](push_atom, int what) {
        data_.push_back(what);
        if (data_.size() == size_)
          become(full_);
      },
      [=](pop_atom) -> int {
        auto result = data_.back();
        data_.pop_back();
        if (data_.empty())
          become(empty_);
        return result;
      }
    );

    empty_.assign(
      [=](push_atom, int what) {
        data_.push_back(what);
        become(filled_);
      },
      [=](pop_atom) -> error {
        return fixed_stack_errc::pop_from_empty;
      }
    );
  }

  behavior make_behavior() override {
    assert(size_ < 2);
    return empty_;
  }

private:
  size_t size_;
  std::vector<int> data_;
  behavior full_;
  behavior filled_;
  behavior empty_;
};

void caf_main(actor_system& system) {
  scoped_actor self{system};
  auto st = self->spawn<fixed_stack>(5u);
  // fill stack
  for (int i = 0; i < 10; ++i) self->send(st, push_atom::value, i);
  // drain stack
  aout(self) << "stack: { ";
  bool stack_empty = false;
  while (!stack_empty) {
    self->request(st, std::chrono::seconds(10), pop_atom::value).receive(
      [&](int x) {
        aout(self) << x << "  ";
      },
      [&](const error&) {
        stack_empty = true;
      }
    );
  }
  aout(self) << "}" << endl;
  self->send_exit(st, exit_reason::user_shutdown);
}
} // namespace <anonymous>
CAF_MAIN()

SObjectizer

Ну и четвертый фреймворк, на котором мы остановимся чуть подробнее — это SObjectizer.

OpenSource-проект под лицензией BSD.

Проект развивается с 2002-го года, хотя базируется на идеях, которые были выработаны и проверены еще в середине 90-х при разработке небольшой объектно-ориентированной SCADA-системы (развитие которой, к сожалению, завершилось в 2000-ом).

SObjectizer никогда не были экспериментальным проектом, он создавался специально для того, чтобы упростить разработку многопоточного софта на C++. До сих пор в эксплуатации находятся программные системы, написанные на разных версиях SObjectizer.

Поэтому в SObjectizer огромное внимание уделяется совместимости. Например, осенью 2014-го года вышла версия SObjectizer-5.5.0. С тех пор в рамках версии 5.5 прошло более двадцати релизов, последняя стабильная версия имеет номер 5.5.18, но ломающих изменений не было. Так что SObjectizer — это проект с весьма долгой историей и трепетным отношением к совместимости между версиями.

Акторы в SObjectizer называются агентами. Просто по историческим причинам.

Как и в QP/C++ агенты в SObjectizer — это, как правило, экземпляры отдельных C++ных классов. Так же, как и в QP/C++ агенты представляют из себя иерархические конечные автоматы (включая вложенные состояния, deep- и shallow-историю, обработчики входа-выхода, временные лимиты).

Так же, как и в QP/C++ рабочий контекст агентам предоставляет фреймворк. Для этого в SObjectizer есть такое понятие, как диспетчер: специальная сущность, которая выполняет диспетчеризацию событий агентов. В состав SObjectizer входит восемь типов диспетчеров, доступных разработчику «из коробки». Среди них есть такой интересный диспетчер, как adv_thread_pool, который позволяет параллельно запускать на разных рабочих нитях обработчики событий одного и того же агента, если эти обработчики помечены как thread-safe.

В чем SObjectizer сильно отличается от перечисленных выше проектов, так это симбиозом моделей Акторов, Publish-Subscribe и Comminicating Sequential Processes.

В SObjectizer сообщения отсылаются не напрямую агентам-получателям, а в mbox-ы (почтовые ящики). А уже из mbox-а сообщения доставляются тем агентам, которые на него подписаны. Таким образом mbox-ы в SObjectizer работают как Topic-и в модели Publish-Subscribe. Отсылка сообщения в mbox — это как операция Publish. Агенты же должны выполнить операцию Subscribe для получения интересующих их сообщений.

Вот чего сейчас SObjectizer не предоставляет, так это готовых средств построения распределенных приложений. Подобные средства были в ранних версиях SObjectizer-а, но со временем по ряду объективных причин от них отказались и начиная с 2010-го года подобных инструментов в ядре SObjectizer-а нет. Пользователь сам выбирает, какой коммуникационный слой ему удобнее использовать — будь это REST, MQTT, CoAP, AMQP или что-то еще.

В качестве иллюстрации покажем реализацию CAF-овского примера fixed_stack, но на SObjectizer (вообще-то лично мне этот пример кажется мягко говоря странным, если не сказать дурацким, т.к. практического смысла в создании таких акторов нет от слова совсем, но раз уж SObjectizer часто просят сравнить именно с CAF-ом, то пусть будет именно такой пример):

#include <iostream>

#include <so_5/all.hpp>

class fixed_stack final : public so_5::agent_t
{
  state_t st_empty{ this },
          st_filled{ this },
          st_full{ this };
 
  const size_t m_max_size;
  std::vector< int > m_stack;
 
public :
  class empty_stack final : public std::logic_error
  {
  public :
    using std::logic_error::logic_error;
  };

  struct push { int m_val; };
  struct pop : public so_5::signal_t {};

  fixed_stack( context_t ctx, size_t max_size )
    : so_5::agent_t( ctx )
    , m_max_size( max_size )
  {
    this >>= st_empty;
 
    so_subscribe_self()
      .in( st_empty )
      .in( st_filled )
      .event( &fixed_stack::on_push );
 
    so_subscribe_self()
      .in( st_filled )
      .in( st_full )
      .event( &fixed_stack::on_pop_when_not_empty );
 
    so_subscribe_self()
      .in( st_empty )
      .event( &fixed_stack::on_pop_when_empty );
  }

private :
  void on_push( const push & w )
  {
    m_stack.push_back( w.m_val );
    this >>= ( m_stack.size() == m_max_size ? st_full : st_filled );
  }
 
  int on_pop_when_not_empty( mhood_t< pop > )
  {
    auto r = m_stack.back();
    m_stack.pop_back();
    this >>= ( m_stack.empty() ? st_empty : st_filled );
    return r;
  }
 
  int on_pop_when_empty( mhood_t< pop > )
  {
    throw empty_stack( "empty_stack" );
  }
};  

int main() {
  try {
    so_5::launch( []( so_5::environment_t & env ) {
      so_5::mbox_t stack;
      env.introduce_coop( [&stack]( so_5::coop_t & coop ) {
        stack = coop.make_agent< fixed_stack >( 5u )->so_direct_mbox();
      } );

      for( int i = 0; i < 10; ++i )  so_5::send< fixed_stack::push >( stack, i );

      std::cout << "stack { ";
      try {
        for(;;)
          std::cout << so_5::request_value< int, fixed_stack::pop >( stack, std::chrono::seconds(10) ) << " ";
      }
      catch( const fixed_stack::empty_stack & ) {}
      std::cout << "}" << std::endl;

      env.stop();
    } );
    return 0;
  }
  catch( const std::exception & x )  {
    std::cerr << "Oops! " << x.what() << std::endl;
  }
  return 2;
}

Заключение

Модель Акторов — это очень удобный инструмент в случаях, где использование этой модели уместно. Это уже неоднократно доказывалось успешным применением таких инструментов, как Erlang и Akka в самых разнообразных проектах. Да и вообще за асинхронным обменом сообщений между независимыми сущностями будущее. Прислушайтесь к Джо Армстронгу, он плохого не посоветует.

Но не верьте рекламе: использование Модели Акторов уместно не всегда.

Наш опыт показывает, что при наличии подходящих инструментов Модель Акторов имеет смысл применять и в C++. При этом для C++ готовые инструменты уже есть. На разный вкус и цвет.

И размер кошелька, конечно же. В коммерческом проекте за QP/C++ и за Just::Thread Pro придется заплатить. За SObjectizer и CAF — нет. По крайней мере сразу не придется.

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

Неблагодарное это дело. Проверено на людях. Лучше все-таки взять что-то готовое.

И пусть кто-нибудь другой весело бегает по граблям многопоточности :)

В компьютерных науках моде́ль а́кторов представляет собой математическую модель параллельных вычислений, которая трактует понятие «актор» как универсальный примитив параллельного численного расчёта: в ответ на сообщения, которые он получает, актор может принимать локальные решения, создавать новых акторов, посылать свои сообщения, а также устанавливать, как следует реагировать на последующие сообщения. Модель акторов возникла в 1973 году.[1] Она использовалась как основа для понимания исчисления процессов и как теоретическая база для ряда практических реализаций параллельных систем.

Содержание

  • 1 История
  • 2 Фундаментальные концепции
  • 3 Формальные системы
  • 4 Применения
  • 5 Предшествующие модели
    • 5.1 Лямбда-исчисление
    • 5.2 Симула
    • 5.3 Smalltalk
    • 5.4 Сети Петри
    • 5.5 Нити, блокировки и буферы (каналы)
  • 6 Семантика передачи сообщений
    • 6.1 Неограниченные недетерминированные разногласия
    • 6.2 Прямая связь и асинхронность
    • 6.3 Создание новых акторов плюс передача адресов в сообщениях означают изменяемую топологию
    • 6.4 По сути одновременно
    • 6.5 Никаких требований о порядке поступления сообщений
    • 6.6 Локальность
    • 6.7 Композиция систем акторов
    • 6.8 Поведение
    • 6.9 Моделирование других параллельных систем
    • 6.10 Теорема вычислительных представлений
    • 6.11 Связь с математической логикой
    • 6.12 Миграция
    • 6.13 Безопасность
    • 6.14 Синтез адресов акторов
    • 6.15 Отличие от других моделей параллельной передачи сообщений
  • 7 Актуальность в настоящий момент
  • 8 Программирование с акторами
    • 8.1 Ранние программные языки с акторами
    • 8.2 Более поздние программные языки с акторами
    • 8.3 Библиотеки и табличные структуры с акторами
  • 9 См. также
  • 10 Примечания
  • 11 Дальнейшее чтение
  • 12 Ссылки

История

В отличие от предыдущих моделей вычислений, появление модели акторов было стимулировано физикой, в том числе общей теорией относительности и квантовой механикой. На процесс формирования модели оказали также влияние языки программирования Lisp, Симула и ранние версии Smalltalk, а также методы параметрической защиты и коммутации пакетов. Развитие модели было «мотивировано перспективой высокопараллельных вычислительных машин, состоящих из десятков, сотен и даже тысяч независимых микропроцессоров, каждый со своей собственной локальной памятью и коммуникационным процессором, общающихся через сеть высокопроизводительной связи».[2] С массовым распространением параллелизма, возникшего благодаря развитию многоядерных архитектур, интерес к модели акторов значительно возрос.

После публикации Хьюитта, Бишопа и Штайгера в 1973 г. Ирен Грейф разработала операционную семантику для модели акторов как часть своей докторской диссертации.[3] Два года спустя Генри Бейкер и Хьюитт опубликовали множество аксиоматических законов для систем акторов.[4] Другие значимые вехи включают диссертацию Уильяма Клингера в 1981 году,[2] представившего денотативную семантику, основанную на мощности доменов, и диссертацию Гуля Ага 1985 г., в который дано дальнейшее развитие семантической модели Клингера.[5] В результате этих работ теория модели акторов получила полное развитие.

Фундаментальные концепции

Модель акторов исходит из такой философии, что всё вокруг является акторами. Это похоже на философию объектно-ориентированного программирования, где всё вокруг является некоторыми объектами, но отличается тем, что в объектно-ориентированном программировании программы, как правило, выполняются последовательно, в то время как в модели акторов вычисления по своей сути совпадают по времени.

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

  • отправить конечное число сообщений другим акторам;
  • создать конечное число новых акторов;
  • выбрать тип поведения, которое будет использоваться для следующего сообщения в свой адрес.

Может существовать произвольная последовательность вышеописанных действий, и все они могут выполняться параллельно.

Развязка отправителя и посланных сообщений стала фундаментальным достижением модели акторов, обеспечившая асинхронную связь и управление структурами как прототип передачи сообщений.[6]

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

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

Формальные системы

За прошедшие годы были разработаны несколько различных формальных систем, которые позволяют описать модели акторов. К ним относятся:

  • Операционная семантика[3][7]
  • Законы для систем акторов[4]
  • Денотационная семантика[2][8]
  • Семантика переходов.[5]

Есть также формализмы, которые не полностью соответствуют модели акторов в том аспекте, что они не формализуют гарантированную доставку сообщений. К ним, в частности, относятся:

  • Несколько различных алгебр акторов[9][10]
  • Линейная логика.[11]

Применения

Модель акторов может быть использована в качестве основы для моделирования, понимания и аргументации по широкому спектру параллельных систем, например:

  • Электронная почта (e-mail) может быть смоделирована как система акторов. Клиенты моделируется как акторы, а адреса электронной почты — как адреса акторов.
  • Веб-сервисы с конечными точками SOAP могут быть смоделированы как адреса акторов.
  • Объекты с семафорами (например, в Java и C#) могут быть смоделированы как параллельно-последовательный преобразователь, при условии, что их реализация такова, что сообщения могут приходить постоянно (возможно, они хранятся во внутренней очереди). Параллельно-последовательный преобразователь является важным видом актора, характеризующийся тем, что он постоянно доступен для прихода новых сообщений. Каждое сообщение, отправленное на параллельно-последовательный преобразователь гарантированно будет получено.
  • Нотация тестирования и управления тестами (как TTCN-2, так и TTCN-3) довольно близко соответствует модели акторов. В TTCN актором является тест компонента: либо параллельной тест компонента (PTC), либо главный тест компонента (MTC). Тесты компонентов могут отправлять и получать сообщения на/от удалённых партнеров (равноправные тесты компонентов или тест интерфейса системы), причём последний идентифицируется по его адресу. Каждый тест компонента имеет дерево поведения, связанное с ним. Тесты компонентов запускаются параллельно, и могут быть динамически созданы родительскими тестами компонентов. Встроенные языковые конструкции позволяют определить действия, которые необходимо выполнить, когда сообщение получено из внутренней очереди сообщений, а также отправить сообщения другим равноправным субъектом или создать новые тесты компонентов.

Предшествующие модели

Модель акторов сформировалась на базе предшествующих моделей вычислений.

Лямбда-исчисление

Лямбда-исчисление Алонзо Чёрча можно рассматривать как самый первый язык программирования обмена сообщениями.[1] (см. также Абельсон и Суссман 1985). Например, нижеприведённое лямбда-выражение реализует древовидную структуру данных, если оно используется с параметрами leftSubTree и rightSubTree. Если на входе такого дерева дать в качестве параметра сообщение «getLeft», оно возвратит leftSubTree, а если дать сообщение «»getRight», то возвратится rightSubTree.

 λ(leftSubTree,rightSubTree)
   λ(message)
     if (message == "getLeft") then leftSubTree
     else if (message == "getRight") then rightSubTree

Семантика лямбда-исчислений выражается при помощи подстановок переменных, в которых значения параметров заменяются в теле вызываемых лямбда-выражений. Модель подстановок непригодна для параллелизма, поскольку она не обеспечивает возможность совместного использования ресурсов. Под влиянием лямбда-исчислений интерпретатор языка программирования Lisp использует структуры данных, называемые средой (environment ), такие, что значения параметров не должны заменяться в теле запускаемых лямбда-выражений. Это обеспечивает совместное использование эффектов обновления общих структур данных, но не обеспечивает параллелизм.

Симула

Язык Симула был пионером в использовании передачи сообщений для вычислений, связанных с дискретными приложениями моделирования событий. В предыдущих языках моделирования эти приложения были громоздкими и немодульными. На каждом шаге времени нужно было выполнять большую центральную программу и обновлять состояния каждого моделируемого объекта, зависящие от состояния других объектов, с которыми данный объект взаимодействовал на текущем шаге моделирования. Кристен Нюгорд и Оле-Йохан Даль первыми развили идею (впервые изложена на семинаре IFIP в 1967 г.) применения методов, встроенных в каждый объект, которые обновляют свои собственные состояния на основании сообщений от других объектов. Кроме того, они ввели структуры классов для объектов с наследованием. Их нововведения значительно повысили модульность программ.

Однако в Симуле вместо истинного параллелизма использовались сопрограммы управления структурами.

Smalltalk

При разработке Smalltalk-71 Алан Кэй находился под влиянием возможности передачи сообщений в управляемых шаблонами вызовах языка Planner. Хьюитт был заинтригован языком Smalltalk-71, но отложил его применение из-за сложности коммуникаций, которые включают вызовы со многими полями, включая global, sender, receiver, reply-style, status, reply, operator selector и т.д.

В 1972 году Кэй посетил MIT и обсудил некоторые свои идеи для Smalltalk-72, основанные на возможностях языка программирования Лого Сеймура Паперта и на модели вычислений «маленький человек», используемой для обучения детей программированию. Однако, передача сообщений в Smalltalk-72 была довольно сложной. Код на языке рассматривался интерпретатором просто как поток символов. Как позже писал Дэн Инголс:

Первый встретившийся в динамическом контексте символ в программе использовался для определения получателя последующего сообщения. Поиск имени начинался с типа словаря в текущей активации. В случае ошибки сообщение перенаправлялось создателю активации, и так далее по цепочке, вплоть до отправителя сообщения. Когда связывание, наконец, находило символ, его значение присваивалось получателю нового сообщения, а интерпретатор активировал код для класса этого объекта.

Таким образом, передача сообщений в Smalltalk-72 была тесно привязана к конкретной модели машины и к синтаксису языка программирования, который не был приспособлен для параллелизма. Кроме того, хотя система загружалась сама, языковые конструкции не были формально определены как объекты, которые отвечают на Eval сообщения (см. обсуждение ниже). Это позволило некоторым сделать вывод, что новая математическая модель параллельных вычислений на основе передачи сообщений должна быть проще, чем Smalltalk-72.

Последующие версии языка Smalltalk в значительной степени развивались по пути использования виртуальных методов из языка Симула в структурах программ передачи сообщений. Однако в Smalltalk-72 в объектах появились примитивы, таких как целые числа, числа с плавающей точкой, и т.д. Авторы языка Симула рассмотрели принятие таких примитивов в объектах, но воздержались от этого, в основном по соображениям эффективности. В языке Java сначала посчитали целесообразным использовать как примитивы, так и версии объектов целых чисел, чисел с плавающей точкой, и др. В языке программирования C# (и более поздних версиях Java, начиная с Java 1.5) принято менее элегантное решение использования упаковки и распаковки, которые ранее использовались в некоторых реализациях Lisp.

Система Smalltalk впоследствии стала очень популярной и влиятельной, оказав инновационное воздействие на растровые дисплеи, персональные компьютеры, интерфейс браузеров и на многое другое.[12] Тем временем усилия разработчиков модели акторов в MTI сосредоточились на развитии научных и технических основ более высокого уровня параллелизма.

Сети Петри

До появления модели акторов сети Петри широко использовались для моделирования недетерминированных вычислений. Однако, было признано, что они имеют важное ограничение: они моделируют управление потоком, но не сам поток данных. Следовательно, они не были легко компонуемыми, что тем самым ограничивало их модульность. Хьюитт отметил ещё одну проблему сетей Петри: сложность одновременных действий. Элементарный шаг вычислений в сети Петри представляет собой переход, при котором признаки одновременности исчезают на входах перехода и появляются на его выходах. Физические основы использования примитивов с такого рода одновременностью оказались сомнительными. Несмотря на эти очевидные трудности, метод сетей Петри остаётся популярным подходом к моделированию параллелизма, и всё еще является предметом активных исследований.

Нити, блокировки и буферы (каналы)

До модели акторов параллелизм был определён в аппаратных терминах низкого уровня через нити, блокировки и буферы (каналы). Не случайно, конечно, то, что реализация модели акторов обычно использует эти аппаратные возможности. Однако, нет никаких оснований считать, что модель не может быть реализована непосредственно в аппаратуре без эквивалентных аппаратных нитей и блокировок. Кроме того, нет обязательной связи между акторами, нитями и блокировками, которые могут быть вовлечены в вычисления. Реализации модели акторов не связаны непосредственно с нитями и блокировками во всех случаях, совместимых с законами для акторов.

Семантика передачи сообщений

Вот что можно сказать относительно семантики передаваемых сообщений в модели акторов.

Неограниченные недетерминированные разногласия

Возможно, первыми параллельными программами были обработчики прерываний. В процессе нормальной работы компьютеру необходимо получать информацию извне (символы с клавиатуры, пакеты из сети и т.д.). Когда получена информация, выполнение текущей программы «прерывается» и запускается специальный код, называемый обработчиком прерывания, который помещает информацию в буфер, откуда она может быть впоследствии считана.

В начале 1960-х прерывания стали использовать для имитации одновременного выполнения нескольких программ на одном процессоре.[13] Наличие параллелизма с общей памятью привело к проблеме управления параллелизмом. Первоначально эта задача задумывалась как один из мьютексов на отдельном компьютере. Эдсгер Дейкстра разработал семафоры, а позднее, в период между 1971 и 1973 годах, Чарльз Хоар и Пер Хансен для решения проблемы мьютексов разработали мониторы.[14][15][16] Однако, ни одно из этих решений не создавало в языках программирования конструкций, которые бы инкапсулировали доступ к совместным ресурсам. Инкапсуляцию сделали позже Хьюитт и Аткинсон, построив параллельно-последовательный преобразователь ([Hewitt, Atkinson 1977, 1979] и [Atkinson 1980]).

Первые модели вычислений (например, машина Тьюринга, машина Поста, лямбда-исчисление и т.д.) были основаны на математике и использовали понятие глобального состояния, чтобы определить шаг вычисления (позднее эти понятия обобщены в работах [McCarthy and Hayes 1969] и [Dijkstra 1976]). Каждый шаг вычисления шёл от одного глобального состояния вычислений до следующего. Глобальный подход к состоянию был продолжен в теории автоматов для конечных автоматов и машин со стеком, в том числе их недетерминированные версии. Такие недетерминированные автоматы имеют свойство ограниченного индетерминизма. То есть, если машина всегда стоит перед тем, как она переходит в исходное состояние, то имеется ограничение на число состояний, в которых она может находиться.

Эдсгер Дейкстра развил дальше подход с недетерминированными глобальными состояниями. Модель Дейкстры породила споры о неограниченном индетерминизме. Неограниченный индетерминизм (называемый также неограниченным недетерминизмом) является свойством совпадающих вычислений, при котором величина задержки в обслуживании запроса может стать неограниченной в результате арбитражного соперничества за общие ресурсы, в то же время гарантируется, что запрос в конечном итоге будет обслужен. Хьюитт утверждает, что модель акторов должна обеспечить гарантии на предоставление услуги. Хотя в модели Дейкстры не может быть неограниченного количества времени между выполнением последовательных операций на компьютере, параллельно выполняемая программа, которая начала свою работу в строго определённом состоянии, может быть прервана лишь в ограниченном числе состояний [Dijkstra 1976]. Следовательно, модель Дейкстры не может обеспечить гарантии предоставления услуги. Дейкстра утверждал, что невозможно осуществить неограниченный индетерминизм.

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

Неограниченный индетерминизм является характерной чертой модели акторов, в которой используется математическая модель Билла Клингера, основанная на теории доменов.[2] В модели акторов не существует глобального состояния.

Прямая связь и асинхронность

Сообщения в модели акторов не обязательно буферизуются. В этом её резкое различие с предшествующими подходами к модели одновременных вычислений. Отсутствие буферизации вызвало большое недоразумение во время развития модели акторов, и до сих пор эта тема является предметом споров. Некоторые исследователи утверждают, что сообщения буферизуются в «эфире» или «окружающей среде». Кроме того, сообщения в модели акторов просто посылаются (например, пакеты в IP). Никаких требований на синхронное рукопожатие с получателем не существует.

Создание новых акторов плюс передача адресов в сообщениях означают изменяемую топологию

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

В процессе вычислений, возможно, потребуется отправить сообщение получателю, от которого позже нужно получить ответ. Способ сделать это состоит в том, чтобы отправить сообщение, в котором записан адрес другого актора, называемого возобновлением (иногда его также называют продолжением или стеком вызовов). Получатель может затем сделать ответное сообщение, которое будет отправлено на возобновление.

Создание акторов плюс включение адресов участников в сообщения означает, что модель акторов имеет потенциально переменную топологию в своих отношениях друг с другом, походя на объекты в языке Симула, которые в своих отношениях друг с другом также имеют переменную топологию.

По сути одновременно

В отличие от предыдущего подхода, основанного на комбинировании последовательных процессов, модель акторов была разработана как одновременная модель по своей сути. Как написано в теории моделей акторов, последовательность в ней представляет собой особый случай, вытекающий из одновременных вычислений.

Никаких требований о порядке поступления сообщений

Хьюитт был против включения требований о том, что сообщения должны прибывать в том порядке, в котором они отправлены на модель актора. Если желательно упорядочить входящие сообщения, то это можно смоделировать с помощью очереди акторов, которая обеспечивает такую функциональность. Такие очереди акторов упорядочивали бы поступающие сообщений так, чтобы они были получены в порядке FIFO. В общем же случае, если актор X отправляет сообщение M1 актору Y, а затем тот же актор X отправляет другое сообщение M2 к Y, то не существует никаких требований о том, что M1 придёт к Y раньше M2.

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

Например, акторы могут использовать конвейер обработки сообщений. Это означает, что в процессе обработки сообщения M1 актор может варьировать поведение, которое будет использоваться для обработки следующего сообщения. В частности, это означает, что он может начать обработку ещё одного сообщения M2 до завершения обработки M1. На том основании, что актору предоставлено право использования конвейера обработки сообщений, ещё не означает, что он этот конвейер обязан использовать. Будет ли сообщение конвейеризовано или нет — относится к задачам технического компромисса. Как внешний наблюдатель может узнать, что обработка сообщения актора прошла через конвейер? На этот счёт не существует никакой двусмысленности в отношении применения актором возможности конвейеризации. Только если в конкретной реализации выполнение конвейерной оптимизации сделано неправильно, в этом случае может произойти не ожидаемое поведение, а нечто другое.

Локальность

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

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

Композиция систем акторов

Идея композиции систем акторов в более крупные образования является важным аспектом модульности, которая была разработана в докторской диссертации Гуля Ага[5], позже развитой им же вместе с Ианом Мейсоном, Скоттом Смитом и Каролин Талкотт.[7]

Поведение

Основным новшеством модели акторов было введение понятия поведения, определённое как математическая функция, выражающая действия актора, когда он обрабатывает сообщения, включая определение нового поведения на обработку следующего поступившего сообщения. Поведение обеспечивает функционирование математической модели параллелизма.

Поведение также освобождает модель акторов от деталей реализации, как, например, в Smalltalk-72 это делает маркер интерпретатора потока. Однако, важно понимать, что эффективное внедрение систем, описываемых моделью акторов, требует расширенную оптимизацию.

Моделирование других параллельных систем

Другие системы параллелизма (например, исчисление процессов) могут быть смоделированы в модели акторов с использованием двухфазного протокола фиксации.[17]

Теорема вычислительных представлений

В модели акторов существует теорема вычислительных представлений для замкнутых систем, в том смысле, что они не получают сообщений извне. В математической записи замкнутая система, обозначаемая как S, строится как наилучшее приближение для начального поведения, называемого ⊥S, с использованием аппроксимирующей функции поведения progressionS, построенной для S следующим образом (согласно публикации Хьюитта 2008 г.):

DenoteS ≡ ⊔i∈ω progressionSi(⊥S)

Таким образом, S может быть математически охарактеризована в терминах всех его возможных поведений (в том числе с учётом неограниченного индетерминизма). Хотя DenoteS не является реализацией S, она может быть использована для доказательства обобщения тезиса Чёрча-Тьюринга-Россера-Клини (см. Клини, 1943):

Теорема перечислимости: если примитив актора замкнутой системы акторов являются эффективным, то его возможные выходы рекурсивно перечислимы.

Доказательство: непосредственно вытекает из теоремы вычислительных представлений.

Связь с математической логикой

Развитие модели акторов имеет интересную связь с математической логикой. Одной из ключевых мотиваций для её развития была необходимость управления аспектами, которые возникли в процессе развития языка программирования Planner. После того как модель акторов была первоначально сформулирована, стало важно определить мощность модели в отношении тезиса Роберта Ковальского о том, что «вычисления могут быть сгруппированы по логическим выводам». Тезис Ковальского оказался ложным для одновременных вычислений в модели акторов. Этот результат всё ещё является спорным, и он противоречит некоторым предыдущим представлениям, поскольку тезис Ковальского верен для последовательных вычислений и даже для некоторых видов параллельных вычислений, например, для лямбда-исчислений.

Тем не менее были предприняты попытки расширения логического программирования для одновременных вычислений. Однако, Хьюитт и Ага в работе 1999 г. утверждают, что результирующая система не является дедуктивной в следующем смысле: вычислительные шаги параллельных систем программирования логики не следуют дедуктивно из предыдущих шагов.

Миграция

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

Безопасность

Безопасность акторов может быть обеспечена одним из следующих способов:

  • аппаратным управлением, к которому акторы подключены физически;
  • через специальное оборудование, как, например, в Барроуз B5000, Лисп-машине и т.д.
  • через виртуальную машину, как, например, в виртуальной машине Java, в общеязыковой исполняющей среде и т.д.
  • через операционную систему, как, например, в системах с параметрической защитой;
  • использованием электронной цифровой подписи и/или шифрования для акторов и их адресов.

Синтез адресов акторов

Тонким моментом в модели акторов является возможность синтеза адреса актора. В некоторых случаях система безопасности может запрещать синтез адресов. Поскольку адрес актора это просто битовая строка, то, очевидно, его можно синтезировать, хотя, если битовая строка достаточно длинная, подобрать адрес актора довольно трудно или даже невозможно. SOAP в качестве адреса конечной точки использует URL, по которому актор расположен. Так как URL является строкой символов, то, очевидно, её можно синтезировать, хотя если применить шифрование, то подобрать строку практически невозможно.

Синтезирование адресов акторов обычно моделируются с помощью отображения. Идея состоит в использовании системы акторов для выполнения отображения на фактические адреса акторов. Например, структура памяти компьютера может быть смоделирована как система акторов, которая даёт отображение. В случае адресов SOAP это моделирование DNS и отображение URL.

Отличие от других моделей параллельной передачи сообщений

Первая из опубликованных работ Робина Милнера о параллелизме[18] была примечательна тем, что она не была основана на композиции последовательных процессов. Его работа отличалась от модели акторов, потому что она была основана на фиксированном количестве процессов фиксированного числа связей в топологии строк, используемых для синхронизации связи. Оригинальная модель взаимодействующих последовательных процессов (CSP), опубликованная Энтони Хоаром[19], отличается от модели акторов, потому что она основана на параллельной композиции фиксированного числа последовательных процессов, связанных в фиксированную топологию и общающихся с помощью синхронной передачи сообщений на основе имён процессов. Более поздние версии CSP отказались от связи на основе имён процессов, приняв принцип анонимной связи по каналам. Этот подход используется также в работе Милнера об исчислении общающихся систем и пи-исчислении.

Этим обеим ранним моделям Милнера и Хоара свойствен ограниченный индетерминизм. Современные теоретические CSP ([Hoare 1985] и [Roscoe 2005]) прямо предусматривают неограниченный индетерминизм.

Актуальность в настоящий момент

Через сорок лет после публикации закона Мура продолжающееся возрастание производительности микросхем происходит благодаря методам локального и глобального массового параллелизма. Локальный параллелизм задействован в новых микросхемах для 64-разрядных многоядерных микропроцессоров, в мульти-чиповых модулях и высокопроизводительных системах связи. Глобальный параллелизм в настоящее время задействован в новом оборудовании для проводной и беспроводной широкополосной пакетной коммутации сообщений (см. Wi-Fi и Ultra Wideband). Ёмкость хранения за счёт как локального, так и глобального паралеллизма, растёт в геометрической прогрессии.

По словам Хьюитта (см. Carl Hewitt, 2006a), модель акторов ставит вопросы в области компьютеров и архитектуры связи, языков параллельного программирования и веб-сервисов, включая следующие:

  • масштабируемость: проблема расширения параллелизма, как локального, так и нелокального.
  • прозрачность: преодоление пропасти между локальным и нелокальным параллелизмом. Прозрачность в настоящее время является спорным вопросом. Некоторые исследователи выступают за строгое разделение между локальным параллелизмом, используемом в языках параллельного программирования (например, Java и C#), и нелокальным параллелизмом, используемом в SOAP для веб-сервисов. Строгое разделение приводит к отсутствию прозрачности, что вызывает проблемы, когда желательно/необходимо внести изменения в локальные и нелокальные методы доступа к веб-службам.
  • противоречивость: противоречивость является нормой, потому что все очень большие системы знаний о взаимодействии информационных систем человечества противоречивы. Эта противоречивость распространяется на документацию и технические характеристики очень больших систем (например, программное обеспечение Microsoft Windows, и т.д.), которые являются внутренне противоречивыми.

Многие идеи, введённые в модели акторов, в настоящее время находят также применение в многоагентных системах по этим же причинам (см. Хьюитт, 2006b, 2007b). Ключевым отличием является то, что агент системы (в большинстве определений) накладывает дополнительные ограничения на акторов, как правило, требуя, чтобы они использовали обязательства и цели.

Модель акторов применяется также в клиентах облачных вычислений.[20]

Программирование с акторами

Большое число различных языков программирования используют модель акторов или её варианты. Среди них:

Ранние программные языки с акторами

  • Act 1, 2 и 3 [21][22]
  • Acttalk [23]
  • Ani [24]
  • Cantor [25]
  • Rosette[26]

Более поздние программные языки с акторами

  • Actor-Based Concurrent Language (ABCL)
  • ActorScript
  • AmbientTalk[27]
  • Axum (язык программирования)[28]
  • E (язык программирования)
  • Erlang
  • Io
  • Ptolemy Project
  • Rebeca Modeling Language
  • Reia (язык программирования)
  • SALSA (язык программирования)[29]
  • Scala[30][31]
  • Go

Библиотеки и табличные структуры с акторами

Разработаны также библиотеки и табличные структуры с акторами, чтобы обеспечить актороподобный стиль программирования на языках, которые не имеют встроенных акторов. Среди них:

  • Akka — Java и Scala табличные структуры с акторами, обработка транзакций
  • Ateji PX — Ateji PX обеспечивает модель акторов для Java
  • Korus — параллельная распределённая табличная структура для Java, основанная на модели актора
  • Kilim — табличные структуры на методе передачи сообщений для Java[32]
  • ActorFoundry — библиотека языка Java для программирования акторов
  • Retlang для .NET
  • Jetlang для Java
  • Haskell-Actor для Haskell
  • GPars — паралеллизм и библиотека актора для Groovy (бывшая GParallelizer)
  • PARLEY — Python Actor Runtime Library
  • Termite Scheme — обеспечивает Erlang-подобный паралеллизм для представления схем Gambit
  • Theron — обеспечивает модель актора для C++.
  • Celluloid — для Ruby

См. также

  • Многоагентная система

Примечания

  1. 1 2 Карл Хьюитт, Питер Бишоп, Ричард Штайгер: Универсальный модульный формализм акторов для искусственного интеллекта. IJCAI, 1973 (англ.)
  2. 1 2 3 4 Уильям Клингер, Основы семантики акторов. MIT, докторская диссертация по математике, июнь 1981 (англ.)
  3. 1 2 [Ирен Грейф, Семантика коммуникативных параллельных процессов. MIT, докторская диссертация, август 1975] (англ.)
  4. 1 2 Г. Бейкер, К. Хьюитт. Законы взаимодействующих параллельных процессов. IFIP, август 1977 (англ.)
  5. 1 2 3 Гуль Ага, Акторы: Модель параллельных вычислений в распределенных системах. MIT Press, докторская диссертация, 1986 (англ.)
  6. Carl Hewitt. Viewing Control Structures as Patterns of Passing Messages Journal of Artificial Intelligence. June 1977.
  7. 1 2 Г. Ага, И. Мейсон, С. Смит, К. Талкотт. Основания для вычислений акторов. Journal of Functional Programming, январь, 1993 (англ.)
  8. Карл Хьюитт. Что такое обязательство? Физическое, организационное и социальное. (англ.)
  9. M. Gaspari, G. Zavattaro. An Algebra of Actors. Technical Report UBLCS-97-4. University of Bologna, 1997
  10. G. Agha, P. Thati. An Algebraic Theory of Actors and Its Application to a Simple Object-Based Language.
  11. John Darlington; Y. K. Guo (1994). «Formalizing Actors in Linear Logic» (International Conference on Object-Oriented Information Systems).
  12. Алан Кэй. Ранняя история Smalltalk. ACM SIGPLAN, v. 28 (3), March, 1993, рр. 69–75 (англ.)
  13. П. Хансен. Истоки параллельного программирования: от семафоров к удаленному вызову процедур. Springer, 2002 (англ.)
  14. Per Hansen, Monitors and Concurrent Pascal: A Personal History, Comm. ACM 1996, pp 121-172
  15. Hansen, P., Operating System Principles, Prentice-Hall, July 1973.
  16. C.A.R. Hoare, Monitors: An Operating System Structuring Concept, Comm. ACM Vol. 17, No. 10. October 1974, pp. 549-557
  17. Frederick Knabe. A Distributed Protocol for Channel-Based Communication with Choice PARLE 1992.
  18. Robin Milner. Processes: A Mathematical Model of Computing Agents in Logic Colloquium 1973.
  19. C.A.R. Hoare. Communicating sequential processes CACM. August 1978.
  20. Карл Хьюитт. Организация масштабируемых, надёжных, конфиденциальных клиентов для облачных вычислений. IEEE Internet Computing, v. 12 (5), 2008 (англ.)
  21. Генри Либерман. Обзор Act 1. MIT AI, июнь 1981 (англ.)
  22. Генри Либерман. Мышление о многом сразу без путаницы: Параллелизм в Act 1. MIT AI, июнь 1981 (англ.)
  23. Jean-Pierre Briot. Acttalk: A framework for object-oriented concurrent programming-design and experience 2nd France-Japan workshop. 1999.
  24. Ken Kahn. A Computational Theory of Animation MIT EECS Doctoral Dissertation. August 1979.
  25. William Athas and Nanette Boden Cantor: An Actor Programming System for Scientific Computing in Proceedings of the NSF Workshop on Object-Based Concurrent Programming. 1988. Special Issue of SIGPLAN Notices.
  26. Darrell Woelk. Developing InfoSleuth Agents Using Rosette: An Actor Based Language Proceedings of the CIKM ’95 Workshop on Intelligent Information Agents. 1995.
  27. Dedecker J., Van Cutsem T., Mostinckx S., D’Hondt T., De Meuter W. Ambient-oriented Programming in AmbientTalk. In “Proceedings of the 20th European Conference on Object-Oriented Programming (ECOOP), Dave Thomas (Ed.), Lecture Notes in Computer Science Vol. 4067, pp. 230-254, Springer-Verlag.”, 2006
  28. Microsoft Cooking Up New Parallel Programming Language — Application Development — News & Reviews — eWeek.com
  29. Carlos Varela and Gul Agha. Programming Dynamically Reconfigurable Open Systems with SALSA. ACM SIGPLAN Notices. OOPSLA’2001 Intriguing Technology Track Proceedings, 2001
  30. Philipp Haller and Martin Odersky, Event-Based Programming without Inversion of Control, Proc. JMLC, September, 2006
  31. Philipp Haller and Martin Odersky, Actors that Unify Threads and Events. Technical report LAMP, January, 2007
  32. Srinivasan, Sriram; Alan Mycroft (2008). «Kilim: Isolation-Typed Actors for Java» (PDF). European Conference on Object Oriented Programming ECOOP 2008. .

Дальнейшее чтение

  • Stephen Kleene Recursive Predicates and Quantifiers American Mathematical Society Transactions. 1943.
  • Paul Baran. On Distributed Communications Networks IEEE Transactions on Communications Systems, March 1964.
  • Peter Landin. A Generalization of Jumps and Labels Report. UNIVAC Systems Programming Research. August 1965. Reprinted in Higher Order and Symbolic Computation. 1998.
  • Edsger Dijkstra Solution of a Problem in Concurrent Programming Control Communications of the ACM, 1965.
  • Jack Dennis and Earl Van Horn. Programming Semantics for Multiprogrammed Computations CACM. March 1966.
  • Ole-Johan Dahl and Kristen Nygaard. Class and subclass declarations IFIP TC2 Conference on Simulation Programming Languages. May 1967.
  • Carl Hewitt. PLANNER: A Language for Proving Theorems in Robots IJCAI 1969
  • William A. Woods. Transition network grammars for natural language analysis CACM. 1970.
  • Terry Winograd. Procedures as a Representation for Data in a Computer Program for Understanding Natural Language MIT AI TR-235. January 1971.
  • Carl Hewitt. Procedural Embedding of Knowledge In Planner IJCAI 1971.
  • G.M. Birtwistle, Ole-Johan Dahl, B. Myhrhaug and Kristen Nygaard. SIMULA Begin Auerbach Publishers Inc, 1973.
  • Daniel Bobrow: A Model for Control Structures for Artificial Intelligence Programming Languages IJCAI 1973.
  • Carl Hewitt, et al. Actor Induction and Meta-evaluation Conference Record of ACM Symposium on Principles of Programming Languages, January 1974.
  • Carl Hewitt, et al. Behavioral Semantics of Nonrecursive Control Structure Proceedings of Colloque sur la Programmation, April 1974.
  • Irene Greif and Carl Hewitt. Actor Semantics of PLANNER-73 Conference Record of ACM Symposium on Principles of Programming Languages. January 1975.
  • Carl Hewitt. How to Use What You Know IJCAI. September, 1975.
  • Alan Kay and Adele Goldberg. Smalltalk-72 Instruction Manual Xerox PARC Memo SSL-76-6. May 1976.
  • Edsger Dijkstra. A discipline of programming Prentice Hall. 1976. Рус. пер. Эдсгер Дейкстра Дисциплина программирования, М.: Мир, 1978
  • Carl Hewitt and Henry Baker Actors and Continuous Functionals Proceeding of IFIP Working Conference on Formal Description of Programming Concepts. August 1–5, 1977.
  • Henry Baker and Carl Hewitt The Incremental Garbage Collection of Processes Proceeding of the Symposium on Artificial Intelligence Programming Languages. SIGPLAN Notices 12, August 1977.
  • Gilles Kahn and David MacQueen. Coroutines and networks of parallel processes IFIP. 1977
  • Aki Yonezawa Specification and Verification Techniques for Parallel Programs Based on Message Passing Semantics MIT EECS Doctoral Dissertation. December 1977.
  • Henry Baker. Actor Systems for Real-Time Computation MIT EECS Doctoral Dissertation. January 1978.
  • Carl Hewitt and Russ Atkinson. Synchronization in Actor Systems Proceedings of the 4th ACM SIGACT-SIGPLAN symposium on Principles of programming languages. 1977
  • Carl Hewitt and Russ Atkinson. Specification and Proof Techniques for Serializers IEEE Journal on Software Engineering. January 1979.
  • Ken Kahn. A Computational Theory of Animation MIT EECS Doctoral Dissertation. August 1979.
  • Carl Hewitt, Beppe Attardi, and Henry Lieberman. Delegation in Message Passing Proceedings of First International Conference on Distributed Systems Huntsville, AL. October 1979.
  • Nissim Francez, C.A.R. Hoare, Daniel Lehmann, and Willem-Paul de Roever. Semantics of nondetermiism, concurrency, and communication Journal of Computer and System Sciences. December 1979.
  • George Milne and Robin Milner. Concurrent processes and their syntax JACM. April 1979.
  • Russ Atkinson. Automatic Verification of Serializers MIT Doctoral Dissertation. June, 1980.
  • Bill Kornfeld and Carl Hewitt. The Scientific Community Metaphor IEEE Transactions on Systems, Man, and Cybernetics. January 1981.
  • Bill Kornfeld. Parallelism in Problem Solving MIT EECS Doctoral Dissertation. August 1981.
  • Daniel Theriault. A Primer for the Act-1 Language MIT AI memo 672. April 1982.
  • Daniel Theriault. Issues in the Design and Implementation of Act 2 MIT AI technical report 728. June 1983.
  • Henry Lieberman. An Object-Oriented Simulator for the Apiary Conference of the American Association for Artificial Intelligence, Washington, D. C., August 1983
  • Carl Hewitt and Peter de Jong. Analyzing the Roles of Descriptions and Actions in Open Systems Proceedings of the National Conference on Artificial Intelligence. August 1983.
  • Carl Hewitt and Henry Lieberman. Design Issues in Parallel Architecture for Artificial Intelligence MIT AI memo 750. Nov. 1983.
  • Daniel Ingalls. The Evolution of the Smalltalk Virtual Machine in Smalltalk-80: Bits of History, Words of Advice. Addison Wesley. 1983.
  • Hal Abelson, Gerald Jay Sussman and Julie Sussman, Structure and Interpretation of Computer Programs MIT Press and McGraw-Hill, 1985.
  • C.A.R. Hoare. Communicating Sequential Processes Prentice Hall. 1985.
  • Carl Hewitt. The Challenge of Open Systems Byte Magazine. April 1985. Reprinted in The foundation of artificial intelligence—a sourcebook Cambridge University Press. 1990.
  • Carl Manning. Traveler: the actor observatory ECOOP 1987. Also appears in Lecture Notes in Computer Science, vol. 276.
  • William Athas and Charles Seitz Multicomputers: message-passing concurrent computers IEEE Computer August 1988.
  • William Athas and Nanette Boden Cantor: An Actor Programming System for Scientific Computing in Proceedings of the NSF Workshop on Object-Based Concurrent Programming. 1988. Special Issue of SIGPLAN Notices.
  • Jean-Pierre Briot. From objects to actors: Study of a limited symbiosis in Smalltalk-80 Rapport de Recherche 88-58, RXF-LITP, Paris, France, September 1988
  • William Dally and Wills, D. Universal mechanisms for concurrency PARLE 1989.
  • W. Horwat, A. Chien, and W. Dally. Experience with CST: Programming and Implementation PLDI. 1989.
  • Carl Hewitt. Towards Open Information Systems Semantics Proceedings of 10th International Workshop on Distributed Artificial Intelligence. October 23–27, 1990. Bandera, Texas.
  • Akinori Yonezawa, Ed. ABCL: An Object-Oriented Concurrent System MIT Press. 1990.
  • K. Kahn and Vijay A. Saraswat, «Actors as a special case of concurrent constraint (logic) programming», in SIGPLAN Notices, October 1990. Describes Janus computer programming language.
  • Carl Hewitt. Open Information Systems Semantics Journal of Artificial Intelligence. January 1991.
  • Carl Hewitt and Jeff Inman. DAI Betwixt and Between: From «Intelligent Agents» to Open Systems Science IEEE Transactions on Systems, Man, and Cybernetics. Nov./Dec. 1991.
  • Carl Hewitt and Gul Agha. Guarded Horn clause languages: are they deductive and Logical? International Conference on Fifth Generation Computer Systems, Ohmsha 1988. Tokyo. Also in Artificial Intelligence at MIT, Vol. 2. MIT Press 1991.
  • William Dally, et al. The Message-Driven Processor: A Multicomputer Processing Node with Efficient Mechanisms IEEE Micro. April 1992.
  • S. Miriyala, G. Agha, and Y.Sami. Visulatizing actor programs using predicate transition nets Journal of Visual Programming. 1992.
  • Alan Kay. The Early History of Smalltalk The second ACM conference on history of programming languages. 1993.
  • Carl Hewitt and Carl Manning. Negotiation Architecture for Large-Scale Crisis Management AAAI-94 Workshop on Models of Conflict Management in Cooperative Problem Solving. Seattle, WA. Aug. 4, 1994.
  • Darrell Woelk. Developing InfoSleuth Agents Using Rosette: An Actor Based Language Proceedings of the CIKM ’95 Workshop on Intelligent Information Agents. 1995.
  • Carl Hewitt and Carl Manning. Synthetic Infrastructures for Multi-Agency Systems Proceedings of ICMAS ’96. Kyoto, Japan. December 8–13, 1996.
  • S. Frolund. Coordinating Distributed Objects: An Actor-Based Approach for Synchronization MIT Press. November 1996.
  • W. Kim. ThAL: An Actor System for Efficient and Scalable Concurrent Computing PhD thesis. University of Illinois at Urbana Champaign. 1997.
  • Jean-Pierre Briot. Acttalk: A framework for object-oriented concurrent programming-design and experience 2nd France-Japan workshop. 1999.
  • N. Jamali, P. Thati, and G. Agha. An actor based architecture for customizing and controlling agent ensembles IEEE Intelligent Systems. 14(2). 1999.
  • Don Box, David Ehnebuske, Gopal Kakivaya, Andrew Layman, Noah Mendelsohn, Henrik Nielsen, Satish Thatte, Dave Winer. Simple Object Access Protocol (SOAP) 1.1 W3C Note. May 2000.
  • M. Astley, D. Sturman, and G. Agha. Customizable middleware for modular distributed software CACM. 44(5) 2001.
  • Carlos Varela. Worldwide Computing with Universal Actors: Linguistic Abstractions for Naming, Migration, and Coordination PhD thesis. U. of Illinois at Urbana-Champaign. 2001.
  • N. Venkatasubramanian, C. Talcott, and G. Agha. A formal model for reasoning about adaptive QoS-enabled middleware Formal Methods Europe (FME). 2001.
  • Edward Lee, S. Neuendorffer, and M. Wirthlin. Actor-oriented design of embedded hardware and software systems Journal of circuits, systems, and computers. 2002.
  • P. Thati, R. Ziaei, and G. Agha. A Theory of May Testing for Actors Formal Methods for Open Object-based Distributed Systems. March 2002.
  • P. Thati, R. Ziaei, and G. Agha. A theory of may testing for asynchronous calculi with locality and no name matching Algebraic Methodology and Software Technology. Springer Verlag. September 2002. LNCS 2422.
  • Gul Agha and Carlos Varela. Worldwide Computing Middleware Practical Handbook on Internet Computing. CRC Press, 2004.
  • Stephen Neuendorffer. Actor-Oriented Metaprogramming PhD Thesis. University of California, Berkeley. December, 2004
  • Carl Hewitt (2006a) The repeated demise of logic programming and why it will be reincarnated What Went Wrong and Why: Lessons from AI Research and Applications. Technical Report SS-06-08. AAAI Press. March 2006.
  • Carl Hewitt (2006b) What is Commitment? Physical, Organizational, and Social COIN@AAMAS. April 27, 2006b.
  • Carl Hewitt (2007a) What is Commitment? Physical, Organizational, and Social (Revised) Pablo Noriega .et al. editors. LNAI 4386. Springer-Verlag. 2007.
  • Carl Hewitt (2007b) Large-scale Organizational Computing requires Unstratified Paraconsistency and Reflection COIN@AAMAS’07.

Ссылки

  • Программная модель акторов
  • A now dated set of speculations by Paul Mackay can be found at Why has the actor model not succeeded?
  • JavAct — a Java library for programming concurrent, distributed, and mobile applications using the actor model (and open implementation principles).
  • Functional Java — a Java library of that includes an implementation of concurrent actors with code examples in standard Java and Java 7 BGGA style.
  • ActorFoundry — a Java-based library for Actor programming. The familiar Java syntax, an ant build file and a bunch of example make the entry barrier very low.
  • ActiveJava — a prototype Java language extension for Actor programming.
  • Исходные тексты примера реализации модели акторов на C++.

Понравилась статья? Поделить с друзьями:

Другие крутые статьи на нашем сайте:

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии