7. feladat
Feladva nov. 30-dec. 12., 2010
Határidő jan.
10., 2011
POSIX-Solaris szálak (threads) - szinkronizálással (mutex-ek és feltételes változók segítségével)
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 3 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 2 - 4 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
2xc. Írjunk programot,
mely 15 "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 húz egy kérdést,
amelyre válaszolnia kell. 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
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
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 az
utasok, 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ó utasokat egy-egy külön szál
szimulálja.
5xc. Egy CFR utazási ügynökségen 5 jegypénztár van,
6xc. Egy menzán
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). Ha van teljesen üres asztal, akkor
oda ül a vendég, ha nem, akkor egy üres
helyre. 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.
7x. Egy szemináriumra 25 diák érkezik (mindegyiket
saját szállal modellezzük). 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.
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 nyomtató van, egyszerre csak egy személy nyomtathat.
Hogy mindenki sorra kerülhessen, senki nem nyomtathat 3 dokumentumnál többet egyszerre. Modellezzük a nyomtatás folyamatát:
******
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.