stringtranslate.com

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

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

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

Обзор

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

Инкапсуляция — это идея, что программные объекты должны иметь возможность вызывать службы на других объектах, не зная и не заботясь о том, как эти службы реализованы. Инкапсуляция может сократить объем кодирования логики и сделать системы более удобными для обслуживания. Например, вместо того, чтобы иметь операторы 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]

Примеры

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

Ссылки

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

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

Внешние ссылки