ТОП 10:

Основи передавання повідомлень



Усі методи взаємодії, які було розглянуто дотепер, ґрунтуються на читанні й запи­суванні спільно використовуваних даних. На практиці така взаємодія не завжди можлива (наприклад, робота зі спільно використовуваними даними проблема­тична, якщо для процесів немає спільної фізичної пам'яті, а є тільки мережний зв'язок між комп'ютерами, на яких вони виконуються). У таких випадках можна використати засоби взаємодії, які не ґрунтуються на спільно використовуваних даних, передусім засоби передавання повідомлень [27, 37, 57].

Як було вже згадано, засоби передавання повідомлень ґрунтуються на обміні повідомленнями — фрагментами даних змінної довжини. Основою такого обмі­ну є не спільна пам'ять, а канал зв'язку (communication channel). Він забезпечує взаємодію між процесами (для того, щоб спілкуватися, вони повинні створи­ти канал зв'язку) і є абстрактним відображенням мережі зв'язку. Абстрактність каналу дає змогу реалізувати його не тільки на основі мережної взаємодії, але й спільної пам'яті (коли процеси перебувають на одному комп'ютері). При цьому такі зміни в реалізації будуть сховані від процесів, що взаємодіють.

Виокремлюють такі характеристики каналів зв'язку: спосіб задання; кількість процесів, які можуть бути з'єднані одним каналом; кількість каналів, які можуть бути створені між двома процесами; пропускна здатність каналу (кількість пові­домлень, які можуть одночасно перебувати в системі й бути асоційованими з цим каналом); максимальний розмір повідомлення; спрямованість зв'язку через ка­нал (двобічний або однобічний зв'язок).

В однобічному зв'язку для конкретного процесу допускають передавання да­них тільки в один бік.

Примітиви передавання повідомлень

Основна особливість передавання повідомлень полягає в тому, що процеси спіль­но використовують тільки канали. Немає необхідності забезпечувати взаємне ви­ключення процесів під час доступу до спільно використовуваних даних, замість цього досить визначити примітиви передавання повідомлень — спеціальні опера­ції обміну даними через канал, які забезпечують не лише обмін даними, але й син­хронізацію.

Є два примітиви передавання повідомлень: send (для відсилання повідомлен­ня каналом) і гесеі ve (для отримання повідомлення з каналу).

Розглянемо, як особливості реалізації send і гесеі ve дають змогу виділити різ­ні класи методів передавання повідомлень.

Зазначені примітиви передавання повідомлень можуть задавати прямий і не­прямий обмін даними. При прямому обміні даними необхідно явно вказувати процес, з яким необхідно обмінюватись інформацією. Непрямий обмін здійснюють через спеціальний об'єкт (поштову скриньку, порт); процеси можуть поміщати повідомлення в поштову скриньку і отримувати їх звідти. Зазвичай кілька процесів мають доступ до однієї поштової скриньки, застосовуючи під час її пошуку мето­ди іменування. Більшість сучасних технологій обміну повідомленнями використо­вує непрямий обмін даними. Прикладом прямого обміну є традиційні сигнали.

Синхронне й асинхронне передавання повідомлень

Зупинимося на основних питаннях синхронізації під час передавання повідомлень. Можна виокремити різні групи методів передавання повідомлень залежно від то­го, як вони дають можливість відповісти на два запитання.

1. Чи може потік бути призупинений під час виконання операції send, якщо пові­домлення не було отримане?

2. Чи може потік бути призупинений під час виконання операції receive, якщо повідомлення не було відіслане?

У реальних системах відповідь на друге запитання практично завжди буде по­зитивною неблокувальне приймання повідомлень спричиняється до того, що вони губляться. Варіанти відповідей на перше запитання визначають два класи передавання повідомлень - синхронне і асинхронне.

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

Реалізація синхронного й асинхронного передавання повідомлень залежить від низки характеристик каналу й обміну повідомленнями, насамперед від пропуск­ної здатності каналу.

♦ Якщо пропускна здатність дорівнює нулю (повідомлення не можуть очікува­ти в системі), відправник завжди має очікувати, поки одержувачу не надійде повідомлення, а одержувач має очікувати, поки повідомлення йому не буде ві­діслано. Два процеси мають явно домовлятися про майбутній обмін.

♦ Якщо пропускна здатність обмежена (у системі можуть перебувати максимум п повідомлень для цього каналу), відправник має очікувати тільки тоді, коли черга повідомлень для цього каналу переповнена (у ній перебуває рівно п по­відомлень), одержувач має очікувати, якщо ця черга порожня.

♦ Якщо пропускна здатність необмежена, очікування можливе тільки для одер­жувача за порожньої черги.

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

Розв'язання задачі виробників-споживачів за допомогою передавання повідомлень

Розглянемо розв'язання задачі виробників-споживачів із використанням асин­хронного передавання повідомлень. Організовують дві поштові скриньки — для виробника і для споживача. Якщо скринька порожня, потік очікуватиме, поки в ній не з'явиться повідомлення.

Поштові скриньки виробника та споживача мають свої особливості.

Скринька виробника може містити тільки порожні повідомлення загальною кількістю не більше п. Наявність т повідомлень у цій скриньці служить сигналом для виробника, що в буфері є місце для т об'єктів. Щоб відіслати дані в буфер, виробник забирає зі скриньки одне повідомлення, заповнює його даними і від­силає в скриньку споживача. Заповнивши буфер, виробник спустошить свою скриньку і буде змушений чекати, поки споживач не помістить у неї порожнє по­відомлення.

Повідомлення у скриньці споживача відповідають об'єктам у буфері. Після того як споживач забере повідомлення з цієї скриньки, він використає його дані й відішле порожнє повідомлення у скриньку виробника, сигналізуючи, що в бу­фері з'явилося місце. Порожня скринька споживача означає порожній буфер -споживач чекатиме, поки виробник не помістить заповнене повідомлення в цю скриньку.

На початку роботи скриньку виробника заповнюють порожніми повідомлен­нями загальним числом п (це буде означати, що він може зробити п об'єктів).

Функції producerC) і consumer() схожі. І виробник, і споживач у циклі намага­ються забрати повідомлення зі своїх скриньок. Якщо це вдається виробникові, він заповнює повідомлення даними і відсилає його у скриньку споживача, як­що це сможе зробити споживач, він скористається повідомленням і відішле по­рожнє повідомлення у скриньку виробника. Після цього цикл триває.

 

 

Основна відмінність цього розв'язання від запропонованих у розділі 5 поля­гає в тому, що воно не залежить від спільно використовуваних даних. Доступ до поштових скриньок може бути виконаний за допомогою системних викликів, що приховують їхнє місцезнаходження; скриньки можуть бути й віддаленими. Це дає змогу застосовувати алгоритм тоді, коли виробник і споживач є різними про­цесами, а можливо, й перебувають на різних комп'ютерах.







Последнее изменение этой страницы: 2017-02-06; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.235.29.190 (0.004 с.)