Laboratorium Podstawy Przetwarzania Rozproszonego SPRAWOZDANIE z zadania SERWIS KOMPUTEROWY



Podobne dokumenty
Warszawa, r.

ASD - ćwiczenia III. Dowodzenie poprawności programów iteracyjnych. Nieformalnie o poprawności programów:

0.1 Hierarchia klas Diagram Krótkie wyjaśnienie

Aby ułatwić współdzielenie oferty noclegowej w różnych obiektach oraz agregatorach ofert i zestandaryzować ten proces

Zaawansowana adresacja IPv4

Instrukcja programu PControl Powiadowmienia.

Wartości domyślne, szablony funkcji i klas

Regulamin konkursu na hasło i logo promujące ekonomię społeczną w województwie śląskim

API transakcyjne BitMarket.pl

Ogłoszenie o zwołaniu Zwyczajnego Walnego Zgromadzenia IDM Spółka Akcyjna w upadłości układowej z siedzibą w Krakowie na dzień 30 czerwca 2015 roku

Umowa w sprawie przesyłania faktur elektronicznych

REGULAMIN KONTROLI ZARZĄDCZEJ W MIEJSKO-GMINNYM OŚRODKU POMOCY SPOŁECZNEJ W TOLKMICKU. Postanowienia ogólne

Organizowanego przez Ministerstwo Rozwoju Regionalnego w ramach IV Forum Funduszy Europejskich

OGŁOSZENIE o zwołaniu Zwyczajnego Walnego Zgromadzenia Spółki. Wawel S.A. z siedzibą w Krakowie

WNIOSEK o przydział lokalu mieszkalnego lokalu socjalnego

Stowarzyszenie Lokalna Grupa Działania EUROGALICJA Regulamin Rady

Ćwiczenia IV - Kontenery (pojemniki)

Regulamin konkursu na Logo Stowarzyszenia Wszechnica Zawodowa Nasza Szkoła

OBWIESZCZENIE ZARZĄDU PKP CARGO S.A. z dnia 15 grudnia 2008 r.

REGULAMIN KONKURSU PLASTYCZNEGO Król Maciuś I w moim świecie

UMOWA korzystania z usług Niepublicznego Żłobka Pisklęta w Warszawie nr../2013

Regulamin członkostwa w Klubie Przedsiębiorczych Nauczycieli IMPULS

woli rodziców w 2010 roku. 1. W roku szkolnym 2016/2017 obowiązek szkolny spełniają dzieci urodzone w 2009 roku oraz z

REGULAMIN REKRUTACJI I UCZESTNICTWA

INSTRUKCJA REZERWACJI SAL W SYSTEMIE UNITIME

Dziedziczenie : Dziedziczenie to nic innego jak definiowanie nowych klas w oparciu o już istniejące.

Regulamin rekrutacji w projekcie,,grupa PoMocowa SENIORÓW - usługi społeczne osób starszych dla osób starszych

Mnożenie macierzy. Systemy z pamięcią współdzieloną Systemy z pamięcią rozproszoną Efektywność

Projekty uchwał na Nadzwyczajne Walne Zgromadzenie i3d S.A. z siedzibą w Gliwicach zwołane na dzień 10 grudnia 2013 r.:

Elementy cyfrowe i układy logiczne

Sieci komputerowe. Definicja. Elementy

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Na podstawie art.4 ust.1 i art.20 lit. l) Statutu Walne Zebranie Stowarzyszenia uchwala niniejszy Regulamin Zarządu.

Ogłoszenie Zarządu o zwołaniu Nadzwyczajnego Walnego Zgromadzenia Akcjonariuszy Yellow Hat S.A. z siedzibą w Warszawie

REGULAMIN KONKURSU Ja i McDonald s

PROCEDURA REKRUTACJI DZIECI DO KLASY PIERWSZEJ DO SZKOŁY PODSTAWOWEJ W OSTASZEWIE NA ROK SZKOLNY 2015/2016

PRZYJĘCIE NA LECZENIE DO SZPITALA

Regulamin Zarządu Pogórzańskiego Stowarzyszenia Rozwoju

Regulamin Konkursu na cykl zajęć edukacyjnych o prawach dziecka i ich realizacji w praktyce

REGULAMIN RADY NADZORCZEJ. I. Rada Nadzorcza składa się z co najmniej pięciu członków powoływanych na okres wspólnej kadencji.

UCHWAŁ A SENATU RZECZYPOSPOLITEJ POLSKIEJ. z dnia 18 października 2012 r. w sprawie ustawy o zmianie ustawy o podatku dochodowym od osób fizycznych

enova Workflow Obieg faktury kosztowej

Regulamin Drużyny Harcerek ZHR

Praca na wielu bazach danych część 2. (Wersja 8.1)

USTAWA. z dnia 26 czerwca 1974 r. Kodeks pracy. 1) (tekst jednolity)

Obowiązuje od 30 marca 2015 roku

INSTRUKCJA TESTOWANIA USŁUG NA PLATFORMIE ELA-ENT

PROJEKTOWANIE PROCESÓW PRODUKCYJNYCH

Zadania. SiOD Cwiczenie 1 ;

INSTRUKCJA Panel administracyjny

Zarządzenie Nr 1469/2012

Ćwiczenie 6 - Czytnik kart magnetycznych

Ogłoszenie o zwołaniu Zwyczajnego Walnego Zgromadzenia. i3d S.A. z siedzibą w Gliwicach

UCHWAŁA NR XXVIII/294/2013 RADY GMINY NOWY TARG. z dnia 27 września 2013 r. w sprawie przyjęcia programu 4+ Liczna Rodzina

Instrukcja UŜytkownika HaloŚląski - serwisu telefonicznego dla klientów korporacyjnych

1. Rozwiązać układ równań { x 2 = 2y 1

Programator pamięci EEPROM

Regulamin usługi udostępniania obrazów faktur VAT i innych dokumentów w formie elektronicznej

Oprogramowanie klawiatury matrycowej i alfanumerycznego wyświetlacza LCD

Regulamin konkursu na logo POWIATU ŚREDZKIEGO

UCHWAŁA NR XXXVII/236/2013 RADY GMINY RADZIEJOWICE. z dnia 23 maja 2013 r.

Opis programu do wizualizacji algorytmów z zakresu arytmetyki komputerowej

Formularz Zgłoszeniowy propozycji zadania do Szczecińskiego Budżetu Obywatelskiego na 2016 rok

PROCEDURY OBOWIĄZUJĄCE NA ŚWIETLICY SZKOLNEJ

Wójt Gminy Bobrowniki ul. Nieszawska Bobrowniki WNIOSEK O PRZYZNANIE STYPENDIUM SZKOLNEGO W ROKU SZKOLNYM 2010/2011

REGULAMIN KONKURSU PLASTYCZNEGO KAMPANII INFORMACYJNEJ PORZUCONE-NIEPEŁNOSPRAWNE pt. Mój niepełnosprawny Przyjaciel

Architektura komputerów

Regulamin usługi Wezwij PZU Pomoc

P R O J E K T D r u k n r... UCHWAŁA NR././2014 RADY GMINY CHYBIE. z dnia r.

Regulamin oferty specjalnej - Bonus za dopłaty

Projektowanie i programowanie obiektowe (materiały do wykładu cz. VI)

Wykonanie strony internetowej projektu wraz z hostingiem i administracją

DZIENNIK PRAKTYK ZAWODOWYCH

Regulamin przesy ania faktur VAT w formie elektronicznej w Spó dzielni Mieszkaniowej PROJEKTANT. 1 Postanowienia ogólne

2. Subkonto oznacza księgowe wyodrębnienie środków pieniężnych przeznaczonych dla danego Podopiecznego.

Regulamin konkursu Kurs Stylizacji z Agata Meble

POSTANOWIENIA OGÓLNE

INSTRUKCJA OBS UGI

Dane dotyczące Wykonawcy :

DECYZJA w sprawie czasowego zaprzestania działalności

Regulamin. Rady Nadzorczej Spółdzielni Mieszkaniowej "Doły -Marysińska" w Łodzi

E-faktura PKP Energetyka

Wniosek o ustalenie warunków zabudowy

Zarządzenie Nr 0151/18/2006 Wójta Gminy Kornowac z dnia 12 czerwca 2006r.

Zarządzenie Nr 144/2015 Wójta Gminy Tczew z dnia r.

REGULAMIN NABORU KRYTERIA PRZYJMOWANIA UCZNIÓW DO KLASY PIERWSZEJ Zespołu Szkół Ponadgimnazjalnych w Chojnie w roku szkolnym 2016/2017

UMOWA Dostawa i wdrożenie programu egzekucyjnego na potrzeby Urzędu Miasta Stalowa Wola

CMSE Certified Machinery Safety Expert

I. Zakładanie nowego konta użytkownika.

Uchwała nr V/25/2015 Rady Miejskiej w Szczytnie z dnia 26 lutego 2015 r.

U Z A S A D N I E N I E

Część II.A. Informacje o studiach podyplomowych ANALIZA DANYCH METODY, NARZĘDZIA, PRAKTYKA (nazwa studiów podyplomowych)

Komunikacja w sieci Industrial Ethernet z wykorzystaniem Protokołu S7 oraz funkcji PUT/GET

Ogłoszenie Zarządu Z.Ch. PERMEDIA S.A. siedzibą w Lublinie o zwołaniu Zwyczajnego Walnego Zgromadzenia Akcjonariuszy

Instrukcja Obsługi STRONA PODMIOTOWA BIP

PROCEDURY POSTĘPOWANIA W SYTUACJACH TRUDNYCH WYCHOWAWCZO Zespół Szkół im. Henryka Sienkiewicza w Końskowoli

REGULAMIN KONKURSU PLASTYCZNEGO PT. MOJA WIEŚ W EUROPIE

POLSKIE CENTRUM BADAŃ I CERTYFIKACJI S.A Warszawa, ul. Kłobucka 23A. Opinia Nr BR/ROW/012/2007

PROJEKTOWANIE SYSTEMÓW LOGISTYCZNYCH PROJEKT SYSTEMY LOGISTYCZNE PODSTAWY TEORETYCZNE

INFORMACJA dla osób nie będących klientami Banku Spółdzielczego w Goleniowie

Transkrypt:

Laboratorium Podstawy Przetwarzania Rozproszonego SPRAWOZDANIE z zadania SERWIS KOMPUTEROWY Nazwisko Imię album termin zajęć Marek Lewandowski 59817 Maciej Mietliński 59832 poniedziałek 18:30 tydzień nieparzysty Część I Algorytm rozwiązania 1. Definicja problemu System złożony z K komputerów, które niestety systematycznie wymagają serwisowania. Serwis posiada N stanowisk naprawczych umożliwiających jednoczesną naprawę do N maszyn. Przed naprawą każdy komputer musi być przyjęty na dowolnym spośród dostępnych S stanowisk przyjęć, a po naprawie wydawany jest również przez jedno dowolne z nich. Przyjmujemy: K > N > S. Napisać program dla procesu komputera umożliwiający mu systematyczne serwisowanie wg powyższych zasad. Stanowiska przyjęć/wydań oraz naprawcze należy traktować jako zasoby. 2. Założenia przyjętego modelu komunikacji asynchroniczny system z wymianą komunikatów topologia połączeń: każdy z każdym wymagana pojemność kanału: zakładamy, że jednocześnie może być wysyłana ( w jedną stronę) tylko jedna wiadomość. inne wymagane własności sieci komunikacyjnej: kanały typu FIFO, transmisja rozgłoszeniowa. 3. Algorytm wzajemnego wykluczania Do rozwiązania problemu serwisu komputerowego zaproponowaliśmy algorytm Lamporta. o gdy P i decyduje o podjęciu próby wejścia do sekcji krytycznej zapamiętuje aktualną wartość swojego zegara skalarnego T i Kolejność ubiegania się o poszczególne sekcje krytyczne: o o o o P i ubiega się o dostęp do stanowiska naprawy (N) P i ubiega się o dostęp do stanowiska przyjęć (S) naprawa P i ubiega się o dostęp do stanowiska przyjęć (S) Proces P i może wejść do sekcji krytycznej, jeśli znajduje się wśród pierwszych N (w przypadku zasobu stanowiska naprawy) lub pierwszych S (w przypadku zasobu stanowiska przyjęć / wydań) początkowych procesów lokalnej kolejki; oraz żaden ze starszych od P i procesów nie ubiega się o dostęp do sekcji krytycznej. Po wyjściu z sekcji krytycznej proces usuwa swoje żądanie z lokalnej kolejki oraz wysyła do pozostałych procesów komunikat zm_zwolnienie_n (lub S). 1/12

PSEUDOKOD: queue KolejkaN, KolejkaS int Potwierdzenia[K] int LicznikPotwierdzen = 0 int Clock = 0 message Msg int PRZYDZIAL_N //żądanie przydziału do stanowiska naprawczego for (i = 0; i < K; i++) Potwierdzenia[i] = false Msg.Type = ZADANIE_N Msg.Clock = Clock + 1 LicznikPotwierdzen = K - 1 Broadcast(Msg) KolejkaN.add(current, Clock) repeat until (LicznikPotwierdzen == 0 && KolejkaN.exist(N, current) return 1 int PRZYDZIAL_S //żądanie przydziału do stanowiska przyjęć for (i = 0; i < K; i++) Potwierdzenia[i] = false Msg.Type = ZADANIE_S Msg.Clock = Clock + 1 LicznikPotwierdzen = K - 1 Broadcast(Msg) KolejkaS.add(current, Clock) repeat until (LicznikPotwierdzen == 0 && KolejkaS.exist(S, current) return 1 int ZWOLNIENIE_S //żądanie przydziału do stanowiska przyjęć for (i = 0; i < K; i++) Potwierdzenia[i] = false Msg.Type = ZWOLNIENIE_S Msg.Clock = Clock + 1 LicznikPotwierdzen = K - 1 Broadcast(Msg) KolejkaS.del(current) return 1 int ZWOLNIENIE_K 2/12

//żądanie przydziału do stanowiska naprawczego for (i = 0; i < K; i++) Potwierdzenia[i] = false Msg.Type = ZWOLNIENIE_K Msg.Clock = Clock + 1 LicznikPotwierdzen = K - 1 Broadcast(Msg) KolejkaN.del(current) return 1 RECEIVE (current, Msg) Clock = max(clock, Msg.clock) + 1 if (Msg.type == PRZYDZIAL_N) KolejkaN.add(current, Msg.clock) Msq.clock = Clock Msg.type = PRZYDZIALN_POTW send(current, Msg) endif if (Msg.type == ZWOLNIENIE_N) delete(kolejkan, current, Msg.clock) endif if (Msg.type == PRZYDZIAL_S) KolejkaS.add(current, Msg.clock) Msq.clock = Clock Msg.type = PRZYDZIALS_POTW send(current, Msg) endif if (Msg.type == ZWOLNIENIE_S) endif delete(kolejkas, current, Msg.clock) if (Msg.type == PRZYDZIALS_POTW Msg.type == PRZYDZIALN_POTW) if (ackflags[current] == false) ackflags[x] = true LicznikPotwierdzen-- endif endif int MAIN 3/12

while (1) ZADANIE_N; ZADANIE_S; ZWOLNIENIE_S; //Sekcja krytyczna ZADANIE_S; ZWOLNIENIE_S; ZWOLNIENIE_N; Endwhile 4. Analiza złożoności komunikacyjnej algorytmu złożoność komunikacyjna pakietowa, wyrażona w liczbie komunikatów: Podczas wykonania jednej pętli głównej programu proces przechodzi trzy razy przez sekcje krytyczne (punkt przyjęcia + naprawa + punkt wydania). Wejście do każdej z sekcji poprzedzone jest następującą sekwencją instrukcji: Broadcast (ŻĄDANIE_PRZYDZIAŁU) (N - 1) wiadomości 1 Receive (POTWIERDZENIE) (N 1) wiadomości Broadcast (zm_zwolnienie) (N 1) wiadomości Zatem na każdą sekcję krytyczną przypada złożoność 3(N 1). Ponieważ, podczas wykonania jednej pełnej pętli programu głównego występują trzy sekcje krytyczne, zatem algorytm posiada złożoność pakietową 9(N 1). złożoność czasowa przy założeniu jednostkowego czasu przesłania pojedynczego komunikatu w kanale: Ponieważ nic nie stoi na przeszkodzie, aby wszystkie wiadomości z poszczególnych grup (Broadcast (ŻĄDANIE_PRZYDZIAŁU), Receive (POTWIERDZENIE), Broadcast (zm_zwolnienie) ), wysyłane były jednocześnie, zatem na każdą sekcję krytyczną przypada złożoność czasowa 3. Ponieważ, podczas wykonania jednej pełnej pętli programu głównego występują trzy sekcje krytyczne, zatem algorytm posiada złożoność czasową 9. Część II Implementacja rozwiązania /* queue.h */ #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <pvm3.h> #define K 5 #define N 3 #define S 2 #define false 0 1 W rzeczywistości wysyłanych jest N wiadomości (wiadomość jest wysyłana do wszystkich członków grupy, w tym do nadawcy), jednakowoż funkcja RECEIVE została tak zaimplementowana, aby przerywać swoje działanie zaraz po wykryciu sytuacji, w której odbiorca jest tożsamy z nadawcą. 4/12

#define true 1 extern int licznik_n; extern int licznik_s; /* wazne! N musi byc rozne niz S! Zmienne licznik przechowuja informacje o tym, ile elementow jest aktualnie w danej tabeli */ struct queue int id; int clock; ; extern struct queue n[k+1]; extern struct queue s[k+1]; extern struct queue KolejkaN[K+1]; extern struct queue KolejkaS[K+1]; extern struct queue element; /* +1 dla bezpieczeństwa */ void init(); /* i - id szukanego *q - wskaznik na kolejke w ktorej ma szukac max - rozmiar tablicy jesli istnieje, zwraca jego id, a jesli nie, to -1 */ int exist_id(int i, struct queue *q, int maxi); int exist_clock(int cl, struct queue *q, int maxi); /* funkcja do porownywania uzywana w quicksort */ int compare(const void* a1, const void* b1); /* do tablicy struktur dodaje strukture. licznik oznacza licznik_n lub licznik_s w zaleznosci od kolejki. max to maksymalny element tablicy - przydatny do rozrozniania s od n */ void add (struct queue *q, struct queue element, int licznik, int maxi); void del (struct queue *q, struct queue element, int licznik, int maxi); int max (int a1, int a2); /* queue.c */ #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <pvm3.h> #define K 5 #define N 3 #define S 2 5/12

#define ZADANIE_N 1 #define ZADANIE_S 2 #define zm_zwolnienie_n 3 #define zm_zwolnienie_s 4 #define PRZYDZIALN_POTW 13 #define PRZYDZIALS_POTW 14 #define false 0 #define true 1 int licznik_n=0; int licznik_s=0; struct queue int id; int clock; KolejkaN[K+1], KolejkaS[K+1], element; void init() printf("init %d \n", pvm_mytid()); for (i=0; i<n; i++) KolejkaN[i].id=INT_MAX; KolejkaN[i].clock=INT_MAX; for (i=0; i<s; i++) KolejkaS[i].id=INT_MAX; KolejkaS[i].clock=INT_MAX; int exist_id(int i, struct queue *q, int maxi) int iter; for (iter=0; iter<maxi; iter++) if ( q[iter].id == i) return q[iter].id; return -1; int exist_clock(int cl, struct queue *q, int maxi) int iter; for (iter=0; iter<maxi; iter++) if ( q[iter].clock == cl) return q[iter].clock; return -1; 6/12

int compare(const void* a1, const void* b1) struct queue a = *(struct queue*)a1; struct queue b = *(struct queue*)b1; if (a.clock < b.clock) return -1; else if (a.clock > b.clock) else if (a.id < b.id) return -1; else void add (struct queue *q, struct queue element, int licznik, int maxi) int tmp = licznik + 1; for (i=0; i<licznik; i++) if (q[i].id == element.id) return; q[licznik]=element; if (maxi==n) ++licznik_n; else ++licznik_s; licznik++; qsort (q, licznik, sizeof(struct queue), compare); void del (struct queue *q, struct queue element, int licznik, int maxi) int iter; int tmp = licznik-1; for (iter=0; iter < licznik; iter++) if ( q[iter].id == element.id ) q[iter].id=int_max; q[iter].clock=int_max; break; qsort (q, licznik, sizeof(struct queue), compare); 7/12

if (maxi==n) licznik_n--; else licznik_s--; int max (int a1, int a2) if(a1>=a2) return a1; else return a2; /* komp_task.c */ #include "queue.h" #include <time.h> #define ZADANIE_N 1 #define ZADANIE_S 2 #define zm_zwolnienie_n 3 #define zm_zwolnienie_s 4 #define PRZYDZIALN_POTW 13 #define PRZYDZIALS_POTW 14 int Potwierdzenia[K] = 0; int LicznikPotwierdzen = 0; int Clock = 0; int numer = -1; int PRZYDZIAL_N( void ); int PRZYDZIAL_S( void ); int ZWOLNIENIE_N( void ); int ZWOLNIENIE_S(void); void uruchom(); void serwis(); int receive(); void send(int, int, int); //int Msg[4]; /*[0]-typ, [1]-clock, [2]-nadawca, [3]-numer klienta*/ int receive() int Msg[4]=0; int tmp = pvm_nrecv( -1, -1 ); if (tmp == 0 ) return -1; pvm_upkint(msg, 4, 1); if (Msg[2] == pvm_mytid()) return -1; 8/12

Clock = max(clock, Msg[1]) + 1; element.id = Msg[2]; element.clock = Msg[1]; if (Msg[0] == ZADANIE_N) Msg[0] = PRZYDZIALN_POTW; add(kolejkan, element, licznik_n, N); send(clock, Msg[2], Msg[0]); if (Msg[0] == zm_zwolnienie_n) del(kolejkan, element, licznik_n, N); if (Msg[0] == ZADANIE_S) Msg[0] = PRZYDZIALS_POTW; add(kolejkas, element, licznik_s, S); send(clock, Msg[2], Msg[0]); if (Msg[0] == zm_zwolnienie_s) del(kolejkas, element, licznik_s, S); if (Msg[0] == PRZYDZIALS_POTW Msg[0] == PRZYDZIALN_POTW) if (Potwierdzenia[Msg[3]] == 0) Potwierdzenia[Msg[3]] = 1; LicznikPotwierdzen--; int PRZYDZIAL_N() int Msg[4]=0; for (i = 0; i < K; i++) Potwierdzenia[i] = 0; ++Clock; Msg[0] = ZADANIE_N; Msg[2] = pvm_mytid(); Msg[3] = numer; LicznikPotwierdzen = K - 1; pvm_initsend(pvmdataraw); pvm_pkint(msg, 4, 1); 9/12

pvm_bcast("slave", ZADANIE_N); element.id = pvm_mytid(); element.clock = Clock; add(kolejkan, element, licznik_n, N); while (1) receive(); if ( LicznikPotwierdzen == 0 && exist_id ( pvm_mytid(), KolejkaN, N ) >=0 ) break; sleep(1); int PRZYDZIAL_S() int Msg[4]=0; ++Clock; for (i = 0; i < K; i++) Potwierdzenia[i] = 0; Msg[0] = ZADANIE_S; Msg[2] = pvm_mytid(); Msg[3] = numer; LicznikPotwierdzen = K - 1; pvm_initsend(pvmdataraw); pvm_pkint(msg,4,1); pvm_bcast("slave", ZADANIE_S); element.id = pvm_mytid(); element.clock = Clock; add(kolejkas, element, licznik_s, S); while (1) receive(); if ( LicznikPotwierdzen == 0 && exist_id ( pvm_mytid (), KolejkaS, S) >= 0 ) break; sleep(1); int ZWOLNIENIE_S() int Msg[4]=0; element.id = pvm_mytid(); ++Clock; Msg[0] = zm_zwolnienie_s; Msg[2] = pvm_mytid(); 10/12

Msg[3] = numer; element.clock = Clock; LicznikPotwierdzen = K - 1; pvm_initsend(pvmdataraw); pvm_pkint(msg,4,1); pvm_bcast("slave", zm_zwolnienie_s); del(kolejkas, element, licznik_s, S); int ZWOLNIENIE_N() int Msg[4]=0; ++Clock; element.id = pvm_mytid(); Msg[0] = zm_zwolnienie_n; Msg[2] = pvm_mytid(); Msg[3] = numer; element.clock = Clock; LicznikPotwierdzen = K - 1; printf(" exit %d\n", pvm_mytid()); pvm_initsend(pvmdataraw); pvm_pkint(msg,4,1); pvm_bcast("slave", zm_zwolnienie_n); del(kolejkan, element, licznik_n, N); void send (int clock, int tid, int type) int Msg[4]=0; Msg[0] = type; Msg[2] = pvm_mytid(); Msg[3] = numer; pvm_initsend(pvmdataraw); pvm_pkint(msg, 4, 1); pvm_send(tid, type); void serwis() while (1) pvm_catchout(stdout); 11/12

int spiolkam = rand()%3+1; sleep(spiolkam); PRZYDZIAL_N(); PRZYDZIAL_S(); ZWOLNIENIE_S(); printf(" JESTEM W NAPRAWIE! %d\n", pvm_mytid()); srand ( time(null) ); spiolkam = rand()%3+1; sleep(spiolkam); receive(); PRZYDZIAL_S(); ZWOLNIENIE_S(); ZWOLNIENIE_N(); int main (int argc, char *argv[]) int myparenttid = -1; setlinebuf(stdout); myparenttid = pvm_parent(); int tids[k]; if (pvm_parent() == PvmNoParent) init(); pvm_catchout(stdout); pvm_spawn("komp_task", NULL, PvmTaskDefault, "", K, tids); pvm_joingroup("master"); pvm_barrier("master", K + 1); pvm_exit(); else init(); //zmienna numer wskazuje, ktory jestem na liscie numer = pvm_joingroup("slave"); pvm_joingroup("master"); pvm_barrier("slave", K ); serwis(); pvm_barrier("master", K+1); 12/12