Sistemi Operativi

di il
11 risposte

Sistemi Operativi

Buonasera a tutti,
ho un bel problema con questo compito di Sistemi Operativi.
Studio Ingegneria ed ho seguito la materia l'anno scorso, purtroppo quest'anno è cambiato il professore ed è anche cambiato il modo in cui risolvere gli esercizi, solo che a causa delle altre materie non ho potuto riseguirla . Fortunatamento sono riuscito ad avere un paio di compiti risolti dai miei colleghi ed ho provato a svolgerne io uno. Volevo chiedervi se potete aiutarmi a capire se ci sono errori ed in caso come risolverli. Grazie


Traccia
Traccia


Main

public class Main {

	public static void main(String[] args) {
		
		GestoreTratta G = new GestoreTratta();
		
		for(int i=0; i<=100; i++) {
			Thread t = new Treno(G);
			t.start();
			
		}
	}
}
Thread

public class Treno extends Thread {

	private GestoreTratta G;
	
	public Treno (GestoreTratta G) {
		this.G=G;
	}
	
	public void run() {
		
		boolean richiestaAB = false;
		boolean richiestaBA = false;
		boolean rilasciaAB=false;

		double d = Math.random();
		if(d<=0.48) {
			richiestaAB = true;
		}
		else {
			richiestaBA = true;
		}

		G.richiediTratta(richiestaAB);

		try {
			double d1 = (Math.random()*(3-2)+2)*1000*60;
			sleep((int)d1);
		}
		catch(Exception e) {
			e.getStackTrace();
		}

		G.rilasciaTratta(rilasciaAB);
	}
}
Monitor

import java.util.concurrent.locks.Lock;               
import java.util.concurrent.locks.Condition;          
import java.util.concurrent.locks.ReentrantLock;

public class GestoreTratta {

	Lock lock = new ReentrantLock();
	Condition TrenoAB = lock.newCondition();
	Condition TrenoBA = lock.newCondition();
	int numAttesaAB;
	int numAttesaBA;
	boolean occupato=false;

	public void richiediTratta(boolean richiestaAB) {
		this.lock.lock();
		try {
			while(occupato) {                
				if(richiestaAB) {            
					try {
						numAttesaAB++;     
						TrenoAB.await();    
						numAttesaAB--;      
					}
					catch(Exception e1) {
						e1.getStackTrace();
					}
				}
				else {
					try {
						numAttesaBA++;     
						TrenoBA.await();   
						numAttesaBA--;       
					}
					catch(Exception e2) {
						e2.getStackTrace();
					}
				}
			}
			if(richiestaAB) {
				try {
					numAttesaAB++;
					TrenoAB.await();
					numAttesaAB--;
				}
				catch(Exception e3) {
					e3.getStackTrace();
				}
			}
			else {
				try {
					numAttesaBA++;
					TrenoBA.await();
					numAttesaBA--;
				}
				catch(Exception e4) {
					e4.getStackTrace();
				}
			}
		}
		catch(Exception e) {
			e.getStackTrace();
		}
		finally {
			this.lock.unlock();
		}
	}


	public void rilasciaTratta (boolean rilasciaAB) {
		this.lock.lock();
		try {
			if(rilasciaAB) {
				try {
					numAttesaAB--;
					TrenoAB.signal();         
					numAttesaAB++;            
				}
				catch(Exception e5) {
					e5.getStackTrace();
				}
			}
			else {
				try {
					numAttesaBA--;
					TrenoBA.signal();
					numAttesaBA++;
				}
				catch(Exception e6) {
					e6.getStackTrace();
				}
			}
		}
		catch(Exception e) {
			e.getStackTrace();
		}
		finally {
			this.lock.unlock();
		}	
	}

}

11 Risposte

  • Re: Sistemi Operativi

    Tanto per saperlo ... se uno deve leggere tutto il compito (in una immagine pessima), controllare tutto il tuo codice senza sapere quali problemi cercare, come se fossi un docente tutor, beh non credere che avrai molte risposte.

    Se invece ci dici che hai compilato e provato il codice e non funziona questo o quello (di preciso) allora si può dare un'occhiata specifica e puoi avere più possibilità di avere una risposta ...

    Fai tu ...
  • Re: Sistemi Operativi

    L'immagine mi è arrivata così, ma rimane comunque leggibile.
    Io ho visto e compreso un pò di compiti e poi ne ho svolto uno per conto mio; purtroppo non ho modo di verificare se funziona o meno perchè numero 1 non saprei come fare e numero 2 il prof. non è per niente disponibile per queste cose.
    Comunque, l'unica cosa che non mi convince è il monitor, sul Thread e sul Main sono abbastanza sicuro siano corretti, in particolare il modo in cui ho inserito ed implementato i metodi signal e await
  • Re: Sistemi Operativi

    Uragano_ ha scritto:


    Volevo chiedervi se potete aiutarmi a capire se ci sono errori ed in caso come risolverli.
    Guarda, ho letto la traccia e secondo me ... direi che c'è un bel "buchetto" nella analisi/specifica dello scenario. Mi riferisco in particolare alla parte:

    La politica di risveglio dei treni in attesa deve dare priorità ai treni che hanno richiesto la stessa direzione dell'ultimo treno uscito dalla tratta

    E ti spiego anche il perché. Osserva bene il tuo run() del Treno. Tra l'inizio del run() e la invocazione del richiediTratta() passa un tempo piccolissimo. Quindi tu avrai 100 thread che in un periodo di tempo davvero piccolo arriveranno TUTTI quanti alla invocazione del richiediTratta(). E ciascuno dei treni si "schiera" in modo fisso da un lato o l'altro della tratta.

    Supponiamo di rispettare perfettamente (teoricamente) le probabilità, ovvero su 100 treni hai 48 treni che chiedono di fare A-->B e 52 treni che chiedono di fare B-->A. Vuol dire che ad un certo istante sono tutti "bloccati" e concettualmente accodati per poter passare.
    Supponi di far passare come primo treno uno che fa A-->B. Quando questo treno esce dalla tratta, con QUALE logica scegli il prossimo treno da far passare??
    Ricorda che ora hai 99 treni bloccati, alcuni da un lato, alcuni dall'altro lato della tratta ma concettualmente sono tutti, come si dice, "sulla stessa barca" ovvero bloccati e nessuno è più particolare dell'altro di per sé. Se dai priorità alla stessa direzione, fai passare un altro A-->B. E quando esce? Dai sempre priorità a A-->B?? Se si continua così, vuol dire che passerebbero prima TUTTI quelli A-->B e poi dopo TUTTI quelli B-->A. Non ha molto senso .... (né molta utilità)
    Ma era proprio questo l'obiettivo .... oppure no?

    Sarebbe stato molto più utile (e interessante per la logica) richiedere di rispettare la "alternanza". Cioè se prima è passato un A-->B, dopo deve poter passare un B-->A e dopo deve poter passare un A-->B, ecc...

    Hai afferrato?
  • Re: Sistemi Operativi

    Trovo ancora ""allucinante"" che in un esercizio, ci sia il problema da risolve

    ED INDICAZIONI su come risolverlo!!!!

    La filosofia dovrebbe essere:

    1) hai il problema
    2) ti sono state date le informazioni durante le lezioni
    3) ARRANGIATI !!!!!!
    4) ci riesci? Bene. Non ci riesci? CAMBIA MESTIERE!!!



    Serve un bel po' di sana selezione naturale

    @andbin: tu vedi buchetti, io SOLIDA ROCCIA!
    Non ci sono buchetti!
    La traccia fornisce TUTTE le informazioni necessarie.
    Ho il strano sospetto che ti sei perso un'informazione FONDAMENTALE, che ha OVVIE conseguenze.

  • Re: Sistemi Operativi

    migliorabile ha scritto:


    La traccia fornisce TUTTE le informazioni necessarie.
    Ho il strano sospetto che ti sei perso un'informazione FONDAMENTALE, che ha OVVIE conseguenze.
    Può darsi allora che mi sia perso qualcosa dalla traccia. Più tardi in giornata la rileggo tutta per bene ....
  • Re: Sistemi Operativi

    migliorabile ha scritto:


    Trovo ancora ""allucinante"" che in un esercizio, ci sia il problema da risolve

    ED INDICAZIONI su come risolverlo!!!!

    La filosofia dovrebbe essere:

    1) hai il problema
    2) ti sono state date le informazioni durante le lezioni
    3) ARRANGIATI !!!!!!
    4) ci riesci? Bene. Non ci riesci? CAMBIA MESTIERE!!!



    Serve un bel po' di sana selezione naturale
    Credo ti sia perso quello che ho scritto all'inizio.
    Ma comunque non capisco cosa ci sia di sbagliato nel chiedere una mano d'auito, ho solo chiesto se gentilmente potete fare un check del codice perchè non ho modo di verificarlo e perchè credo che qui ci siano persone molto più preparate di me che in poco tempo riescono ad individuare il problema.
  • Re: Sistemi Operativi

    andbin ha scritto:


    Uragano_ ha scritto:


    Volevo chiedervi se potete aiutarmi a capire se ci sono errori ed in caso come risolverli.
    Guarda, ho letto la traccia e secondo me ... direi che c'è un bel "buchetto" nella analisi/specifica dello scenario. Mi riferisco in particolare alla parte:

    La politica di risveglio dei treni in attesa deve dare priorità ai treni che hanno richiesto la stessa direzione dell'ultimo treno uscito dalla tratta

    E ti spiego anche il perché. Osserva bene il tuo run() del Treno. Tra l'inizio del run() e la invocazione del richiediTratta() passa un tempo piccolissimo. Quindi tu avrai 100 thread che in un periodo di tempo davvero piccolo arriveranno TUTTI quanti alla invocazione del richiediTratta(). E ciascuno dei treni si "schiera" in modo fisso da un lato o l'altro della tratta.

    Supponiamo di rispettare perfettamente (teoricamente) le probabilità, ovvero su 100 treni hai 48 treni che chiedono di fare A-->B e 52 treni che chiedono di fare B-->A. Vuol dire che ad un certo istante sono tutti "bloccati" e concettualmente accodati per poter passare.
    Supponi di far passare come primo treno uno che fa A-->B. Quando questo treno esce dalla tratta, con QUALE logica scegli il prossimo treno da far passare??
    Ricorda che ora hai 99 treni bloccati, alcuni da un lato, alcuni dall'altro lato della tratta ma concettualmente sono tutti, come si dice, "sulla stessa barca" ovvero bloccati e nessuno è più particolare dell'altro di per sé. Se dai priorità alla stessa direzione, fai passare un altro A-->B. E quando esce? Dai sempre priorità a A-->B?? Se si continua così, vuol dire che passerebbero prima TUTTI quelli A-->B e poi dopo TUTTI quelli B-->A. Non ha molto senso .... (né molta utilità)
    Ma era proprio questo l'obiettivo .... oppure no?

    Sarebbe stato molto più utile (e interessante per la logica) richiedere di rispettare la "alternanza". Cioè se prima è passato un A-->B, dopo deve poter passare un B-->A e dopo deve poter passare un A-->B, ecc...

    Hai afferrato?
    Da quel che ho capito è come hai scritto tu, ovvero prima passano tutti i treni A-->B, ad esempio, e quando non ce ne sono più passano tutti i treni B-->A; le tracce del professore che ho recuperato sono tutte molto contorte e con poca utilità pratica.
  • Re: Sistemi Operativi

    Uragano_ ha scritto:


    Ma comunque non capisco cosa ci sia di sbagliato nel chiedere una mano d'auito, ho solo chiesto se gentilmente potete fare un check del codice perchè non ho modo di verificarlo e perchè credo che qui ci siano persone molto più preparate di me che in poco tempo riescono ad individuare il problema.
    @Uragano_ NON STO contestanto il tuo diritto di chiedere aiuto. Non ho scritto questo!

    Ho scritto che ai miei tempi (ho fatto l'universta' anch'io) ti davano il problema, NON come impostarlo per risolvero. Questa era NOSTRA responsabilita. O ci riuscivamo o non si passava l'esame!

    In ogni caso quello che scrivi dimostra COMUNQUE che c'e' qualcosa che ancora non va!
    non ho modo di verificarlo
    Ma stai scherzando? Non hai modo di verificarlo?

    ESEGUILO sto benedetto codice che hai scritto!!

    O lo hai scritto con notepad e nemmeno compilato???

    ""Non ho modo di verificarlo"" !!!! Non ho parole!!!



    All'alba dei tempi NON AVEVI Internet o Googleo i Forum, eppure SENZA NE Integret NE Google, NE i Forum, c'e' gente che ha CREATO Internet e Google!!! E i Forum.

  • Re: Sistemi Operativi

    Guarda sarò sincero, tutto il mondo dell'informatica non mi piace per niente, però ci sto mettendo tutto l'impegno possibile perchè mi servirà.

    ESEGUILO sto benedetto codice che hai scritto!!

    O lo hai scritto con notepad e nemmeno compilato???

    ""Non ho modo di verificarlo"" !!!! Non ho parole!!!

    Il codice per come l'ho scritto è inutile che lo esegua perchè ovviamente non fa nulla, apre solo il main e basta.
  • Re: Sistemi Operativi

    LO SO che non fa niente! So leggere il codice!

    Sei TU quello che lo deve far funzionare!

    FALLO FUNZIONARE!!!

    TU! Non qualcun altro, TU!
    tutto il mondo dell'informatica non mi piace per niente
    A noi va benissimo: meno concorrenza
  • Re: Sistemi Operativi

    migliorabile ha scritto:



    Sei TU quello che lo deve far funzionare!

    FALLO FUNZIONARE!!!

    TU! Non qualcun altro, TU!
    Na parola
Devi accedere o registrarti per scrivere nel forum
11 risposte