1 / 14

Problema Barbierului Somnoros (The Sleeping Barber Problem )

Problema Barbierului Somnoros (The Sleeping Barber Problem ). Prep. Drd. Aritoni Ovidiu. Problema frizerului somnoros. Un barbi er, un scaun Sala de asteptare cu n scaune Nici un client? Barbi erul doarme pana cand un client nou venit il trezeste. Vine un client?

scot
Download Presentation

Problema Barbierului Somnoros (The Sleeping Barber Problem )

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Problema Barbierului Somnoros (The Sleeping Barber Problem) Prep. Drd. Aritoni Ovidiu

  2. Problema frizerului somnoros Un barbier, un scaun Sala de asteptare cu n scaune Nici un client? Barbierul doarme pana cand un client nou venit il trezeste. Vine un client? Barbierul doarme? Trezeste-l! Barbierul este ocupat si exista scaune libere? Rezerva un scaun si asteapta. Barbierul este ocupat si nu exista scaune libere? Pleaca!

  3. Exemple concrete call-center cu apeluri in asteptare imprimanta sistemul de tichete al institutiilor

  4. Modelarea unei solutii Ce protocol va fi folosit pentru barbier si clienti? Cum va fi realizata sincronizarea pentru comunicarea intre procese? Cum vor fi evitate situatiile de impas (deadlock)?

  5. Modelarea unei solutii Cum vom modela barbierul si clientii? Ca fire de executie. De ce variabile de stare partajate avem nevoie? Numarul de clienti. Cum vom proteja variabilele de stare? Mutexuri. Cum va sti barbierul cand sa astepte si cand sa se trezeasca? Semaforul clientilor. Cum vor sti clientii cand sa astepte si cand urmeaza la rand? Semaforul barbierului.

  6. Implementarea unei solutii #define CHAIRS 5/* numarul de scaune disponibile */ typedef int semaphore; semaphore customers = 0;/* numarul de clienti care asteapta */ semaphore barbers = 0; /* numarul de barbieri */ semaphore mutex = 1; /* pentru excludere mutuala */ int waiting = 0; /* clientii asteapta (nu sunt barbieriti) */ void Barber_Thread(void) { white (TRUE) { down(&customers);/* culca-te daca numarul de clienti e 0 */ down(&mutex); /* obtinerea accesului la 'waiting' */ waiting = waiting − 1;/* decrementeaza contorul clientilor in asteptare */ up(&barbers);/* un barbier e acum pregatit sa barbiereasca */ up(&mutex); /* elibereaza 'waiting' */ barbiereste(); /* barbiereste (inafara regiunii critice) */ } }

  7. Implementarea unei solutii void Customer_Thread(void) { down(&mutex); /* intra in regiunea critica */ if (waiting < CHAIRS) {/* daca nu exista scaune libere, pleaca */ waiting = waiting + 1;/* incrementeaza contorul clientilor in asteptare */ up(&customers);/* trezeste barbierul daca e nevoie */ up(&mutex); /* elibereaza accesul la 'waiting' */ down(&barbers);/* culca-te daca nr. de barbieri liberi e 0 */ get_barbiereste(); /* aseaza-te pt. a fi servit */ } else { up(&mutex); /* pravalia e plina; nu astepta */ } }

  8. Este o solutie buna? Nu chiar!

  9. /* * Functie call-back a procesului/firului de executie * care se ocupa cu eliberarea tichetelor * proceseaza toate mesajele receptionate si optional trimite un raspuns */ TicketSystem_MessageCallBack(int pid,int msg_id, int *response) { *response=NULL; if (msg_id==AQUIRE_TICKET) { down(&mutex); if (waiting < CHAIRS) { waiting = waiting + 1; *response=new_semaphore(NON_SIGNALED); /* creeaza un semafor nou pentru a-i semnala clientului momentul cand poate intra la barbier */ customer_queue_add(response); /* adauga semaforul intr-o coada */ } up(&mutex); } }

  10. Customer_Thread() { int response; send_message(TICKET_SYSTEM_PID,AQUIRE_TICKET,&response); /* trimite un mesaj procesului insarcinat cu eliberarea tichetelor pentru a i se asigna un tichet (semafor), care va fi memorat in response */ if (response==NULL) { return;}/* tichetul nu a putut fi obtinut */ up(&customers); down(&response); /* asteapta randul */ Getbarbiereste(); } } Barber_Thread() { while (TRUE) { down(&customers); down(&mutex); waiting = waiting - 1; customer_queue_signal(0); /* anunta primul client din coada ca poate intra (de asemenea sterge-l din coada) */ up(&mutex); barbiereste(); } }

  11. Problema frizerului modificata K barbieri, S scaune, N scaune pentru clientisi M pozitii de asteptare in picioare nici un client nu intra in pravalie daca nu exista cel putin un loc in picioare liber un client care intra in pravalie se aseaza pe un scaun sau sta in picioare, dupa ce obtine un numar de ordine cand un barbier este liber, clientul cu numarul de ordine cel mai vechi ocupa scaunul de lucru al barbierului si clientul cu numarul cel mai vechi dintre cei care stau in picioare ocupa locul pe scaunul eliberat dupa ce deserveste un client, barbierul poate accepta plata din partea acestuia, insa toti barbierii vor folosi aceeasi casa de bani fiecare barbier isi petrece timpul asezat, in asteptarea unui client; acceptand plata unui client sau ocupandu-se de un client.

  12. Problema frizerului modificata O solutie simpla poate fi oferita prin apelul la 9semafoare de uz general sau binare: capacitate– numarul total de pozitii de asteptare existente asteptare– numarul de pozitii de asteptare pe scaune barbieri– numarul de barbieri din pravalie barbierim– garanteaza faptul ca barbierii realizeaza doar o activitate la un moment dat pregatit, terminat– precizeaza daca exista un client pregatit pentru barbierit / client deservit plata– precizeaza daca urmeaza sa fie realizata o plata chitanta– precizeaza terminarea unei plati paraseste– precizeaza cand un client se ridica din scaun dupa ce a fost barbierit

  13. typedef int semaphore; semaphore capacitate=12; semaphore asteptare=3; semaphore barbieri=3; semaphore barbierim=3; semaphore pregatit=0, terminat=0; semaphore paraseste=0; semaphore plata=0, chitanta=0; void client(void) { down(&capacitate); intra_pravalie(); down(&asteptare); asteapta_pe_scaun(); down(&barbier); paraseste_scaun(); up(&asteptare); pregateste_barbierit(); up(&pregatit); down(&terminat); termina_barbierit(); down(&paraseste); plateste(); up(&plata); down(&chitanta); iese_pravalie(); up(&capacitate); } void barbier(vod) { while (true) { down(&pregatit); down(&barbieri_m); barbiereste(); up(&barbieri_m); down(&paraseste); up(barbieri); } } void casier(void) { while (TRUE) { down(&plata); down(&barbieri_m); accepta_plata(); up(&barbieri_m); up(&chitanta); } }

  14. Va multumesc!

More Related