next up previous contents
Next: B.1.4 Upodabljanje Up: B.1 Upravitelj Previous: B.1.2 Dolocitev in zagon Vsebina: contents

B.1.3 Razposiljanje naloge delavcem

Upravnik ima moznost komprimiranega ali nekomprimiranega razposiljanja podatkov scene. Naloga vseh delavcev je skupna, le da nadzornik dodeljuje pozamezne podnaloge.

static int
* send_scene(file_name)
* char *file_name;
* {
* FILE *f;
* static char *buffer = 0;
* static long length = 0;
* long position = 0;
* long file_size;
* int info;

length = 10 * SCENEBUFSIZE * sizeof(char);
* buffer = (char *)malloc(length);

if (buffer == NULL)
* {
* fputs("Out of memory in send_scene()", stderr);
* return -2;
* }

Za stiskanje podatkov podatkov se uporabi enostaven pristop k medprocesni komunikaciji s pomocjo cevi. Uporabnik ima moznost izbire standardnega programa za kompresijo compress ali boljsega kot je gzip.

#if COMPRESSED
* {
* char command[MAXFILENAME + 20];
* sprintf(command, "%s -c %s", COMPRESSPRG, file_name);
* f = popen(command, "r");
* }
* #else
* f = fopen(file_name, "r");
* #endif

if (f == NULL)
* return -1;

if (verbose)
* puts("Reading and compressing scene file...");

while ((file_size = fread(buffer + position, 1, SCENEBUFSIZE, f)) != 0)
* {
* position += file_size;
* if ( (position + SCENEBUFSIZE) > length)
* {
* length *= 2;
* buffer = realloc(buffer, length);
* if (buffer == NULL)
* {
* fputs("Out of memory in send_scene()", stderr);
* return -2;
* }
* if (verbose > 2)
* fprintf(stderr, "+%ld", file_size);

}
* }

#if COMPRESSED
* pclose (f);
* #else
* fclose (f);
* #endif

file_size = position;

if (verbose)
* fprintf(stdout, "Multicasting scene '%s' size = %ld\n",
* file_name, file_size);

Razposiljanje sporocil med vozlisci navideznega racunalnika je normalno izvedeno z enim od ukazov iz skupine send. Za razposiljanje enakih sporocil vsem vozliscm pa je bolje uporabiti ukaz za vzporedno distribucijo sporocil. Vsako posiljanje sporocil se zacne z inicializacijo razposiljanja, ki inicializira vmesni pomnilnik in kodiranje sporocil. Sporocilo je lahko sestavljeno iz vec razlicnih podatkov, ki so zlepljeni in poslani naslovniku. Pri posiljanju datoteke scene se tako poslje ime datoteke, velikost in datoteka, kot eno samo sporocilo. Vsako sporocilo je opremljeno tudi s stevilko, da je mozno enolicno razpoznavati sporocila. Sistem PVM sicer skrbi za sinhronizacijo sporocil v celotnem sistemu, vendar se lahko zaporedje, ki ga je programer predvidel, podre pri nepravilnem delovanju enega od vozlisc. V takem primeru pa pride oznaka sporocila se kako prav.

pvm_initsend( PvmDataDefault );
* pvm_pkstr(file_name); /* Poslji datoteko */
* pvm_pklong(&file_size, 1, 1);
* if (pvm_pkbyte(buffer, file_size, 1) < 0)
* pvm_perror("packing scene data"); info = pvm_mcast(servtids, nserv, MSGSCENE);

if (info < 0)
* pvm_perror("multicasting scene file");

return 0;
* }


Copyright © 1995 Leon Kos, Univerza v Ljubljani