// Sat Mar 25 16:35:53 CET 2000 // (c) Dinko Korunic, 36355514, kreator@fly.srk.fer.hr // Zadatak 3 iz predmeta Operacijski sustavi 1 // Ostvariti suradnju paralelnih procesa koristenjem zajednicke memorije // Opis rjesenja: // U prvom algoritmu nema iskljucivanja pa nije ni potrebno koristiti // zajednicku memoriju (naprosto imamo vise procesa koji rade // istovremeno), te je rezultat nedefiniran. U drugom i trecem // algoritmu vrsi se iskljucivanje procesa. Drugi proces iskljucuje // dva procesa, dok treci iskljucuje i vise od dva procesa. #include #include #include #include #include #include #include #include #include #include #define LONG_MAX 2147483647 void MyIspis(int *i, int *k, int *m) { cout << "i=" << *i << " k=" << *k << " m=" << *m << endl; usleep(1); } class NormalProc { int BrojProcesa; void MyProc(int i); public: NormalProc(int i); }; NormalProc::NormalProc(int i=3) : BrojProcesa(i) { cout << "Rad bez medjusobnog iskljucivanja\n" "i bez zajednicke memorije" << endl; int k; for (k=0; kPravo=1; int k; for (k=0; kZastavica[i]=1; j=1-i; while (MyDekkerStruct->Zastavica[j]) { if (MyDekkerStruct->Pravo==j) { MyDekkerStruct->Zastavica[i]=0; while (MyDekkerStruct->Pravo==j); MyDekkerStruct->Zastavica[i]=1; } } for (m=1; m<=10; ++m) { MyIspis(&i, &k, &m); } MyDekkerStruct->Pravo=j; MyDekkerStruct->Zastavica[i]=0; } } struct Lamport_t { int Trazim[3]; int Broj[3]; }; class LamportProc { int BrojProcesa; int MySegid; Lamport_t *MyLamportStruct; void MyProc(int i); int MyMax(int BrojP, int *Ptr); public: LamportProc(int i); }; LamportProc::LamportProc(const int i=3) : BrojProcesa(i) { cout << "Lamportov algoritam za >2 procesa." << endl; MySegid=shmget(IPC_PRIVATE, sizeof(Lamport_t), 6*8*8); MyLamportStruct=(Lamport_t *)shmat(MySegid, NULL, 0); int k; for (k=0; kTrazim[i]=1; MyLamportStruct->Broj[i]=MyMax(BrojProcesa, MyLamportStruct->Broj)+1; MyLamportStruct->Trazim[i]=0; for (j=0; jTrazim[j]); while (MyLamportStruct->Broj[j] && (MyLamportStruct->Broj[j]Broj[i] || (MyLamportStruct->Broj[j]==MyLamportStruct->Broj[i] && jBroj[i]=0; } } int LamportProc::MyMax(int BrojP, int *Ptr) { int maxx=Ptr[0]; for (int i=1; imaxx) maxx=Ptr[i]; return maxx; } void MyClean(int i) { for (i=1; i