next up previous contents
Next: Информация Up: PVM - параллельная виртуальная Previous: Пользовательский интерфейс PVM   Contents

Контроль процессов

int tid = pvm_mytid(void)

call pvmfmytid (tid)

Подпрограмма pvm_mytid() возвращает TID текущего процесса и может вызываться неограниченное число раз. Она регистрирует данный процесс в PVM - если это ее первый вызов. Любой системный вызов PVM (не только pvm_mytid) будет регистрировать задачу в PVM, если перед этим вызовом задача не зарегистрирована, но общая практика требует для обеспечения регистрации вызова pvm_mytid.

int info = pvm_exit(void)

call pvmfexit(info)

Подпрограмма pvm_exit сообщает локальному pvmd о том, что процесс ``покинул'' PVM. Эта подпрограмма не завершает процесс принудительно - он может продолжать выполнять задачу наряду с другими процессами UNIX. Пользователи обычно вызывают pvm_exit прямо перед выходом - в своих программах на C - и прямо перед STOP - в своих программах на Фортране.

int numt = pvm_spawn (char *task, char **argv, int flag,

    char *where, int ntask, int *tids)

call pvmfspawn (task, argv, flag, where, ntask, tids,

     numt)

Подпрограмма pwm_spawn запускает до ntask копий исполняемого файла task на виртуальной машине; argv - это указатель на массив аргументов для task, причем конец массива указывается с помощью NULL. Если задача не получает аргументов, то argv равняется NULL. Аргумент flag используется для указания опций, которые обобщены в табл. 12 (см.).


Таблица 12. Опции порождения потомков в PVM


Значение Опция Cмысл
0 PvmTaskDefault Место порождения процессов выбирает сама PVM
1 PvmTaskHost аргумент where - определенный хост для порождения
2 PvmTaskArch аргумент where - PVM_ARCH для порождения
4 PvmTaskDebug запускает задачи под отладчиком
8 PvmTaskTrace генерируются трассировочные данные
16 PvmMppFront задачи запускаются в среде MPP
32 PvmHostCompl where дополняет набор хостов

Эти имена предопределены в pvm3/include/pvm3.h. На Фортране все имена предопределяются в параметрических конструкциях, которые могут быть найдены в разделе include файла
pvm3/include/pvm3.h.

PvmTaskTrace - это новая возможность PVM версии 3.3. Она заставляет порождаемые задачи генерировать трассировочные события. PvmTaskTrace используется XPVM. В ином случае пользователь должен с помощью pvm_setopt() указать, когда генерировать трассировочные события.

При возврате переменной numt присваивается количество успешно порожденных задач или код ошибки, если ни одна из задач не смогла стартовать. Если задачи были запущены, то pwn_spawn вернет вектор, состоящий из идентификаторов порожденных задач; если не смогли стартовать лишь некоторые задачи, соответствующие коды ошибок помещаются в последние ntask - numt позиций вектора.

Вызов pvm_spawn() может также запускать задачи и на мультипроцессорах. В случае с Intel iPSC/860 накладываются следующие ограничения. Каждый порождающий вызов получает подкуб размера ntask и загружает программу task во все соответствующие станции. ОС iPSC/860 имеет распределительное ограничение: 10 подкубов для всех пользователей, так что лучше запустить блок из задач в iPSC/860 одним вызовом, чем несколькими. Два самостоятельных блока задач, порожденные в iPSC/860 раздельно, все равно могут взаимодействовать друг с другом так же, как и с другими задачами PVM, даже с учетом того, что они существуют в разных подкубах. ОС iPSC/860 имеет еще одно ограничение: сообщения, следующие от станций во ``внешний мир'', должны быть меньше 256 КБайтов.

int info = pvm_kill (int tid)

call pvmfkill (tid, info)

Подпрограмма pvm_kill() принудительно завершает некоторую задачу PVM, идентифицированную TID. Эта подпрограмма разработана для принудительного завершения задач, которые должны завершаться вызовами pvm_exit(), следующими за exit().

int info = pvm_catchout (FILE *ff)

call pvmfcatchout (onoff)

По умолчанию PVM записывает stdout и stderr порожденных задач в файл протокола /tmp/pvml.<uid>. Подпрограмма pvm_catchout заставляет вызывающую задачу ``перехватывать'' выходной поток последовательно порожденных задач. Символы, выводимые в stdout или stderr дочерних задач, собираются демонами pvmd и отсылаются в форме сообщений родительской задаче, которая ``помечает'' каждую строку и добавляет ее в указанный файл (для C) или выводит в стандартный поток вывода (для Фортрана). Все выводимое на экран предваряется информацией о том, какая из задач сгенерировала вывод на экран, а завершение каждого вывода отметчается с целью помочь разграничить ``перекрывающиеся'' выходные потоки нескольких задач.

Если pvm_exit вызывается предком тогда, когда активирован сбор выходных потоков, он будет блокироваться до тех пор, пока все задачи, выполняющие вывод, не отработают в том порядке, в котором они осуществляли весь свой вывод. Во избежание такой ситуации можно ``выключить сбор выходных потоков'' вызовом pvm_catchout(0) перед тем, как вызвать pvm_exit.

Новые возможности PVM версии 3.3 включают и возможность регистрировать специальные задачи PVM для обработки заданий по включению новых хостов, размещению задач на хостах и запуску новых задач. С этой целью создается интерфейс для ``продвинутых'' пакетных планировщиков (примерами могут быть Condor, DQS и LSF), которые подключаются к PVM и позволяют выполнять задания PVM в пакетном режиме. Такие регистрирующие подпрограммы также создают интерфейс для разработчиков отладчиков - для стимулирования удовлетворительных разработок сложных отладчиков специально для PVM.

Имена таких подпрограмм: pvm_reg_rm(), pvm_reg_hoster() и
pvm_reg_tasker(). Эти ``продвинутые'' функции не имеют значения для среднестатистического пользователя PVM и потому здесь подробно не рассматриваются.


next up previous contents
Next: Информация Up: PVM - параллельная виртуальная Previous: Пользовательский интерфейс PVM   Contents
2004-06-22