Difference between revisions of "ProvaTeoria 2012.01.12"

From Sistemi Operativi
Jump to navigation Jump to search
Line 28: Line 28:
 
NOTA: Con questa soluzione se l'ultimo processo chiama la exit e ci sono altri processi in coda, gli altri processi usciranno prima che l'ultimo esca dallo urgent stack per uscire a sua volta, quindi non credo che rispetti la traccia.
 
NOTA: Con questa soluzione se l'ultimo processo chiama la exit e ci sono altri processi in coda, gli altri processi usciranno prima che l'ultimo esca dallo urgent stack per uscire a sua volta, quindi non credo che rispetti la traccia.
 
Però non ho trovato un'altra soluzione
 
Però non ho trovato un'altra soluzione
 +
 +
==Esercizio 2==
 +
<syntaxhighlight lang="C">
 +
pid index[N] /*index contiene gli id dei vari server*/
 +
 +
struct serverMSG
 +
{
 +
pid readers=Queue();
 +
message m;
 +
}
 +
 +
 +
serverMSG* database=Queue();
 +
 +
process server[i=0...N-1]()
 +
{
 +
message mymsg;
 +
struct serverMSG* tmp;
 +
while(1)
 +
{
 +
mymsg=arecv(*);
 +
if (mymsg=="###");
 +
{
 +
while(tmp=read(database))
 +
{
 +
if (!tmp->readers.found(getpid()))
 +
{
 +
print(tmp->message);
 +
tmp->readers.enqueue(getpid());
 +
if (tmp->readers.sizeOf()==N)
 +
remove(tmp);
 +
}
 +
}
 +
}
 +
else
 +
{
 +
database.enqueue(NULL,message);
 +
foreach(i in index)
 +
{
 +
send("###",index[i]);
 +
}
 +
 +
}
 +
}
 +
</syntaxhighlight>
 
-stefano92
 
-stefano92

Revision as of 16:17, 4 May 2014

TESTO COMPITO

Esercizio 1

monitor seq
{
	condition* c=List() /*lista di condizioni, una per ogni processo arrivato*/
	int* procstack=Stack(); /*stack di processi per l'uscita LIFO*/
	
	procedure entry enter()
	{
		procstack.push(this->p_id);
	}
	
	procedure entry exit()
	{
		if (procstack.Top()!=this->p_id){ /*cioè se il processo non è in cima allo stack*/
			List.insert(this->p_id);
			(List.search(this->p_id)).wait(); /*aggiungo il mio p_id alla lista di condizioni e mi metto in wait*/
			}
		List.remove(this->p_id);
		procstack.Pop();
		List.search(procstack.Top()).signal();
	}
}

NOTA: Con questa soluzione se l'ultimo processo chiama la exit e ci sono altri processi in coda, gli altri processi usciranno prima che l'ultimo esca dallo urgent stack per uscire a sua volta, quindi non credo che rispetti la traccia. Però non ho trovato un'altra soluzione

Esercizio 2

pid index[N] /*index contiene gli id dei vari server*/

struct serverMSG
{
	pid readers=Queue();
	message m;
}


serverMSG* database=Queue();

process server[i=0...N-1]()
{
	message mymsg;
	struct serverMSG* tmp;
	while(1)
	{
		mymsg=arecv(*);
		if (mymsg=="###");
		{
			while(tmp=read(database))
			{
				if (!tmp->readers.found(getpid()))
				{
					print(tmp->message);
					tmp->readers.enqueue(getpid());
					if (tmp->readers.sizeOf()==N)
						remove(tmp);					
				}
			}
		}
		else
		{
			database.enqueue(NULL,message);
			foreach(i in index)
			{
				send("###",index[i]);
			}
		
	}
}

-stefano92