Mihai Sprinceana
Un forum de programare cu de toate. Va astept sa va inscrieti si sa deveniti moderatori. Oricine este binevenit aici sa se inscrie si sa aiba acces la informatie free! Fiecare este liber sa adauge proiecte programe free etc. Ajutati acest forum sa devina o comunitate puternica unde fiecare invata de la fiecare! Tot ce trebuie sa faceti este sa va inregistrati si fiecare contributie se poate dovedi utila in timp! Forumul este free informatia free dk aveti timp liber ajutati si pe ceilalti si invatati si voi in acelasi timp! Haideti sa facem ceva pt.a ne ajuta intre noi! Cititi regulament postare forum inainte de a posta!
Lista Forumurilor Pe Tematici
Mihai Sprinceana | Inregistrare | Login

POZE MIHAI SPRINCEANA

Nu sunteti logat.
Nou pe simpatie:
Profil mememe12
Femeie
23 ani
Bucuresti
cauta Barbat
23 - 80 ani
Mihai Sprinceana / SO Linux&Unix / Rez. problemei producator-consumator in sist cu transmitere a msg Moderat de Cristy89, Houssey, cr3us, fireratbat, profu.info, sade5000
Autor
Mesaj Pagini: 1
mihaispr
Administrator

Inregistrat: acum 16 ani
Postari: 2142
Rezolvarea problemei producator-consumator in sistemele  cu transmitere a mesajelor

Pentru rezolvarea acestei probleme se presupun indeplinite urmatoarele conditii:

-toate mesajele au aceeasi lungime
-mesajele trimise, dar neprimite inca de la receptor vor fi automat stocate de sistemul de operare
-se utilizeaza o noua structura de date numita casuta postala care poate stoca un nr.specificat de mesaje


In aceasta situatie destinatia este specificata prin numele cutiei postale si nu al procesului. Utilizarea cutiei postale elimina neajunsurile in cazul in care procesele producator si consumator au viteze de lucru diferite, deoarece un mesaj trimis la destinatie este stocat pana cand procesul destinatar este capabil sa-l accepte.

O cutie postala este locatia in care sistemul de operare stocheaza mesajele trimise prin functia send. De regula nr. de mesaje stocate de catre o cutie postala este limitat si se stabileste la crearea acesteia. In mod firesc atunci cand un proces trimite un mesaj catre un mailbox plin, procesul producator va fi suspendat pana cand din mailbox-ul respectiv va fi extras un mesaj de catre un alt proces.

Reciproc un proces receptor se poate afla in starea blocat atunci cand incearca citirea unui mesaj dintr-o cutie postala goala.


Deblocarea se realizeaza cand un proces depunde un mesaj in mailbox-ul respectiv.

Obs. In sistemele de operare de clasa UNIX se foloseste un mecanism de comunicare interprocese numit mecanism pipe-ing, care este asemanator mecanismului de transmitere al mesajelor prin intermediul cutiilor postale.


Singura deosebire:- mecanismul de pipe-ing nu furnizeaza o delimitare intre mesaje => la destinatie se primeste un flux de informatie fara ca sistemul sa furnizeze explicit informatia asupra incheierii transmiterii unui mesaj anume. Uzual separarea mesajelor se face la nivelul procesului destinatie fiind de regula necesara furnizarea de catre procesul emitator a lungimilor mesajelor transmise.


Rezolvarea problemei producator-consumator cu transmiterea mesajelor se face prin trimiterea de catre procesul consumator al unui numar de N mesaje fara continut pe care producatorul le completeaza cu date si le retransmite consumatorului.

Fiecare dintre aceste procese are o cutie postala proprie astfel incat producatorul va transmite mesaje catre mailbox-ul consumatorului si reciproc.

Atunci cand producatorul are deja produs un element, el are nevoie de un mesaj gol de la consumator. Daca mesajul gol se afla deja in mailbox atunci producatorul il completeaza si-l retransmite consumatorului; in caz contrat at.cand in mailbox-ul producatorului nu se afla nici un mesaj gol anterior transmis de consumator pe care-l completeaza si retransmite acestuia.



#define N 255 //nr de straturi din mailbox


void producator(void)  //functia pt.procesul producator
{int element;
mesaj m;

while(TRUE)
   {element=produce_element(); //genereaza element
     receive(consumator,& ); //asteapta mesaj gol
     construieste_mesaj(&m,element); //umplere mesaj gol
     send(consumator,&m); //trimitere la consumator
    }
}

void consumator(void) //functia pt.procesul consumator
{int element,i;
mesaj m;
for(i=0;i<N;i++)
  send(producator,&m); //trimitere N mesaje goale
    while(TRUE)
       {receive(producator,&m); //asteapta mesaj plin
         element=extrage_element(i,m); //extrage element din mesaj
         send(producator,&m); //trimite inapoi mesaj gol
         utilizeaza_element(element); //utilizare element
        }
}

Solutia furnizata in acest caz este de tip buffering; folosindu-se un mailbox(o cutie postala) pt.stocarea mai multor mesaje la un moment dat.


pus acum 15 ani
   
Pagini: 1  

Mergi la