PvmDataDefaultXDR
PvmDataRaw Без специального кодирования
PvmDataInPlaceВ буфер отправки копируются лишь указатели и раз м ер данных
Вот пример: int BufferId;
BufferId = pvm_initsend(PvmDataRaw); //.. .
Здесь константа PvmDataRaw,переданнал функции pvm_initsend()в качестве параметра, означает, что данные упаковываются в буфер как есть, т.е. без специально г о кодирования. При успешном выполнении функция возвра щ ает номер буфера отправки (в данном случае он будет записан в переменную BufferId).Важно помнить, что хотя в каждый момент времени активным может быть только один буфер отправки, Любая PVM-задача может иметь несколько таких буферов, и с каждым из них связывается некоторый идентификационный номер.
В библиотеке PVM прелусмотрено несколько функций, имею щ их отношение к процелуре отправки.
Синопсис
# include «pvm3 .h»
int pvm_send(int taskid, int messageid); int pvm_psend(int taskid, int messageid,
char *buffer,int len, int datatype); int pvm_mcast(int *taskid,int ntask,int messageid);
В каждой из этих функций параметр taskidпредставл я ет собой идентификатор PVM-задачи, которая принимает сооб щ ение. При вызове функции pvm_mcast() параметр taskidозначает коллекцию задач, представл я емых идентификаторами, которые передаютс я в массиве *taskid.Параметр messageidуказывает идентификатор посылаемо г о сооб щ ени я. Идентификаторы сооб щ ений представл я ют собой целочисленные значени я, определенные пользователем. Они используются отправителем и получателем дл я идентификации сооб щ ени я, например:
pvm_bufinfo (N, &NumBytes, &MessageId, &Ptid) ; //. . .
switch(MessageId) {
case 1 : // Некоторые действия, break;
case 2 : // Другие действия, break
//. . .
}
В данном случае функци я pvm_bufinfo()используетс я дл я получени я информации о последнем сооб щ ении, прин я том в буфер приема N.Мы можем получить количество байтов, идентификатор сооб щ ени я (messageid)и узнать, кто его отправил. Знал значение messageid,мы можем выполнить соответствую щ ие логические действи я. Функци я pvm_send() посылает заданной задаче команду псевдоблокировани я, после приема которой задача блокируетс я до тех пор, пока отправитель не убедится в том, что сообщение было послано правиль н о. Задача-отправитель не ожидает реального получени я сооб щ ения. Функция pvm_psend() отправляет сооб щ ение непосредственно указанной задаче. Обратите внимание на то, что функция pvmj?send () имеет параметр buffer, используемый в качестве буфера для хранения посылаемого сообщения. Функция pvm_mcast () используется для отправки сообщения нескольким задачам одновременно. Аргументы, передавае м ые функции pvm_mcast (), включают массив идентификаторов задач-получателей сообщения (taskid), количество задач — участников «широковещания» (ntask) и идентификатор сообщения (messageid) для идентификации отправляемого сооб щ ения. На рис. 6.6 показано, что у каждой PVM-задачи есть собственный буфер отправки, который существует в течение про м ежутка вре м ени, длительности которого было бы достаточно, чтобы сообщение гарантированно дошло до адресата.
За исключение м управляющих сообщений, значение сообщений, которы м и обмениваются любые две PVM-задачи, заранее определено логикой конкретного приложения, т.е. назначение каждого сообщения должно быть заранее известно для задачи-отправителя и задачи-получателя. Эти сообщения передаются асинхронно, могут иметь любой тип данных и произвольную длину. Тем са м ы м д ля приложения обеспечивается максимальнал гибкость. Аналога м и отправляе м ых РУМкюоб щ ений являются принимаемые PVM-сооб щ ения. Так, за прие м сооб щ ений «отвечают» пять основных функций.
Синопсис
# inc lude " pvm3 . h»
int pvm_recv(int taskid, int messageid) ;
int pvm_nrecv(int taskid, int messageid) ;
int pvm_precv(int taskid, int messageid, char *buffer,
int size,int type, int sender,
int messagetag, int messagelength); int pvm_trecv(int taskid,int messageid,
struct timeval *timeout); int pvm_probe(int taskid , int messageid);
Функция pvm_recv () используется о д ни м и PVM-за д ача м и для получения сооб щ ений от других. Эта функция создает новый активный буфер, предназначенный для хранения полученного сооб щ ения. Пара м етр taskid определяет идентификатор задачи-отправителя. Пара м етр messageid идентифицирует сооб щ ение, которое послано отправителе м. Следует и м еть в виду, что задача м ожет отправить несколько сообщений, и м ею щ их различные или одинаковые идентификаторы (messageid). Если taskid = -1,то функция pvm_recv () при м ет сооб щ е н ие от любой задачи. Ec-лиmessageid = -1,то функция при м ет любое сооб щ ение. При успешном выполнении функция pvm_recv () возвра щ ает идентификатор нового активного буфера, в противном случае — отрицательное значение. После вызова функции pvm_recv () задача будет заблокирована и станет ожидать до тех пор, пока сооб щ ение не будет получено. После получения сооб щ ение считывается из активного буфера с помо щ ью одной из функций распаковки, напри м ер:
Читать дальше