#include #include /* PVM - ukazka vypocetniho modelu Farmer - Workers */ /* Sef zadava delnikum postupne cela licha cisla do hodnoty m */ /* a delnik zkouma, zda je to prvocislo. Vysledkem je pole */ /* vsech prvocisel az do hodnoty m. */ /* Pouzivane kody zprav: */ /* 4 ... broadcast (id sefa -> delnici) */ /* 5 ... odpoved (id delnika -> sef) */ /* 6 ... zadani ukolu (sef -> delnik), */ /* zaporna hodnota cisla znamena konec cinnosti */ /* 7 ... vysledek (delnik -> sef), */ /* zaporna hodnota cisla znamena "neni to prvocislo" */ main() { int mytid; /* identifikator procesu sef */ int tids[32]; /* identifikatory procesu delnici */ int nproc; /* pocet delniku */ int m; /* kolik prvocisel se ma zjistit */ int* rslt; /* ukazatel na pole vysledku */ int last_rslt; int worker_cnt = -1894; /* nastaveni pro kontrolu smysluplnosti */ int rslt_num; /* kolik prvocisel uz se naslo */ int cnt_sent = 0; /* kolik prikazu odeslano */ int cnt_received = 0;/* kolik vysledku prijato */ int i, k, tid; /* pomocne promenne */ int end_param = 0; int vytvoreno = 0; /* pocet uspesne vytvorenych delniku */ int* tidc; /* pomocny ukazatel pro vytvareni delniku */ while (! end_param) { printf("Zadej mezni hodnotu pro zjistovani prvocisel:"); scanf("%d", &m); printf("Zadej pocet delniku (1 az 32):"); scanf("%d", &nproc); if (2*nproc > m) printf("Prilis mnoho delniku - budou se flinkat!"); else end_param = 1; } /* inicializace pole pro vysledky vypoctu */ rslt = (int *)malloc (m*sizeof(int)); *rslt = 1; /* prvni prvocislo vime rovnou */ rslt++; *rslt = 2; /* druhe prvocislo take vime rovnou */ rslt++; rslt_num = 2; mytid = pvm_mytid(); /* prihlaseni do PVM */ /* vytvoreni delniku */ tidc = tids; while (nproc>vytvoreno) { if (pvm_spawn("worker", (char**)0, 0, "", 1, tidc)) { printf("Vytvoren delnik %d.\n", *tidc); vytvoreno++; tidc++; } else { printf("Chyba pri vytvareni delnika. Cislo chyby %d\n", *tidc); } } /* uvodni komunikace sefa s delniky (registrace prac. sil) */ pvm_initsend(PvmDataDefault); /* inicializace bufferu */ pvm_pkint(&mytid, 1, 1); /* ulozeni identifikace */ pvm_mcast(tids, nproc, 4); /* broadcast zpravy s kodem 4 */ /* vsem delnikum */ /* cekani na odezvu od delniku */ for(i=0; i0) { rslt++; rslt_num++; /* kladna hodnota - je to prvocislo */ } /* zadani dalsiho ukolu */ pvm_initsend(PvmDataDefault); /* inicializace bufferu */ pvm_pkint(&k, 1, 1); /* ulozeni hodnoty k */ cnt_sent++; pvm_send(tid, 6); /* zaslani zpravy s kodem 6 */ k += 2; } /* dobeh rozdelanych ukolu */ while (cnt_sent > cnt_received) { pvm_recv (-1, 7); /* cekani na vysledek */ cnt_received++; pvm_upkint (&tid, 1, 1); pvm_upkint (rslt, 1, 1); /* kopirovani do pole vysledku */ pvm_upkint (&worker_cnt, 1, 1); printf("%d %d %d %d \n", cnt_sent, cnt_received, worker_cnt, tid); if (*rslt>0) { rslt++; rslt_num++; /* kladna hodnota - je to prvocislo */ } } /* uvolneni delniku */ for(i=0; i