static int
* start_workers (argv)
* char **argv;
* {
* int info, i;
* int n; /*
stevilo delavcev, ki so usposobljeni za delo */
* int narch; /*
stevilo razlicnih podatkovnih formatov (little/big endian) */
* int numt; /*
celotno ctevilo nalog, ki jih je potrebno obdelati */
Podatke o ustroju navideznega racunalnika dobimo s klicem konfiguracijske funkcije, ki vrne stevilo streznikov, stevilo razlicnih arhitektur in podrobne podatke o posameznih racunalnikih, ki so trenutno prijavljeni v sistemu.
info = pvm_config(&nhost, &narch, &hostp);
Ce podatki o navideznem racunalniku niso dostopni, se nadaljnje akcije prekinejo. Pred tem se se izpise informacija o vrsti napake, da je odpravljanje nepravilnosti pri zagonu navideznega racunalnika lazje. Na vsakem racunalniku sistema PVM mora teci demon (PVM daemon), ki skrbi za zagon programov (delavcev).
if (info < 0) /*
Ce se pvmd upravnika ne odziva */
* {
* pvm_perror(argv[0]);
* return -1;
* }
Izpis lastnosti navideznega racunalnika vsebuje tudi lastnosti, ki trenutno se niso implementirane (relativne hitrosti, obremenjenost racunalnikov).
if (verbose)
* {
* printf ("Currently available
%
d hosts with
%
d data type(s):\n",
* nhost, narch);
for (i = 0; i < nhost; i++)
* {
* printf("t
%
x\t
%
20s
%
15s
%
10d\n", hostp[i].hi_tid,
* hostp[i].hi_name, hostp[i].hi_arch,
* hostp[i].hi_speed);
* }
* }
Ker sestava navideznega racunalnika vnaprej ni poznana, je potrebno dinamicno alocirati vsa spominska polja, ki so odvisna od stevila vozlisc.
servtids = (int *) malloc(nhost * sizeof(int));
* servflist = (int *) malloc(nhost * sizeof(int));
* servjobs = (int *) malloc(nhost * sizeof(int));
* servtiles = (int *) calloc(nhost, sizeof(int));
Na zacetku del so vsi strezniki prosti vseh del.
servfree = -1;
Sistem PVM omogoca vzporeden zagon vseh delavcev.
numt = pvm_spawn (CHILDNAME, argv + 1, PvmTaskDefault, "", nhost, servtids);
Ker ni nujno, da obstajajo delavci na vseh racunalnikih, je potrebno preveriti, kateri racunalniki so se odzvali na poziv in izlociti iz obravnavanja neustrezne delavce.
if (numt < 0)
* {
* pvm_perror ("Error spawning slaves.");
* pvm_exit();
* return -1;
* }
Po kontroli izpisemo potrebne podatke o racunalnikih, ki se niso odzvali na poziv k sodelovanju.
for ( i = n = 0; i < nhost; i++)
* {
* if (servtids[i] < 0)
* {
* fprintf(stderr, "can't initiate worker '
%
s'"
* "TID:
%
d ERROR:
%
d
%
s\n",
* CHILDNAME, i, servtids[i], pvm_errlist[-servtids[i]]);
* }
* else
* {
* servtids[n] = servtids[i];
* servflist[n] = servfree;
* servfree = n++;
* }
* }
if (n != nhost)
* {
* if ((nserv = n))
* fprintf(stderr, "using only
%
d workers\n", n);
* else
* {
* fprintf(stderr, "ack, no workers\n");
* return -1;
* }
* }
* else
* nserv = nhost;
return 0;
* }