Difference between revisions of "ProvaPratica 2010.07.12"

From Sistemi Operativi
Jump to navigation Jump to search
Line 259: Line 259:
  
 
----Alessandro
 
----Alessandro
 +
 +
<h1>Parte generale</h1>
 +
 +
== Esercizio 1 ==

Revision as of 10:05, 7 April 2014

http://www.cs.unibo.it/~renzo/so/compiti/2010-07-12.tot.pdf


Esercizio 1

int aggiorna_maxprio(int maxprio,int prio,int waiting[]){
int i;
if(waiting[maxprio] == 0)
	{
       	maxprio=0;
		for(i=prio;i>=0;i--)
		{
			if(waiting[i]!=0)
			{
			maxprio=i;
			break;
			}
		}
return maxprio;
}


monitor priocoop{
condition run[10];
int waiting[10]=0,0,0,0,0,0,0,0,0,0;
int maxprio=0;
int occupato=0;

procedure entry init(prio){	
	if(occupato==1)
	{
		if(maxprio < prio)
		{
		maxprio=prio;
		}
	waiting[prio]++;			
	run[prio].wait();
	waiting[prio]--;
	maxprio=aggiorna_maxprio(maxprio,prio,waiting);
	}
occupato=1;
}

procedure entry yield(prio){
run[maxprio].signal();
        if(maxprio < prio)
	{
	maxprio=prio;
	}
waiting[prio]++;
run[prio].wait();
waiting[prio]--;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);
}

procedure entry fini(prio){
occupato=0;
waiting[prio]--;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);		
run[maxprio].signal();
}

Alessandro


//Processo con prioritá 0 = Processo con piú alta prioritá
//Processo con prioritá 9 = Processo con meno prioritá
monitor priocoop {
	condition oktogo[10];
	int wait[10] = 0,0,0,0,0,0,0,0,0;
	int running;
	priocoop.init(prio) {
		if(running != 0) {
			wait[prio]++;
			oktogo[prio].wait;
			wait[prio]--;
		}

		running++;
	}

	priocoop.yield(prio) {
		running--;
		for(int i = 0;i<10;i++) {
			if(wait[i] != 0) {
				oktogo[i].signal();
				wait[prio]++;
				oktogo[prio].wait;
				wait[prio]--;
				break();
			}
		}
		running++;
	}

	priocoop.fini() {
		running--;
		for(int i = 0;i<10;i++) {
			if(wait[i] != 0) {
				oktogo[i].signal();
				break();
			}
		}

	}
}

-Midolo


//0: priorita' maggiore
//9: priorita' minore
cond oktoenter[10];
int count[10];
bool running = false;

//restituisce la priorita' maggiore che ha un processo in attesa
getprio() {
      	for(i=0;i<10;i++) {
		 if(count[i]>0)
			 break;
	 }
	 return i;
}

priocoop() {
	init (prio) {
		if (running) {
			count[prio]++;
			oktoenter[prio].wait();
			count[prio]--;
		}
		running = true;
	}
	yield(prio) {
		i=getprio();
		if (i < 10) {
			// running = false; 
			oktoenter[i].signal();
			count(prio)++
			oktoenter[proc].wait();
	                // running = true;
        	        count[prio]--;
		}
	}
	fini(prio){
		i=getprio();
		if(i<10)
			oktoenter[i].signal;
		else
			running=false;
	}
}

-Stefano B.




monitor priocoop{
	condition oktoenter[10];
	queue waiting[10];
	
	procedure entry init(int prio){
		if(!(prio >= 0 && prio<=9))
			exit(0);
	}
	
	procedure entry yield(int prio){
		int priority=-1;
		for (i=0; i<10; i++) {
			if (! waiting[i].isempty())
				priority=i;
		}
		oktoenter[priority].signal();
		if(priority>=0){ /* se non ci fosse questo controllo avremmo un caso di deadlock
						  * in quanto le code sono vuote */
			waiting[prio].enqueue();
			oktoenter[prio].wait();
			waiting[prio].dequeue(); 
		}
	}
	
	procedure entry fini(){
		int priority=-1;
		for (i=0; i<10; i++) {
			if (! waiting[i].isempty())
				priority=i;
		}
		oktoenter[priority].signal();
	}
}

Francesca e Giulia

Esercizio 2

db.getpriortymax(); //funzione che restituisce il messaggio con prioritá maggiore e lo rimuove dal db o 0 nel caso il db sia vuoto
Process n: {

	psend(dest, prio,msg) {
		asend((msg, prio),dest);
	}

	precv(sender) {
		while((msg,prio) = arecv(sender)) {
			db[sender].insert((msg,prio));
		}
		return (db[sender].getpriortymax());
	}

}

-Midolo


Esercizio 3

lock=-1;

Process P[i]{
while(true){
  do{;}
  while(twomult.op(lock)==lock);
  //critical section
  lock = -lock;
  //no critical section
}
}

Inizialmente: a=1; b=1;

Primo processo: lock=-1 a=-1 b=1 Siccome lock!=b esce dal while.

Secondo processo: lock=-1 a=1 b=-1 Siccome lock==b non esce dal while e continua: lock=-1 a=1 b=-1 Si ripeterano sempre gli stessi valori, fino al cambio di valore di lock che passa da -1 a 1 così : lock=1 a=-1 b=-1; Siccome lock!=b esce dal while. Mentre l'altro processo si bloccherà poichè: lock=1 a=1 b=1; fino al ritorno di lock al valore -1; lock=-1 a=-1 b=1; C.V.D


Alessandro

Parte generale

Esercizio 1