Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Модуль 3.docx
Скачиваний:
59
Добавлен:
05.03.2016
Размер:
197.42 Кб
Скачать

10.4.3 Передача повідомлень

Здійснення повідомлень в PVM призначена для передачі даних між різними процесами і складається з трьох кроків. По-перше, буфер даних перед посиланям повинен бути ініціалізований першим з використанням функцій pvm_initsend () або pvm_mkbuf (). По-друге, дані, що пересилаються повинні бути упаковані в цей буфер. Для пакування використовується деяка кількість комбінацій викликів функції pvm_pk * (). У FORTRAN упаковка даних проводиться підпрограмою pvmfpack (). Третій крок полягає у пересиланні даних адресатам. Для цієї мети в залежності від списку адресатів використовується виклик функції pvm_send (), в параметрах яких вказується конкретний процес-приймач, або функції pvm_mcast (), що використовується для всеспрямованої передачі.

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

1) Для прийому будь-яких повідомлень.

2) Для прийому будь-яких повідомлень від певного джерела.

3) Для прийому будь-яких повідомлень з певним message tag.

4) Для прийому будь-яких повідомлень з певним message tag з певного джерела.

Крім того, існує функція для перевірки факту доставки повідомлення адресатові.

Буфер повідомлення call pvmfinitsend (encoding, bufid).

Якщо користувач використовує тільки один буфер повідомлення, то єдина необхідна для роботи з буфером функція - це pvm_initsend (). Ця функція викликається безпосередньо перед упаковкою нової порції пересилаючих даних в буфер повідомлення. Функція pvm_initsend звільняє буфер і створює новий для пакування в нього даних. Схема кодування упаковується в буфер даних і вказується завданням змінної encoding. Повернене в змінну bufid значення є ідентифікатором буфера.

Мінлива encoding може приймати такі значення:

1) PvmDataDefault - XDR кодування, що використовується в PVM за замовчуванням. Це кодування використовується зазвичай в гетерогенних кластерах, коли PVM не може знати чи розуміє приймаюча сторона відповідний формат даних. Наприклад, коли дані передаються з Linux-машини на Windows-машину. У випадку, коли в кластері використовується тільки один тип операційної машини або коли користувач впевнений, що приймаюча сторона зрозуміє все правильно, слід використовувати тип кодування PvmDataRaw.

2) PvmDataRaw - без кодування. Дані передаються без будь-яких змін. Якщо приймаюча сторона не зможе правильно прочитати цей формат, це викличе повернення коду помилки в процесі розпаковування.

3) PvmDataInPlace - дані залишаються на місці, не переміщаючись в буфер посилки. Цей тип кодування можна використовувати для зниження накладних витрат, пов'язаних з переміщенням даних в буфер. У цьому випадку буфер містить тільки довжини і покажчики на дані, що передаються. При виклику pvm_send () дані копіюються безпосередньо з того місця, де вони знаходяться. Використання цього кодування накладає одне обмеження. Передані дані не повинні бути змінені між моментом, коли почалася їх упаковка і моментом закінчення передачі буфера повідомлення адресату. Однак, при використанні даного типу упаковки, є одна помітна перевага. Функція упаковки pvm_initsend може бути викликана тільки один раз на початку програми. Наприклад на початку роботи програми ми можемо упакувати дані з області перекриття і передавати їх безліч разів в міру необхідності.