Documente Academic
Documente Profesional
Documente Cultură
Studenti:
1.Nichiforov Cristina
2.Sulugiu Madalina
3.Vasile Sorin
Grupa:
333 AC
333 AC
333 AC
Adresa e-mail:
cristina.nichiforov@gmail.com
madalina.sulugiu@gmail.com
sorin.vasile1609@aut.pub.ro
Observatii:
Grila punctaj
1. Prezentarea problemei propuse spre rezolvare si explicarea abordarii pentru rezolvarea
temei
2. Analiza problemei si evidentierea activitatilor care trebuie abordate in cadrul solutiei
3. Definirea taskurilor care compun aplicatia
4. Prezentarea solutiei de implementare organigramele taskurilor
5. Descrierea modului de sincronizare si evidentierea mecanismelor de sincronizare a
taskurilor
6. Explicarea alegerii solutiei (de ce nu ati utilizat alte mecanisme de sincronizare /
comunicare). Explicarea modului de implementare ce ati ales (procese sau fire de
executie) si de ce?
7. Explicarea modului in care utilizam mecanismele QNX pentru implementarea solutiei
propuse
8. Prezentarea programului complet (sub QNX) care implementeaza solutia pentru problema
propusa (listing) explicatie si comentarii
9. Prezentarea si analiza rezultatelor obtinute prin executia programului
TOTAL:
2p
1p
1p
1p
1p
1p
1p
1p
1p
10 p
Cuprins
TEMA 1...............................................................................................................................................1
1. PREZENTAREA PROBLEMEI PROPUSE.............................................................................................3
2. ANALIZA PROBLEMEI....................................................................................................................3
3. DEFINIREA TASKURILOR................................................................................................................3
4. PREZENTAREA SOLUTIEI DE IMPLEMENTARE.................................................................................3
5. DESCRIEREA MODULUI DE SINCRONIZARE....................................................................................3
6. EXPLICAREA ALEGERII SOLUTIEI..................................................................................................3
7. MECANISMELE QNX PENTRU IMPLEMENTAREA SOLUTIEI............................................................3
8. PREZENTAREA PROGRAMULUI.......................................................................................................3
9. REZULTATELOR OBTINUTE PRIN EXECUTIA PROGRAMULUI...........................................................3
ANEXA LISTING PROGRAM.............................................................................................................4
2. Analiza problemei
Consideram 3 tipuri de cereri ce vor fi testate de catre server odata cu primirea lor:
-Cerere tip A- task-ul A Server,
-Cerere tip B- task-ul B Sever,
-Cerere tip C- task-ul C Server.
Testarea privind starea task-urilor(daca se pot executa sau nu) va fi realizata tot de
server asteptand raspuns din partea task-urilor pentru a putea finaliza tiparirea literelor
respective.
Secvente posibile:
aaabcaaaab
abcaaabc
ab
Secvente imposibile:
aaac nu indeplineste prima conditie
aaabac nu indeplineste a 2-a conditie
abc nu indeplineste a 3-a conditie
3. Definirea taskurilor
Task A - tipareste litera A
Task B - tipareste litera B
Task C - tipareste litera C
Task tip-sever testeaza tipul de cerere si transmite confirmarea la task-uri
testeaza cererea
trimite mesaj
Task A:
transmite mesaj
primeste raspuns
executa cererea
Task B:
transmite mesaj
primeste raspuns
executa cererea
Task C:
transmite mesaj
primeste raspuns
executa cererea
8. Prezentarea programului
Programul creaza cele trei trask-uri de afisare a literelor A, B, C. Fiecare task in
parte trimite un mesaj pe acelasi canal catre server cu cererea de a afisa litera
corespunzatoare. Serverul citeste cate un mesaj aflat in coada, astfel conform conditiilor
impuse in problema raspunde task-ului cu mesajele de confirmare sau infirmare asupra
executiei cererii. Daca s-a primit confirmarea task-ul afiseaza litera. Daca nu, trimite un alt
mesaj cand este disponibil. Serverul continua cu analiza mesajelor primite pe canal si
trimite reply.
<stdlib.h>
<stdio.h>
<errno.h>
<string.h>
<unistd.h>
<sys/neutrino.h>
<process.h>
<sys/types.h>
<pthread.h>
int ChID,cID1,cID2,cID3;
int a=0,b=0,c=0,o,flag = 0;
int PIDProces,PID1,PID2,PID3, rcvID;
struct mesaj{
char body[50];
};
void* a_A(void* arg) {
int srv,rcta,i;
char *mesaj_send_a_A = "A?";
struct mesaj *Cmsg, *Smsg;
Cmsg = (struct mesaj*)malloc(sizeof(struct mesaj));
Smsg = (struct mesaj*)malloc(sizeof(struct mesaj));
cID1 = ConnectAttach(0,PIDProces, ChID, _NTO_SIDE_CHANNEL,0);
if (cID1 == -1)
perror("\tClient: eroare conectare.\n");
strcpy(Cmsg->body, mesaj_send_a_A);
srv = MsgSend(cID1, Cmsg, sizeof(struct mesaj), Smsg, sizeof(struct
mesaj));
rcta=MsgReceive(cID1,Cmsg,sizeof(struct mesaj),NULL);
printf("\tPrimit pe A: %s\n",Cmsg->body);
if (Cmsg->body == "OKA")
{
printf("*A*");
a++;
flag = 0;
}
else
{}
sleep(1);
ConnectDetach(cID1);
}
void* a_B(void* arg) {
int srv,rctb,i,cID2;
char *mesaj_send_a_B = "B?";
struct mesaj *Cmsg, *Smsg;
Cmsg = (struct mesaj*)malloc(sizeof(struct mesaj));
pthread_t afisez_A;
pthread_t afisez_B;
pthread_t afisez_C;
pthread_attr_t attr_a;
pthread_attr_t attr_b;
pthread_attr_t attr_c;
int i,n = 0;
struct mesaj *Cmsg, *Rmsg_a,*Rmsg_b, *Rmsg_c;
char *mesaj_a = "OKA";
char *mesaj_b = "OKB";
char *mesaj_c = "OKC";
strcpy(Rmsg_a->body, mesaj_a);
strcpy(Rmsg_b->body, mesaj_b);
strcpy(Rmsg_c->body, mesaj_c);
Cmsg =
Rmsg_a
Rmsg_b
Rmsg_c
PIDProces = getpid();
pthread_attr_init( &attr_a );
pthread_attr_init( &attr_b );
pthread_attr_init( &attr_c );
pthread_attr_setdetachstate(&attr_a, PTHREAD_CREATE_JOINABLE );
pthread_attr_setdetachstate(&attr_b, PTHREAD_CREATE_JOINABLE );
pthread_attr_setdetachstate(&attr_c, PTHREAD_CREATE_JOINABLE );
ChID = ChannelCreate(0);
pthread_create(&afisez_A, &attr_a, (void*)&a_A, NULL);
pthread_create(&afisez_B, &attr_b, (void*)&a_B, NULL);
pthread_create(&afisez_C, &attr_c, (void*)&a_C, NULL);
while(n < 10)
{
rcvID = MsgReceive( ChID, Cmsg, sizeof(struct mesaj), NULL);
printf("Am primit de la cient: %s\n", Cmsg->body);
if (Cmsg->body == "A?")
{
if (flag == 0)
MsgReply( rcvID, 0, Rmsg_a, sizeof(struct mesaj));
else
{
MsgReply( rcvID, 0, "NO", sizeof(struct mesaj));
}
}
else if (Cmsg->body == "B?")
{
if (flag == 0)
MsgReply( rcvID, 0, Rmsg_b, sizeof(struct mesaj));
else
{
MsgReply( rcvID, 0, "NO", sizeof(struct mesaj));
}
}
else if (Cmsg->body == "C?")
{
if (flag == 1)
MsgReply( rcvID, 0, Rmsg_c, sizeof(struct mesaj));
else
{
MsgReply( rcvID, 0, "NO", sizeof(struct mesaj));
}
}
n++;
}
if (pthread_join(afisez_A, NULL) != 0){
perror("pthread_join");
return EXIT_FAILURE;
}
if (pthread_join(afisez_B, NULL) != 0){
perror("pthread_join");
return EXIT_FAILURE;
}
if (pthread_join(afisez_C, NULL) != 0){
perror("pthread_join");
return EXIT_FAILURE;
}
pthread_attr_destroy(&attr_a);
pthread_attr_destroy(&attr_b);
pthread_attr_destroy(&attr_c);
ChannelDestroy(ChID);
pthread_exit(NULL);
}