Esercizio multithread

di il
15 risposte

Esercizio multithread

Realizzare un'applicazione multithread costituita da n processi(P0,P1...Pn-1). Ciascun processo può utilizzare una singola CPU (CPU.calcola()) in mutua esclusione in modalità round-robin a partire da P0. Ogni volta che un processo utilizza la CPU consuma un solo quanto di tempo a partire da una dote iniziale fissata, in fase di inizializzazione dei thread, in modo casuale a x per i processi dispari e a 2x per quelli pari(P0,P2,...etc).L'applicazione termina quando tutti i processi hanno consumato la loro dote. La soluzione deve prevedere l'uso dei semafori.

Potete aiutarmi ?

15 Risposte

  • Re: Esercizio multithread

    centurione_agrippa ha scritto:


    Potete aiutarmi ?
    Innanzitutto bisognerebbe chiarire (almeno a me) alcune cose: calcola cosa fa di preciso? fa solo consumare un po' di tempo e basta? (a parte magari stampare qualche info)
    A proposito di tempo: il "quanto di tempo" lo determini tu all'inizio? E in modo casuale, ho capito bene? (es. all'inizio viene scelto 50ms e quindi 50ms per quelli dispari e 100ms per quelli pari?).

    Inoltre i "semafori" li devi implementare tu usando le primitive di sincronizzazione sugli oggetti (quindi in pratica al livello più basso) o puoi/devi usare le classi di sincronizzazione ad alto livello come es. java.util.concurrent.Semaphore?
  • Re: Esercizio multithread

    Calcola fa consumare il tempo. La x viene scelta in modo casuale con il comando math.random.
    Per quanto riguarda i semafori la classe è già definita,basta usare nome_semaforo.down() e nome_semaforo.up()
  • Re: Esercizio multithread

    Quello che mi blocca è: come facci in un thread a creare n processi ?
  • Re: Esercizio multithread

    Da quello che capisco dal testo, ogni thread un processo:tanti processi tanti thread

    Inviato dal mio LG-E440 utilizzando Tapatalk
  • Re: Esercizio multithread

    Direi cheil termine 'processo' per questo esercizio, e' fuorviante.

    Quello che e' richiesto e' che ogni thread faccia la sua elaborazione.
    Non devi lanciare un "processo" in termini di S.O, cioe' un'altro programma!
  • Re: Esercizio multithread

    In pratica dovrei creare una classe processo extends THREAD e in questa classe creare n thread ?
  • Re: Esercizio multithread

    centurione_agrippa ha scritto:


    e in questa classe creare n thread ?
    No, in un'altra classe (preferibilmente) creerai N istanze di processo e siccome è un Thread: a) avrà un run() (che esegue del codice nel contesto del thread e b) dovrai farlo partire con start() .
  • Re: Esercizio multithread

    Io intendevo: creare n thread in maniera ricorsiva e farli partire con lo start(). É la prima cosa che mi é sembrata piu` simile a cio` che chiede l`esrcizio

    Inviato dal mio LG-E440 utilizzando Tapatalk
  • Re: Esercizio multithread

    Quindi nel Main creo n processi thread che farò partire con lo start. Nella classe thread nel metodo run() utilizzerò la chiamata cpu.calcola(). Nella classe cpu utilizzerò un solo semaforo dato che la risorsa condivisa è una sola e in questa classe andrò a decrementare il tempo di ogni processo thread. Ora come farò ad eliminare un thread ?
  • Re: Esercizio multithread

    
    Thread [] array = new Thread[N]
    for(int i=0; i<N; i++) {
         array[i] = new Thread();
         array[i].start();
    }
    
    O comunque qualcosa del genere!
  • Re: Esercizio multithread

    centurione_agrippa ha scritto:


    Quindi nel Main creo n processi thread che farò partire con lo start. Nella classe thread nel metodo run() utilizzerò la chiamata cpu.calcola().

    centurione_agrippa ha scritto:


    Nella classe cpu utilizzerò un solo semaforo dato che la risorsa condivisa è una sola
    Sì, però c'è dettaglio importante che avevi detto all'inizio: "in modalità round-robin a partire da P0".
    Quando fai partire i thread con start(), ad esempio
    ta.start();
    tb.start();

    non c'è alcuna garanzia che il run() di ta inizi sempre davvero prima del run() di tb.
    Inoltre come è l'ordine di acquisizione del semaforo in relazione all'ordine di richiesta?
    Tutto questo solo per portare a galla la questione: chi/dove deve gestire la logica round-robin?

    centurione_agrippa ha scritto:


    e in questa classe andrò a decrementare il tempo di ogni processo thread. Ora come farò ad eliminare un thread ?
    Questo potresti gestirlo in processo. Cioè dare al processo un numero di "quanti" per cui eseguirà N volte calcola(). Era così che intendeva il testo iniziale, giusto?
  • Re: Esercizio multithread

    Andbin per la modalità round-robin a partire da P0 invece di usare un solo semaforo dovrò utilizzare n semafori
  • Re: Esercizio multithread

    centurione_agrippa ha scritto:


    andbin per la modalità round-robin a partire da P0 invece di usare un solo semaforo dovrò utilizzare n semafori
    Sì, se usi più semafori, uno per ciascun thread, è perfettamente possibile implementare una schedulazione round-robin.
    Il punto è che questo andrebbe fatto dentro calcola() e, cosa più importante, devi trovare il modo di associare i semafori ai thread.
  • Re: Esercizio multithread

    La soluzione che ho pensato è questa:

    Public class Esame{
    public static void main(String [] args){

    int n=10;
    // creo un vettore di semafori
    semafor mutex[]=new semafor [n];
    for(int i=0;i<n;i++){
    if(i==0)
    mutex=new semafor (1); //inizializzo il semaforo del primo processo a 1
    else
    mutex=new semafor(0); //inizializzo i restanti semafori a 0;
    }

    int x=math.random *10;

    //mi vado a conservare tutte le dote in un vettore
    vector dote=new vector(n);
    for(int i=0;i<n;i++){
    if(i%2==0)
    dote.addElement(2*x);
    else
    dote.addElement(x);
    }

    // creo un vettore di thread e li faccio partire
    th_proc processi[]=new th_proc[n];
    for(int i=0;i<n;i++){
    processi=new th_proc(mutex[],dote[]);
    processi.start();
    }
    }
    }


    // Creo la classe th_proc

    public class th_proc extends Thread{
    static int i; // variabile di controllol ciclo
    private semafor mutex[];
    private vector dote; private CPU cpu;
    static int cont=0; // variabile condizione di fine applicazione

    public th_proc(semafor mutex[],vector dote,CPU cpu){ // costruttore
    this.mutex[]=mutex[];
    this.dote=dote;
    this.cpu=cpu;
    }


    public void run(){

    while(cont<n){ // se il numero di tutti i dote è uguale a 0,termina il ciclo
    i=0;
    while(i<n){
    mutex.down();
    if (data.elementAt(i) != 0){
    cpu.calcola();
    dote.elementAt(i) - -;
    } else{
    cont++;
    dote.removeElementAt(i);
    }

    mutex.up();
    i++;
    }
    }
    }
    }

    }
Devi accedere o registrarti per scrivere nel forum
15 risposte