Difference between revisions of "ProvaTeorica 2005.11.04"

From Sistemi Operativi
Jump to navigation Jump to search
(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; ...")
 
Line 86: Line 86:
 
==Esercizio 3==
 
==Esercizio 3==
 
<syntaxhighlight lang="Python">
 
<syntaxhighlight lang="Python">
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>
 
'''
 
 
</syntaxhighlight>
 
</syntaxhighlight>

Revision as of 11:02, 14 May 2014

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