Передача сообщений - Message passing

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

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

Обзор

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

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

Один из первых примеров того, как это можно использовать, был в области компьютерной графики. Манипулирование графическими объектами связано с различными сложностями. Например, простое использование правильной формулы для вычисления площади замкнутой формы будет зависеть от того, является ли форма треугольником, прямоугольником, эллипсом или кругом. В традиционном компьютерном программировании это привело бы к длинным операторам IF-THEN, которые проверяют, какой объект имеет форма, и вызывают соответствующий код. Объектно-ориентированный способ справиться с этим - определить класс с именем Форма с подклассами, такими как Прямоугольник и Эллипс (которые, в свою очередь, имеют подклассы Квадрат и Круг), а затем просто отправить сообщение любому Форма прося его вычислить его площадь. Каждый Форма Затем объект вызовет метод подкласса с формулой, подходящей для этого типа объекта.[1]

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

  • Поиск процесса с использованием разных операционных систем и языков программирования в разных местах происхождения сообщения.
  • Сохранение сообщения в очереди, если соответствующий объект для обработки сообщения в данный момент не запущен, а затем вызов сообщения, когда объект доступен. Кроме того, при необходимости, сохранение результата до тех пор, пока отправляющий объект не будет готов его принять.
  • Управление различными транзакционными требованиями для распределенных транзакций, например КИСЛОТА -тестирование данных.[2]

Синхронная и асинхронная передача сообщений

Синхронная передача сообщений

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

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

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

Асинхронная передача сообщений

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

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

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

Гибриды

Синхронная связь может быть построена на основе асинхронной связи с помощью Синхронизатор. Например, α-Synchronizer работает, гарантируя, что отправитель всегда ждет сообщения подтверждения от получателя. Отправитель отправляет следующее сообщение только после получения подтверждения. С другой стороны, асинхронная связь также может быть построена на основе синхронной связи. Например, современные микроядра обычно предоставляют только синхронный обмен сообщениями примитивный[нужна цитата ] и асинхронный обмен сообщениями может быть реализован поверх, используя вспомогательные потоки.

Распределенные объекты

Системы передачи сообщений используют распределенные или локальные объекты. В случае распределенных объектов отправитель и получатель могут находиться на разных компьютерах, работать с разными операционными системами, использовать разные языки программирования и т. Д. В этом случае уровень шины заботится о деталях преобразования данных из одной системы в другую, отправке и получении данных через сеть и т. д. Удаленный вызов процедур (RPC) протокол в Unix был ранним примером этого. Обратите внимание, что для этого типа передачи сообщений не требуется, чтобы отправитель или получатель использовали объектно-ориентированное программирование. Системы процедурного языка можно обернуть и рассматривать как крупнозернистые объекты, способные отправлять и получать сообщения.[4]

Примеры систем, поддерживающих распределенные объекты: Изумруд, ONC RPC, CORBA, Java RMI, DCOM, МЫЛО, .NET Remoting, CTOS, ОСРВ QNX Neutrino, OpenBinder и D-автобус. Распределенные объектные системы были названы системами с «ничего не разделяемым», потому что абстракция передачи сообщений скрывает основные изменения состояния, которые могут быть использованы при реализации отправки сообщений.

Передача сообщений против звонков

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

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

Интернет браузеры и веб-серверы являются примерами процессов, которые общаются посредством передачи сообщений. А URL - это пример ссылки на ресурс без раскрытия внутренних компонентов процесса.

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

Обработчик сообщений, как правило, обрабатывает сообщения от более чем одного отправителя. Это означает, что его состояние может измениться по причинам, не связанным с поведением отдельного отправителя или клиентского процесса. Это контрастирует с типичным поведением объекта, для которого вызываются методы: ожидается, что последний будет оставаться в том же состоянии между вызовами методов. Другими словами, обработчик сообщений ведет себя аналогично летучий объект.

Математические модели

Известные математические модели передачи сообщений - это Актерская модель и Пи исчисление.[5][6] С математической точки зрения сообщение - это единственное средство передать управление объекту. Если объект отвечает на сообщение, он имеет метод для этого сообщения.

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

Примеры

Смотрите также

Рекомендации

  1. ^ Гольдберг, Адель; Дэвид Робсон (1989). Smalltalk-80 Язык. Эддисон Уэсли. С. 5–16. ISBN  0-201-13688-0.
  2. ^ Орфали, Роберт (1996). Основное руководство по выживанию клиент / сервер. Нью-Йорк: Wiley Computer Publishing. стр.1–22. ISBN  0-471-15325-7.
  3. ^ Орфали, Роберт (1996). Основное руководство по выживанию клиент / сервер. Нью-Йорк: Wiley Computer Publishing. стр.95–133. ISBN  0-471-15325-7.
  4. ^ Орфали, Роберт (1996). Основное руководство по выживанию клиент / сервер. Нью-Йорк: Wiley Computer Publishing. стр.375–397. ISBN  0-471-15325-7.
  5. ^ Милнер, Робин (январь 1993 г.). «Элементы взаимодействия: лекция о премии Тьюринга». Коммуникации ACM. 36 (1): 78–89. Дои:10.1145/151233.151240.
  6. ^ Карл Хьюитт; Питер Бишоп; Ричард Штайгер (1973). «Универсальный модульный актерский формализм для искусственного интеллекта». IJCAI. Цитировать журнал требует | журнал = (помощь)
  7. ^ Кей, Алан. "прототипы против классов: Re: Sun's HotSpot". lists.squeakfoundation.org. Получено 2 января 2014.
  8. ^ «Использование передачи сообщений для передачи данных между потоками - язык программирования Rust». doc.rust-lang.org.

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

внешняя ссылка