7. feladat

Feladva nov. 30-dec. 12., 2009

Határidő  jan. 09., 2010

POSIX-Solaris szálak (threads) - szinkronizálással (mutex-ek és feltételes változók segítségével)

 

Feltöltendő állomány neve: S07_nn_xxxxxxx(_aa).c, ahol nn - feladat száma; xxxxxxx - felhasználó azonosítója a linux szerveren; (aa - az illető állomány funkcionalitásának valamilyen ismertető jegye több modul használata esetén).

 

1xc. Írjunk programot, mely 10 "dolgozó"-szálat hoz létre, a főprogram pedig a következőképpen irányítja őket:

  • csak 4 esztergapad van, amelyekkel a munkások dolgozhatnak, ha többen szeretnék használni ezeket, várniuk kell, amíg egy felszabadul
  • egy munkás 3 - 5 munkadarabot készít el az esztergapad segítségével (nem mindenki egyformán ügyes), majd át kell adnia a helyet más munkásnak
  • miután egy munkás elkészített 32 munkadarabot, szól a mesternek (vagyis a főprogramnak), mivel az első három munkás, aki teljesítette a munkatervet, kap jutalomfizetést
  • miután az első 9 munkás befejezte a munkatervet, a mester a legutolsó munkást is leállítja ( pthread_cancel(th[i]) ), majd megmondja, hogy ki az, aki jutalomfizetésben részesül
  • lásd még a feladatcsoport végén szereplő megjegyzéseket

 

2xc. Írjunk programot, mely 10 "diák"-szálat hoz létre. A főprogram (vagyis a tanár) rendelkezik egy kérdéseket tartalmazó listával (vagyis 15 tetszőleges számértéket tartalmazó tömbbel). A diákok egymás után lépnek be vizsgázni, és mindegyikük kap egy kérdést, amelyre válaszolnia kell. A helyes választ egy f(k) függvény adja meg, melyet csak a tanár ismer (mivel a diákok nem jártak kurzusra). Tehát a diák, aki éppen vizsgázik egy véletlenszerű értékkel fog válaszolni, megpróbálva kitalálni a helyes választ, és annak függvényében kapja a jegyet, hogy az általa adott válasz mennyire volt közel a helyes válaszhoz. Végül, miután minden diák vizsgázott, a tanár behívja a terembe az első három legjobb eredményt elért diákot (vagyis egy feltételes változó segítségével figyelmezteti őket), hogy lejegyezze a nevüket (azaz a diák-szálak nagy örömmel kiírják a képernyőre a nevüket/számukat). Lásd még a feladatcsoport végén szereplő megjegyzéseket.

 

3xc. Egy Internet-kávézóban 5 számítógép van és 12 kliens érkezik. Kezdetben (tetszőlegesen) meghatározzuk, hogy melyik kliensnek mennyi pénze van. Ennek függvényében sorra leültetjük a klienseket a számítógépekhez, de egy kliens egyszerre nem foglalhat le egy gépet több, mint 1 órára, akkor sem, ha volna még elegendő pénze. Egy óra múlva tehát fel kell szabadítani a számítógépet, és ismét sorbaáll (amennyiben még van pénze). Miután nincs több kliens, akinek még maradt volna pénze, a tulajdonos (főprogram) összegzést készít (kiírja, hogy mennyi pénzt keresett). A kiírások alapján lehessen nyomon követni, hogy ki melyik géphez ült le, illetve ki mikor állt fel.

Megj.: Természetesen minden klienst egy külön szál szimulál. Lásd még a feladatcsoport végén szereplő megjegyzéseket.

 

4x. Egy állomáson 3 jegypénztár van. Az utasok, akik az ünnepekre haza szeretnének utazni beállnak a sorba a három jegypénztár valamelyikéhez (pl. ahhoz, ahol a legrövidebb a sor). A kasszáknál viszont nem ugyanabban a ritmusban történik a kiszolgálás. Egy "óra" után elmegy a vonat, és a diákok, akiknek nem sikerült elérniük a vonatot (ha van ilyen) kiírják a képernyőre "nemtetszés-nyilvánításukat". Az utazni kívánó diákokat egy-egy külön szál szimulálja.

 

5xc. Egy CFR utazási ügynökségen 6 jegypénztár van, minden egyes jegypénztárnál váltható jegy bárhová. Ahhoz, hogy két jegypénztár ne adhassa el egyszerre ugyanazt a jegyet, mindegyik kasszásnő (vagyis tképpen az a terminál, amelynél dolgozik) blokálja az adatbázist, eladja a jegyet, majd ismét hozzáférhetővé teszi azt. Két jegyárusítás között (vagyis két kliens kiszolgálása között) tetszőleges hosszúságú idő telik el. Ha eladták az összes jegyet (N db. jegy), az ügynökség telefonál az állomásra, hogy közölje ezt (vagyis egy feltételes változó segítségével aktiváljuk az "állomás"-szálat). Amennyiben nem adtak el minden jegyet, de eltelt egy bizonyos, előre kiszabott idő, az állomás telefonál az ügynökségnek, hogy a továbbiakban ne adjon el több jegyet (vagyis az "állomás"-szál befejezi a "jegypénztár"-szálakat, lásd pthread_cancel(th[i])).

 

6xc. Egy étteremben 3 asztal van, mindegyik 2 férőhelyes. Az érkező kliensek rendre leülnek az asztalokhoz, amennyiben van üres hely (írjuk ki, hogy ki melyik asztalnál foglalt helyet). Miután befejezték az evést, felszabadítják a helyet, és jöhet egy másik kliens. Egy bizonyos idő után bármelyik ember megéhezik, tehát visszatér az étterembe. 10 "óra" eltelte után az étterem bezárul, és a kliensek hazamennek.

Megj.: Feltételezzük, hogy az étteremnek 15 törzsvendége van. Lásd még a feladatcsoport végén szereplő megjegyzéseket.

 

7x. Egy szemináriumra 15 diák érkezik. A diákok sorra mennek ki a táblához (vagyis megpróbálják blokálni a "tábla"-erőforrást). Egy feladat megoldása a táblánál 2-4 "percbe" telik. Minen diák megpróbál kimenni a táblához, mert ezt figyelembe veszik a vizsgánál. 2 "óra" után befejeződik a szeminárium és minden diák kiírja, hogy hány "pontot" szerzett, ahol a pontok száma = megoldott feladatok száma/ a táblánál eltöltött percek.

 

8x. Egy irodában 8 hivatalnok dolgozik, akik időnként dokumentumokat nyomtatnak a nyomtató segítségével. Nem mindenki ugyanabban a ritmusban fejezi be a dokumentumok megírását. Mivel az irodában csak egyetlen egy nyomtató van, egyszerre csak egy személy nyomtathat. Hogy mindenki sorra kerülhessen, senki nem nyomtathat 3 dokumentumnál többet egyszerre.

 ******

Megjegyzések:

Azokban a feladatokban, ahol több erőforrás megosztott használatáról van szó (pl. 1, 3, 6 feladatok), az illető erőforrásokhoz való hozzáférés kezelésére egyetlen mutex-változó használata elegendő. Ha több mutex-változót használnánk (külön-külön mindenik erőforrásra), megtörténhetne, hogy több szál ugyanarra az erőforrásra vár, miközben egy másik szabad - például az 1. feladatnál, ha egyszerre több munkás várna arra, hogy megkapja az első esztergapadot, miközben lehet, hogy egy másik esztergapad szabad.

Amennyiben nincs rendelkezésre álló szabad erőforrás, a szálak egy feltételes változón blokálódnak, arra várva, hogy értesítést kapjanak, amikor egy erőforrás felszabadult.

Az x-el jelölt feladatokat csak mutex változók segítségével kell megoldani, az xc-vel jelöltek megoldásához pedig feltételes változó használatára is szükség van.