ProvaTeorica 2005.11.04

From Sistemi Operativi
Revision as of 21:51, 13 May 2014 by TomOgn (talk | contribs) (Created page with "=[http://www.cs.unibo.it/~renzo/so/compiti/2005-11-04.con.pdf TESTO COMPITO]= =CONCORRENZA= ==Esercizio 1== <syntaxhighlight lang="C"> monitor casino { bool playing, exEquo; ...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

TESTO COMPITO

CONCORRENZA

Esercizio 1

monitor casino
{
	bool playing, exEquo;
	int max, n, leaving;
	condition wantToPlay, player;

	playing = exEquo = false;
	n = 0;

	void misiedo()
	{
		if (playing)
			wantToPlay.wait();
		// Rendez-vous mechanism
		if (++n < 5)
			player.wait();
		else
		{
			playing = true;
			max = 0;			
		}
		player.signal();
	}

	int gioca(int number)
	{
		if (number == max)
			exEquo = true;
		else if (number > max)
		{
			exEquo = false;
			max = number;
		}	
		if (--n > 0)
			player.wait();
		else
			leaving = 5;
		player.signal();
		return (!exEquo && number == max)? 4 : -1;
	}

	void mialzo()
	{
		if (--leaving == 0)
			playing = false;
		wantToPlay.signal();
	}
}

Esercizio 2

def ssend2(m, d1, d2):
	msg = ( SND, getpid(), d1, d2, m )
	asend(msg, server)
	return arecv(server)

def sreceive():
	msg = ( RCV, getpid(), None, None, None )
	asend(msg, server)
	return arecv(server)

def server():
	while True:
		flag, src, d1, d2, msg = arecv(*)
		if flag == RCV:
			msg, sender, _, _ = dbSnd.retrieve(query = '(?, ?, src, ?) or (?, ?, ?, src)')
			if msg:
				asend(msg, src)
				asend(src, sender)
			else:
				dbRcv.insert(src)
		else:
			if dbRcv.retrieve(d1):
				asend(msg, d1)
				asend(d1, src)
			elif dbRcv.retrieve(d2):
				asend(msg, d2)
				asend(d2, src)
			else:
				dbSnd.insert((msg, src, d1, d2))

Esercizio 3

global = 3

CSenter:
	while True:
		local = 2
		QR(global, local) # QR(x,y) = <y1=x%y; x1=x/y; x=x1; y=y1;>
		if local == 3/2:
			break

CSexit:
	global = 3

'''
Osservazioni:
(1) La funzione atomica risulta idonea a sostituire la Test&Set.
(2) La variabile globale assume i seguenti valori:
    3, quando la Critical Section e' libera;
    1, quando la Critical Section e' !libera.
(3) Si alternano i seguenti 4 stati (<global, local>):
   (da libero ad occupato)   <3, 2> --> <1, 3/2>
   (da occupato ad occupato) <1, 2> --> <1, 1/2>
'''