Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LAB_5.doc
Скачиваний:
1
Добавлен:
28.08.2019
Размер:
101.89 Кб
Скачать

2.3.2. Синхронізація процесів

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

Давайте звернемося знову до приведеного вище рисунку 3. Після того, як процес А видасть запит Send(), він не зможе виконуватися до тих пір, поки не отримає відповіді на передане їм повідомлення. Це служить гарантією того, що обробка даних, виконувана процесом В для процесу А завершиться до того, як процес А зможе продовжити свою роботу. У свою чергу процес В після видачі запиту Receive() може продовжувати свою роботу до надходження іншого повідомлення.

2.3.3. Стани блокувань

Коли виконання процесу заборонено до моменту завершення деякої частини протоколу обміну повідомленнями, говорять, що процес "блокований". Стани блокувань процесів приведені в наступній таблиці.

Якщо процес видав

Процес є

1.

Запит Send(), і відправлене їм повідомлення ще не отримано процесом-одержувачем

SEND-блокованим

2.

Запит Send(), і відправлене їм повідомлення отримано процесом-одержувачем, але відповідь ще не видана

REPLY-блокованим

3.

Запит Receive(), але сам ще не отримав повідомлення

RECEIVE-блокованим

Рисунок 4 Стани процесу в типовій транзакції Send-Receive-Reply

2.3.4. Використовування функцій Send(), Receive() і Reply()

Давайте тепер розглянемо функції Send(), Receive() і Reply() більш детально. Як і раніше користуватимемося нашим прикладом взаємодії процесів А і В.

Використовування функції Send()

Припустимо, що процес А видає запит на передачу повідомлення процесу В. Запрос оформляється викликом функції Send()

Send (pid, smsg, rmsg, smsg bn, rmsg len);

Функція Send() має наступні аргументи:

Pid - ідентифікатор процесу-одержувача повідомлення (тобто процесу В); pid - це ідентифікатор, за допомогою якого процес пізнається операційною системою і іншими процесами;

Smsg - буфер повідомлення (тобто посилаючого повідомлення);

Rmsg - буфер відповіді (в який поміщається відповідь процесу В);

smsg len - довжина посилаючого повідомлення;

rmsg len - максимальна довжина відповіді, яка повинна отримати процес А.

Зверніть увагу на те, що в повідомленні буде передано не більш, ніж smsg len байт і прийнято у відповіді не більш, ніж rmsg len байт, - це служить гарантією того, що буфери ніколи не будуть переповнені.

Використовування функції Receive()

Процес В може прийняти запит Send(), виданий процесом А, за допомогою функції Receive()

pid = Receive (0, msg, msg len);

Функція Receive() має наступні аргументи:

pid - ідентифікатор процесу, що послав повідомлення (тобто процесу А);

0 - (нуль) указує на те, що процес В готовий прийняти повідомлення від будь-якого процесу;

msg -буфер, в який буде прийнято повідомлення;

msg len  - максимальна кількість байт даних, яке може поміститися в приймальному буфері.

В тому випадку, якщо значення smsg len у функції Send() і msg len у функції Receive() розрізняються, то кількість переданих даних визначатиметься якнайменшим з них.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]