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:
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
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
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.