ProvaPratica 2010.07.12

From Sistemi Operativi
Jump to navigation Jump to search

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

P1: 1ms IoR, 7ms CPU, 1ms IoW, 1ms IoR, 7ms CPU, 1ms IoW, 1ms IoR, 7ms CPU, 1ms IoW, 1ms IoR, 7ms CPU, 1ms IoW
P2: 2ms IoR, 2ms CPU, 2ms IoW, 2ms IoR, 2ms CPU, 2ms IoW, 2ms IoR, 2ms CPU, 2ms IoW, 2ms IoR, 2ms CPU, 2ms IoW

time 1234567890123456789012345678901234567890
CPU   111111122111111122111111122111111122
IO   122     112222   112222   112222   1 22

time 1234567890123456789012345678901234567890
CPU   11221111122111122111 2211111111  11111
IO   122  2222 112222  22221122      11     1

Esercizio 2

a) Lo stato è SAFE per x >= 8

Esempio di sequenza:

So1.png

COH valuta 2 = 20 → 15 → 30 → 0 → 30+x → 10+x → 32+x il seguito dipende dal valore di x

La sequenza è: 2 - 1 - 3 - 4

b1) con x = 8 e la sequenza: 2 - 4 si arriva in uno stato UNSAFE

b2) con x = 7 e la sequenza: 2 - 1 si è in uno stato SAFE


Giulia N.