В информатике передача сообщений — это метод вызова поведения (т. е. запуска программы ) на компьютере . Вызывающая программа отправляет сообщение процессу ( который может быть актером или объектом ) и полагается на этот процесс и его поддерживающую инфраструктуру для последующего выбора и запуска соответствующего кода. Передача сообщений отличается от обычного программирования, где процесс, подпрограмма или функция вызываются напрямую по имени. Передача сообщений является ключом к некоторым моделям параллелизма и объектно-ориентированного программирования .
Передача сообщений повсеместно распространена в современном компьютерном программном обеспечении . [ требуется ссылка ] Она используется как способ для объектов, составляющих программу, работать друг с другом и как средство для взаимодействия объектов и систем, работающих на разных компьютерах (например, в Интернете ). Передача сообщений может быть реализована различными механизмами, включая каналы .
Передача сообщений — это метод вызова поведения (т. е. запуска программы) на компьютере. В отличие от традиционного метода вызова программы по имени, передача сообщений использует объектную модель для различения общей функции от конкретных реализаций. Вызывающая программа отправляет сообщение и полагается на объект для выбора и выполнения соответствующего кода. Обоснования использования промежуточного слоя по сути делятся на две категории: инкапсуляция и распределение.
Инкапсуляция — это идея, что программные объекты должны иметь возможность вызывать службы на других объектах, не зная и не заботясь о том, как эти службы реализованы. Инкапсуляция может сократить объем кодирования логики и сделать системы более удобными для обслуживания. Например, вместо того, чтобы иметь операторы IF-THEN, которые определяют, какую подпрограмму или функцию вызывать, разработчик может просто отправить сообщение объекту, и объект выберет соответствующий код на основе его типа.
Один из первых примеров того, как это можно использовать, был в области компьютерной графики. Существуют различные сложности, связанные с манипулированием графическими объектами. Например, простое использование правильной формулы для вычисления площади замкнутой фигуры будет зависеть от того, является ли фигура треугольником, прямоугольником, эллипсом или кругом. В традиционном компьютерном программировании это привело бы к длинным операторам IF-THEN, проверяющим, какой вид объекта был формой, и вызывающим соответствующий код. Объектно-ориентированный способ справиться с этим — определить класс, вызываемый Shape
с подклассами, такими как Rectangle
и Ellipse
(которые, в свою очередь, имеют подклассы Square
и Circle
), а затем просто отправить сообщение любому, Shape
запрашивающему его вычислить его площадь. Shape
Затем каждый объект вызовет метод подкласса с формулой, подходящей для этого вида объекта. [1]
Распределенная передача сообщений предоставляет разработчикам уровень архитектуры, который предоставляет общие службы для создания систем, состоящих из подсистем, работающих на разрозненных компьютерах в разных местах и в разное время. Когда распределенный объект отправляет сообщение, уровень обмена сообщениями может решать такие проблемы, как:
Синхронная передача сообщений происходит между объектами, которые работают одновременно. Она используется объектно-ориентированными языками программирования, такими как Java и Smalltalk .
Синхронный обмен сообщениями аналогичен синхронному вызову функции; так же, как вызывающая функция ждет завершения функции, отправляющий процесс ждет завершения принимающего процесса. Это может сделать синхронную связь неработоспособной для некоторых приложений. Например, большие распределенные системы могут работать недостаточно хорошо, чтобы быть пригодными для использования. Такие большие распределенные системы могут нуждаться в работе, пока некоторые из их подсистем отключены для обслуживания и т. д.
Представьте себе загруженный офис, в котором 100 настольных компьютеров отправляют друг другу электронные письма, используя исключительно синхронную передачу сообщений. Выключение одного работника своего компьютера может привести к зависанию остальных 99 компьютеров, пока работник не включит свой компьютер снова, чтобы обработать одно электронное письмо.
При асинхронной передаче сообщений принимающий объект может быть выключен или занят, когда запрашивающий объект отправляет сообщение. Продолжая аналогию с вызовом функции, это похоже на вызов функции, который немедленно возвращается, не дожидаясь завершения вызванной функции. Сообщения отправляются в очередь, где они хранятся до тех пор, пока принимающий процесс не запросит их. Принимающий процесс обрабатывает свои сообщения и отправляет результаты в очередь для получения исходным процессом (или каким-либо назначенным следующим процессом). [3]
Асинхронный обмен сообщениями требует дополнительных возможностей для хранения и повторной передачи данных для систем, которые не могут работать одновременно, и обычно обрабатывается промежуточным уровнем программного обеспечения (часто называемым промежуточным программным обеспечением ); распространенным типом является промежуточное программное обеспечение, ориентированное на сообщения (MOM).
Буфер, необходимый для асинхронной связи, может вызывать проблемы, когда он заполнен. Необходимо принять решение, блокировать ли отправителя или отбрасывать будущие сообщения. Заблокированный отправитель может привести к взаимоблокировке . Если сообщения теряются, связь перестает быть надежной.
Синхронная связь может быть построена поверх асинхронной связи с помощью синхронизатора . Например, α-синхронизатор работает, гарантируя, что отправитель всегда ждет подтверждающего сообщения от получателя. Отправитель отправляет следующее сообщение только после получения подтверждения. С другой стороны, асинхронная связь также может быть построена поверх синхронной связи. Например, современные микроядра обычно предоставляют только примитив синхронного обмена сообщениями [ требуется цитата ] , а асинхронный обмен сообщениями может быть реализован поверх с помощью вспомогательных потоков .
Системы передачи сообщений используют либо распределенные, либо локальные объекты. В случае распределенных объектов отправитель и получатель могут находиться на разных компьютерах, работать под управлением разных операционных систем, использовать разные языки программирования и т. д. В этом случае уровень шины заботится о деталях преобразования данных из одной системы в другую, отправки и получения данных по сети и т. д. Протокол удаленного вызова процедур (RPC) в Unix был ранним примером этого. При таком типе передачи сообщений не требуется, чтобы отправитель или получатель использовали объектно-ориентированное программирование. Системы процедурных языков можно обернуть и рассматривать как крупнозернистые объекты, способные отправлять и получать сообщения. [4]
Примерами систем, поддерживающих распределенные объекты, являются: Emerald , ONC RPC , CORBA , Java RMI , DCOM , SOAP , .NET Remoting , CTOS , QNX Neutrino RTOS , OpenBinder и D-Bus . Системы распределенных объектов называются системами «ничего общего», поскольку абстракция передачи сообщений скрывает базовые изменения состояния, которые могут использоваться при реализации отправки сообщений.
Распределенная или асинхронная передача сообщений имеет дополнительные накладные расходы по сравнению с вызовом процедуры. При передаче сообщений аргументы должны быть скопированы в новое сообщение. Некоторые аргументы могут содержать мегабайты данных, все из которых должны быть скопированы и переданы принимающему объекту.
Традиционные вызовы процедур отличаются от передачи сообщений с точки зрения использования памяти, времени передачи и локальности. Аргументы передаются получателю обычно регистрами общего назначения, не требующими дополнительного хранения или времени передачи, или в списке параметров , содержащем адреса аргументов (несколько бит). Передача адресов невозможна для распределенных систем, поскольку системы используют отдельные адресные пространства.
Веб -браузеры и веб-серверы являются примерами процессов, которые взаимодействуют посредством передачи сообщений. URL является примером ссылки на ресурс без раскрытия внутренних процессов.
Вызов подпрограммы или вызов метода не завершится, пока вызванное вычисление не будет завершено. Асинхронная передача сообщений, напротив, может привести к тому, что ответ прибудет спустя значительное время после отправки сообщения-запроса .
Обработчик сообщений, как правило, обрабатывает [5] сообщения от более чем одного отправителя. Это означает, что его состояние может меняться по причинам, не связанным с поведением одного отправителя или клиентского процесса. Это контрастирует с типичным поведением объекта, для которого вызываются методы: ожидается, что последний останется в том же состоянии между вызовами методов. Другими словами, обработчик сообщений ведет себя аналогично изменчивому объекту .
Известными математическими моделями передачи сообщений являются модель актора и исчисление Пи . [6] [7] В математических терминах сообщение — это единственное средство передачи управления объекту. Если объект отвечает на сообщение, у него есть метод для этого сообщения.
Алан Кей утверждал, что передача сообщений важнее объектов в ООП, и что сами объекты часто переоцениваются. Модель программирования живых распределенных объектов строится на этом наблюдении; она использует концепцию распределенного потока данных для характеристики поведения сложной распределенной системы в терминах шаблонов сообщений, используя высокоуровневые спецификации функционального стиля. [8]
{{cite journal}}
: Цитировать журнал требует |journal=
( помощь )