1 / 16

Problema cititor-scriitor

Problema cititor-scriitor. Prep. Drd. Aritoni Ovidiu.

kordell
Download Presentation

Problema cititor-scriitor

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 cititor-scriitor Prep. Drd. Aritoni Ovidiu

  2. In informatica, problema cititor-scriitor este un exemplu tipic de rezolvare a problemei concurentei. Problema trateaza situatia in care mai multe thread- uri impart aceeasi zona de memorie in acelasi interval de timp, unul citind si altul scriind.

  3. Constrangerea vine in mod natural din faptul ca nici un proces nu poate scrie (citi) intr-o zona de memorie, in acelasi timp cu un alt proces (in particular este permis ca doi utilizatori sa citeasca din aceeasi zona de memorie). • O incuietoare cititor-scriitor este o structura de date care rezolva una sau mai multe probleme legate de problema cititor-scriitor.

  4. Problema cititorilor si scriitorilor modeleaza accesul la o baza de date. • Intr-o situatie reala, cum ar fi un sistem de rezervare a locurilor, vor exista numeroase procese care utilizeaza in acelasi timp baza de date.

  5. Daca este posibil ca mai multe procese sa citeasca date din baza de date, este inacceptabil sa permitem mai multor procese sa poata scrie in baza de date simultan. • Mai mult, atunci cand un proces scrie in baza de date, nici macar procesele-cititor nu vor avea dreptul sa utilizeze baza de date

  6. Prima problema • o zona de memorie ; • datele partajate se pot proteja cu ajutorul unui semafor mutex. • Solutia nu este insa cea mai optima!

  7. A doua problema • o zona comuna de memorie partajata de mutex; • se adauga constrangerea ca nici un scriitor, o data adaugat in coada de asteptare, nu va astepta mai mult decat este necesar. • Se mai numeste si preferinta scriitorilor.

  8. A treia problema • Solutia propusa de cele doua probleme anterioare duce la infometare. • La a treia problema cititor-scriitor se adauga constrangerea ca nici un thread nu este lasat sa ajunga la infometare.

  9. Codul sursa • prioritate cititorilor int readcount = 0; semaphore wsem = 1; //semaphore x = 1; void main(){ int p = fork(); if(p) reader; // assume multiple instances else writer; // assume multiple instances} void reader(){ while(1){ wait(x); readcount++; if (readcount==1) wait(wsem); signal(x); doReading(); wait(x);

  10. readcount--; if (readcount==0) signal(wsem); signal(x); }} void writer(){ while(1){ wait(wsem) doWriting(); signal(wsem) }} b)prioritate scriitorilor int readcount, writecount = 0; semaphore rsem, wsem = 1; //semaphore x,y,z = 1; void main(){ int p = fork(); if(p) reader; // assume multiple instances else writer; // assume multiple instances } void reader(){ while(1){ wait(z); wait(rsem); wait(x); readcount++; if (readcount==1) wait(wsem); signal(x); signal(rsem); signal(z); doReading(); wait(x); readcount--;

  11. if (readcount==1) wait(wsem); signal(x); signal(rsem); signal(z); doReading(); wait(x); readcount--; if (readcount==0) signal(wsem); signal(x); }} void writer(){ while(1){ wait(y); writecount++; if (writecount==1) wait(rsem); signal(y); wait(wsem); doWriting(); signal(wsem); wait(y);

  12. writecount--; if (writecount==0) signal(rsem); signal(y); }} c)solutia cu trimitere de mesaje void reader(int id){ message rmsg; while(1){ rmsg = id; s end("ReadReq",rmsg); receive("Reader"+id,rmsg); DoReading(); rmsg = id; send("Fini",rmsg); } } void writer(int id){ message rmsg; while(1){

  13. rmsg = id; send("WriteReq",rmsg); receive("Writer"+id,rmsg); DoWriting(); rmsg = id; send("Fini",rmsg); }} void controller(){ while(1){ if(count>0){ //no writer if (!empty("Fini")){ receive("Fini",msg); count++; } else if(!empty("WriteReq")) { receive("WriteReq",msg); id = msg.id; count -= MAXREADERS; } else if(!empty("ReadReq")) {

  14. receive("ReadReq",msg) count--; send("Reader"+msg.id, "OK"); } } if(count==0) { //only a writer send("Writer"+id, "OK"); receive("Fini",msg); count = MAXREADERS; } while(count<0) { // 1 wrtr;n rdrs receive("Fini",msg); count++; } }}

  15. Concluzie • Problema cititor scriitor ilustreaza intr-o maniera simplificata accesul utilizatorilor la o baza de date. • Fara un mecanism de sincronizare a scrierilor si citirilor in baza de date aceste operatii ar fii executate haotic.

  16. Va multumesc !

More Related