1.5.5. Синхронний та асинхронний обмін повідомленнями

простір неблокують – лише починають відповідну операцію. Має сенс розглядати взаємодію також із глобальної точки зору. У цьому контексті розрізняють синхронний та асинхронний механізм обміну повідомленнями.

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

Завершення синхронної операції send() свідчить як про те, що семантика передачі виявляється забезпеченої, а й у тому, що одержувач досяг певної точки під час свого виконання, саме виклику відповідної операції receive() . Тому процеси як обмінюються даними, а й синхронізують своє виконання у часі.

Інша перевага синхронного обміну повідомленнями у тому, що передачі повідомлення потрібно використання додаткових буферів, т.к. синхронна операція send() все одно не зможе завершитися, доки не буде викликана відповідна операція receive() . Хоча, звичайно, можлива реалізація цих примітивів і з використанням буферизації. Важливо відзначити, що синхронна операція receive() після отримання повідомлення має надіслати відповідне підтвердження відправнику для завершення операції send() .

У разі використання блокуючих примітивів взаємодії, передача повідомлення за допомогою пари викликів send() і receive() може розглядатися як одна атомарна операція.

Асинхронний обмін повідомленнями При асинхронному обміні повідомленнями немає жодної координації між відправником і одержувачем повідомлення. Для завершення операції send() відправнику не потрібночекати прийому повідомлення Під час надсилання нового повідомлення, відправнику невідомо, чи отримано його попереднє повідомлення, направлене цьому ж чи, можливо, іншому одержувачу. Тому, якщо канал зв'язку між відправником і одержувачем не зберігає порядок повідомлень, що передаються по ньому, тобто. не забезпечує властивість FIFO (англ. First In First Out), одержувач може приймати повідомлення в іншому порядку, ніж вони були передані відправником. Асинхронної операції receive() немає необхідності відсилати відправнику підтвердження (acknowledgement) про прийом повідомлення.

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

У зв'язку з тим, що відправлення та прийом повідомлення не синхронізовані в часі, передача повідомлення за допомогою блокуючих примітивів вимагає наявності додаткових буферів для розміщення надісланих, але не отриманих повідомлень. Як вже обговорювалося, у цьому випадку необхідно визначити поведінку операції send() у ситуаціях переповнення буфера. Якщо блокувати відправника до звільнення необхідного простору, то може виникнути ситуація взаємного блокування процесів. Якщо повідомлення відкидати, комунікацію не можна вважати надійною.