Prova Teorica 2007.09.07

From Sistemi Operativi
Jump to navigation Jump to search

TESTO COMPITO

CONCORRENZA

Esercizio 1

Monitor fabbrica
{
	Queue ruote, scocche;
	Condition produttoreRuota, produttoreScocca, assemblatore;

	void deposita_ruota(Ruota r)
	{
		if (ruote.Count == 64)
			produttoreRuota.wait();

		ruote.enqueue(r);

		if (ruote.Count >= 4 && scocche.Count >= 1)
			assemblatore.signal();
	}

	void deposita_scocca(Scocca s)
	{
		if (scocche.Count == 8)
			produttoreScocca.wait();

		scocche.enqueue(s);

		if (ruote.Count >= 4)
			assemblatore.signal();
	}

	void preleva_pezzi(Ruota r[4], Scocca *s)
	{
		if (ruote.Count < 4 || scocche.Count < 1)
			assemblatore.wait();

		for (int i = 0; i < 4; i++)
			r[i] = ruote.dequeue();
		*s = scocche.dequeue();

		for (int i = 0; i < 4; i++)
			produttoreRuota.signal();
		produttoreScocca.signal();
	}
}

Esercizio 2

// (1) Yes, it is possible.

void nbSend(Message msg, Pid dst)
{
	asend(<msg, getpid()>, dst);
}

Message nbReceive(Pid src)
{
	Message fake = Message();
	asend(fake, getpid());
	<msg, pid> = areceive(*);
	
	return (pid == src)? msg : NULL;
}

// (2) Yes, it is possible, but it requires busy waiting.

void aSend(Message msg, Pid dst)
{
	nbsend(msg, dst);
}

Message aReceive(Pid sender)
{
	Message msg;

	// Blocking effect through busy waiting
	while (!(msg = nbreceive(sender)));

	return msg;
}