Erilliskuulustelu
18.8.2006
Kirjoita
asiakasprosessien ja karuselliprosessin koodien keskeiset osat, kun
prosessien koordinointiin käytetään semaforeja.
Karusellissa istuminen on asiakkaan koodissa pelkkää
odotusta.
Jos virheitä on runsaasti, niin pisteitä on saanut siitä, mikä vastauksessa on ollut oikein.
Ohjelmoi
purnukan käyttöä synkronoivat osat monitoriin sekä
esitä niiden lisäksi mehiläisprosessien (N kpl) ja
karhuprosessin koodi.
Toimenpidesarja suoritetaan muiden prosessien kannalta yhtenä kokonaisuutena niin, että muut
prosessit näkevät vain toimenpidensarjan lopputuloksen eikä mitään välivaiheita. Esimerkissä
muut prosessit näkevät ennen toimenpidesarjaa < x = x+1; y = y+1;> x:n ja y:n arvot ja
toimenpidesarjan jälkeen sekä x:n että y:n arvot yhdellä suurempina. Eivätkä siis näe sellaista
tilannetta, jossa x on yhtä suurempi, mutta y vielä ennallaan.
Arvostelusta:
Huvipuistossa
on N asiakasprosessia ja yksi karuselliprosessi. Asiakkaat ajelevat
kerta toisensa jälkeen karusellissa, johon mahtuu kerrallaan C
asiakasta (C on pienempi kuin N). Karuselli käynnistyy
kuitenkin vasta, kun se on täynnä . Kunkin ajokerran
jälkeen kaikki kyydissä olleet poistuvat karusellista
muihin puuhiin (kenties palatakseen karuselliin myöhemmin) ja
karuselli täyttyy taas seuraavista huvittelijoista.
sem karuselli_täynnä = 0; # auki, jos karuselli täynnä
sem saa_nousta_kyytiin = 1;# auki, jos saa mennä kyytiin
sem saa_poistua = 0; # auki, jos saa poistua
int lkm = 0; # karusellissa istuvien lkm
process karuselli
{
while (true) {
P(karuselli_täynnä); # odota, että täysi
pyöritä_karusellia();
V(saa_poistua); # päästä jengi pois
}
}
process huvittelija[i=1 to n]
{
while (true) {
huvittele_muuten_vaan();
P(saa_nousta_kyytiin); # odota kyytiinnousulupaa
lkm++; # baton passing
if (lkm == C)
V(karuselli_täynnä) # viim: "herätä" karuselli
else
V(saa_nousta_kyytiin); # vielä on tilaa
istu_ja_nauti_karusellista();
P(saa_poistua); # karuselli pysähtyi, saa poistua
lkm--;
if (lkm > 0) # baton passing
V(saa_poistua); # seuraava pois
else
V(saa_nousta_kyytiin); # viim: uudelle lupa nousta
}
Arvostelusta:
Mehiläisparvi
ruokkii loukkuun joutunutta karhua keräämällä
sille hunajaa. Karhun elämä loukussa 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 purkin, se päästää
mehiläiset taas töihin ja käy itse nukkumaan.
process bee[i=1 to N]
{
while (true) {
collect_honey();
call pot.into_pot();
}
}
process bear()
{
while (true) {
call pot.sleep();
call pot.empty_pot();
}
}
monitor pot {
int portions=0;
cond pot_full, pot_empty;
procedure into_pot()
{
while (portions==H) wait(pot_empty); # note while!
portions=portions + 1;
if (portions==H) signal(pot_full);
}
procedure sleep()
{
if (portions < H) wait(pot_full); # note if, does while cause problems
}
procedure empty_pot()
{
portions=0;
signal_all(pot_empty) # wake all waiting bees to deposit honey
}
}
Pankkitili on usean henkilön käytössä, joista jokainen voi tallettaa tilille tai nostaa tililtä rahaa. Tili ei saa koskaan mennä negatiiviseksi. Koodaa palvelin, joka huolehtii tilin käytöstä. Asiakkaat voivat pyytää joko jonkun rahasumman talletusta tai rahasumman nostoa. Jos tilillä ei ole tarpeeksi rahaa, niin pyyntöä viivytetään. Asiakkaat ja palvelin käyttävät sanomanvälitystä kommunikointiin.