next up previous contents
Next: B.1.3 Razposiljanje naloge delavcem Up: B.1 Upravitelj Previous: B.1.1 Glavni program Vsebina: contents

B.1.2 Dolocitev in zagon delavcev

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;
* }


Copyright © 1995 Leon Kos, Univerza v Ljubljani