|
Opiskeltava alue: Andrews: 4.1-4.2 Semaphores: Basic Problems and Techniques, 4.4 Readers and Writers, 4.5 Resource allocation and scheduling. Ks. myös Stallings 5.4 Semaphores.
Tehtävissä harjoitellaan semaforien käyttöä poissulkemisessa ja synkronoinnissa. Lisäksi otetaan kantaa prosessien suoritusjärjestykseen eli vuorottamiseen.
1 - TUOTTAJA - PUSKURI - KULUTTAJA
2 -SYNKRONOINTIA
Toteuta tuottaja-kuluttaja -algoritmi käyttäen binäärisemaforeja, ts. käyttäen sellaisia semaforioperaatioita P() ja V(), joiden toteutuksessa arvokenttä voi saada vain arvot 0 ja 1.
Vihje: Koska nyt ei semafori voi toimia laskurina, tarvitset oman laskurin, joka sisältää puskurissa olevien yksiköiden lukumäärän. Aseta binäärisemaforit vastaamaan järjestelmän kahta mielenkiintoista tilanmuutosta: "tyhjä puskuri" -> "puskuri ei tyhjä" ja "täysi puskuri" -> "puskuri ei täysi". Tarvitset siis kaksi binäärisemaforia: toisen estämään tuottajaa kirjoittamasta täyteen puskuriin, toisen estämään kuluttajaa lukemasta tyhjästä puskurista. Lisäksi on varmistettava yhteisten muuttujien käyttö atomiseksi.
3 - KARHU, PURNUKKA JA MEHILÄISET
Mehiläisparvi ruokkii loukkuun joutunutta karhua keräämällä sille
hunajaa. Karhun elämä loukossa on vain syömistä ja odottelua.
Mehiläiset kuljettavat hunajaa purnukkaan annos kerrallaan. Kun
purnukka on täynnä (H annosta), viimeisen annoksen tuonut mehiläinen
herättää karhun, ja mehiläiset jäävät odottamaan purnukan tyhjenemistä.
Kun karhu on tyhjentänyt purnukan, se päästää mehiläiset töihin ja käy
itse nukkumaan:
process mehiläinen[i=1 to N] {
while (true) {
kerää_hunajaa();
talleta_purnukkaan(); # vie hunaja-annos purnukkaan
}
}
process karhu {
while (true) {
sleep(); # odota, että purnukka täysi
tyhjennä_purnukka(); # syö hunajat pois purnukasta
}
}
Kirjoita rutiinit talleta_purnukkaan(), tyhjennä_purnukka() ja sleep() käyttäen semaforeja ja P/V-operaatioita. Osoita, että ratkaisusi toimii oikein (ts. selitä sanallisesti)? Mitä tässä yhteydessä tarkoittaa "oikein"?
4 - JOSKUS ON TILAA NELJÄLLE
Opiskelija-asuntolassa on yksi kylpyhuone, jota käyttävät sekä tytöt
että pojat. Samaan aikaan kylpyhuoneessa voi kuitenkin olla vain joko
tyttöjä tai vain poikia. Ohessa on annettu koodi poikaprosesseille:
01: process Poika[i=1 to M]
02: {
03: while (true) {
04: P(mutex);
05: count++;
06: if (count == 1) P(proceed);
07: V(mutex);
08:
09: käytä_kylppäriä();
10:
11: P(mutex);
12: count--;
13: if (count == 0) V(proceed);
14: V(mutex);
15: }
16: }
5 - MUISTINHALLINTAA, PALVELUJÄRJESTYS
Luennolla on käsitelty yleistä resurssien hallintaa käyttäen esimerkkeinä muistinhallintarutiineja (ks. kohta Muistinhallinta 4: kalvot 3-37 ja 3-38)). Tarkastellaan siis tilannetta, jossa prosessi voi varata useita sivuja yhdellä pyynnöllä.
mutta minulta jäi kana kynimättä. |