Difference between revisions of "2017.07.17"

From Sistemi Operativi
Jump to navigation Jump to search
 
Line 36: Line 36:
 
condition ok2call;
 
condition ok2call;
  
procedure_entry boolean chiama(chiamato){
+
procedure_entry boolean chiama(int chiamato){
 
ok2call.wait();
 
ok2call.wait();
 
if(ok2speak[chiamato].signal()) {
 
if(ok2speak[chiamato].signal()) {
Line 44: Line 44:
 
}
 
}
  
procedure_entry boolean arrivato(nome){
+
procedure_entry boolean arrivato(int nome){
 
if(called[nome]) return false;
 
if(called[nome]) return false;
 
else ok2speak[nome].wait();
 
else ok2speak[nome].wait();
Line 50: Line 50:
 
}
 
}
  
procedure_entry void finepresentazione(nome){
+
procedure_entry void finepresentazione(int nome){
 
ok2call.signal();
 
ok2call.signal();
 
}
 
}
  
conf(){
+
conf(int N_SPEAKERS){
 
for(int i = 0; i < N_SPEAKERS; i++) called[i] = false;
 
for(int i = 0; i < N_SPEAKERS; i++) called[i] = false;
 
}
 
}

Latest revision as of 14:25, 9 May 2018

Pdf completo qui: 2017.07.17.tot.pdf


Esercizio c.1

In una conferenza il coordinatore decide lordine degli oratori e li chiama uno ad uno per poter fare il proprio intervento.
Se loratore arriva in ritardo (non sta attendendo al momento della chiamata) perde il diritto di poter parlare.

Coordinatore: process
	while True:
		chiamato = next(); //next è la funzione che restituisce il nome del prossimo oratore
		print(Chiamo ora a parlare ,chiamato);
		if (conf.chiama(chiamato))
			print(ringrazio , chiamato, per la relazione);
		else
			print(mi dispiace che , chiamato, non sia presente);

		Oratore[nome]: for nome in set_of_speakers
			if conf.arrivato(nome):
				//presentazione
				conf.finepresentazione(nome)

Scrivere il monitor conf. 
La funzione chiama aspetta che il relatore chiamato abbia completato lintervento, se prensente, e restituisce vero altrimenti restituisce falso.
La funzione arrivato segnala la presenza e pone il relatore in attesa del proprio turno. 
Se il relatore è già stato chiamato ed era assente restituisce falso.

Soluzione proposta 1

Monitor conf{

	boolean called[N_SPEAKERS];
	condition ok2speak[N_SPEAKERS];
	condition ok2call;

	procedure_entry boolean chiama(int chiamato){
		ok2call.wait();
		if(ok2speak[chiamato].signal()) {
			called[nome] = true;
			return true;
		}else return false;
	}

	procedure_entry boolean arrivato(int nome){
		if(called[nome]) return false;
		else ok2speak[nome].wait();
		return true;
	}

	procedure_entry void finepresentazione(int nome){
		ok2call.signal();
	}

	conf(int N_SPEAKERS){
		for(int i = 0; i < N_SPEAKERS; i++) called[i] = false;
	}

}