Probleme rezolvate

Trenuri in gara

In gara A intră simultan maximum m trenuri care vor să ajungă în gara B. Intre A şi B există simultan n linii, m > n, dar în gară se pot afla simultan doar n trenuri. Fiecare tren intră în A la un interval aleator. Dacă are linie liberă între A şi B, o ocupă şi pleacă către B, durata de timp a trecerii este una aleatoare. Să se simuleze aceste treceri. Soluiile, una folosind variabile condiţionale, cealaltă folosind semafoare, sunt prezentate în tabelul următor.

Problema cinei filozofilor.

Cinci (n) filosofi sunt așezați la o masă rotundă. Fiecare filosof are în față o farfurie cu spagheti. Pentru a mânca spagheti un filosof are nevoie de două furculițe. Intre două farfurii există o furculiță (5 sau n în total). Viața unui filosof constă din perioade în care gândește și perioade când mănâncă. Când un filosof devine flămând, el încearcă să ia furculițele din stânga și din dreapta. Cănd reușește va mânca un anumit timp după care pune furculițele jos.

Dacă toți ridică simultan furculița din stânga rezultă: deadlock. Altfel, după preluarea furculiței din stânga, fiecare verifică să fie disponibilă şi cea din dreapta şi în caz negativ o pune înapoi pe cea din stânga. Dacă toți ridică furculița din stânga simultan, vor vedea furculița din dreapta indisponibilă, vor pune înapoi furculița din stânga și se reia din început: starvation

Problema consumatorilor si a producatorilor

Se dă un recipient care poate să memoreze un număr limitat de n obiecte în el. Se presupune că sunt active două categorii de procese care accesează acest recipient: producători şi consumatori. Producătorii introduc obiecte în recipient iar consumatorii extrag obiecte din recipient.

Pentru ca acest mecanism să funcţioneze corect, producătorii şi consumatorii trebuie să aibă acces exclusiv la recipient. In plus, dacă un producător încearcă să acceseze un recipient plin, el trebuie să aştepte consumarea cel puţin a unui obiect. Pe de altă parte, dacă un consumator încearcă să acceseze un recipient gol, el trebuie să aştepte până când un producător introduce obiecte în el.

Pentru implementari, vom crea un Recipient având o capacitate limitată MAX. Există un număr oarecare de procese numite Producător, care depun, în ordine şi ritm aleator, numere întregi consecutive în acest recipient. Mai există un număr oarecare de procese Consumator, care extrag pe rând câte un număr dintre cele existente în recipient.

In textele sursă, tablourile p, v şi metoda / funcţia scrie, sunt folosite pentru afişarea stării recipientului la fiecare solicitare a uneia dintre get sau put. Numărul de producători şi de consumatori sunt fixaţi cu ajutorul constantelor P şi C.

In sursa unui thread producător, variabila art dă numărul elementului produs, iar i este numărul threadului. După efectuarea unei operaţii put, threadul face sleep un interval aleator de timp.

In sursa unui thread consumator, după o operaţie get, acesta intră în sleep un interval aleator de timp.

Problema cititorilor si a scriitorilor.

Se dă o resursă la care au acces două categorii de procese: cititori şi scriitori. Regulile de acces sunt: la un moment dat resursa poate fi accesată simultan de oricâţi scriitori sau exact de un singur scriitor.

Problema este inspirată din accesul la baze de date (resursa). Procesele cititori accesează resursa numai în citire, iar scriitorii numai în scriere. Se permite ca mai mulţi cititori să citească simultan baza de date. In schimb fiecare proces scriitor trebuie să acceseze exclusiv la baza de date.

Simularea noastră se face astfel.

Pentru implementari, consideram un obiect pe care Il vom numi “bază de date” (Bd), . Există un număr oarecare de procese numite Scriitor, care efectuează, în ordine şi ritm aleator, scrieri în bază. Mai există un număr oarecare de procese Cititor, care efectuează citiri din Bd.

O operaţie de scriere este efectuată asupra Bd în mod individual, fără ca alţi scriitori sau cititori să acceseze Bd în acest timp. Dacă Bd este utilizată de către alte procese, scriitorul aşteaptă până când se eliberează, după care execută scrierea. In schimb, citirea poate fi efectuată simultan de către oricâţi cititori, dacă nu se execută nici o scriere în acel timp. In cazul că asupra Bd se execută o scriere, cititorii aşteaptă până când se eliberează Bd.

Variabila cititori reţine de fiecare dată câţi cititori sunt activi la un moment dat. După cum se poate observa, instanţa curentă a lui Bd este blocată (pusă în regim de monitor) pe parcursul acţiunilor asupra variabilei cititori. Aceste acţiuni sunt efectuate numai în interiorul metodelor scrie şi citeste.

Metoda citeste incrementează (în regim monitor) numărul de cititori. Apoi, posibil concurent cu alţi cititori, îşi efectuează activitatea, care aici constă doar în afişarea stării curente. La terminarea acestei activităţi, în regim monitor decrementează şi anunţă thread-urile de aşteptare. Acestea din urmă sunt cu siguranţă numai scriitori. Metoda scrie este atomică (regim monitor), deoarece întreaga ei activitate se desfăşoară fără ca celelalte procese să acţioneze asupra Bd.

Metoda afisare are rolul de a afişa pe ieşirea standard starea de fapt la un moment dat. Situaţia la un moment dat este dată prin stările cititorilor şi ale scriitorilor. Stările fiecărui scriitor (S) sunt afişate prin câte un întreg: -3 indica scriitor nepornit, -2 indica faptul ca scriitorul a scris si urmeaza sa doarma, -1 indică aşteptare ca cititorii să-şi termine operaţiile, 0 indică scriere efectivă. In mod analog, stările fiecărui cititor (C) sunt afişate prin câte un întreg: -3 cititor nepornit, -2 a citit si urmeaza sa doarma, -1 indică aşteptarea terminării scrierilor, 0 indică citire efectivă.

Probleme propuse