Esercizio Multithread

di il
6 risposte

Esercizio Multithread

Salve devo fare questo esercizio multithread di sistemi operativi in linguaggio java, il testo mi chiede di crear una classe thread processo che deve fare un numero fissato di elaborazioni ,per ogni elaborazione il singolo thread usa in mutua esclusione la cpu, quando la ottiene la occupa per un numero fissato di millisecondi e infine rilascia la risorsa alla fine dell'elaborazione.

i campi della classe processo sono il numero di esecuzioni del singolo thread e la cpu assegnatagli.

i thread processo hanno tutti la stessa priorità e l'unico VINCOLO è che il singolo processo non deve utilizzare mai la cpu per due quanti consecutivi.


come posso fare a implementare questo vincolo?

6 Risposte

  • Re: Esercizio Multithread

    MaryA ha scritto:


    il singolo thread usa in mutua esclusione la cpu, quando la ottiene la occupa per un numero fissato di millisecondi
    [...]
    non deve utilizzare mai la cpu per due quanti consecutivi.
    Parli di "quanti" precisi e di occupare la cpu per un certo numero preciso di millisecondi. Queste cose in Java NON le "controlli". Quando avvii un thread in Java, non puoi sapere o controllare a priori quanto/quando/come procederà il thread. La schedulazione dei thread dipende fortemente da JVM e soprattutto dal S.O.

    Precisa meglio il tutto ... perché scritto così il testo mi pare alquanto dubbio.
  • Re: Esercizio Multithread

    Ti scrivo il testo per intero

    realizzare una classe thread processo che deve effettuare un numero fissato di elaborazioni. Per ogni elaborazione il singolo thread usa in mutua esclusione la risorsa di calcolo,una volta che la ottiene la mantiene occupata per un numero fisso di millisecondi e rilascia la risorsa al termine dell'elaborazione.
    la classe processo ha come campi il numero di esecuzioni del singolo thread e la risorsa di calcolo che gli viene assegnata .
    i thread processo hanno tutti la stessa priorità . L'unico VINCOLO è che il singolo processo non deve utilizzare mai la cpu per due quanti consecutivi.
    Scrivere un programma che crei un oggetto della classe cpu e avvi l'esecuzione di n thread processo a cui sia stata assegnata la stessa risorsa di calcolo.
    ciascun thread processo dovrà eseguire 4 elaborazioni.

    come faccio a implementare questo VINCOLO?
  • Re: Esercizio Multithread

    Precisiamo allora un po' di cose.

    MaryA ha scritto:


    realizzare una classe thread processo che deve effettuare un numero fissato di elaborazioni.
    Ok

    MaryA ha scritto:


    Per ogni elaborazione il singolo thread usa in mutua esclusione la risorsa di calcolo
    Ok, tieni presente che in Java È possibile fare in modo che un blocco di codice sia eseguito in mutua esclusione tra più thread, ovvero detto in altro modo che un SOLO thread per volta esegua per intero quel blocco. Questo lo si fa usando opportunamente i lock "intrinseci" degli oggetti (o altro meccanismo di sincronizzazione di più alto livello).

    MaryA ha scritto:


    una volta che la ottiene la mantiene occupata per un numero fisso di millisecondi
    Se intendi dire che quel codice esegue es. una sleep() per attendere (quasi) esattamente tot millisecondi, allora ok, è un conto. Ma se intendi altro, dovresti precisare cosa "fa" il codice.

    MaryA ha scritto:


    la classe processo ha come campi il numero di esecuzioni del singolo thread e la risorsa di calcolo che gli viene assegnata .
    "risorsa di calcolo" cosa intendi? Lo ripeto ancora, NON puoi scegliere tu quale processore/core eseguirà un pezzo di codice.

    MaryA ha scritto:


    L'unico VINCOLO è che il singolo processo non deve utilizzare mai la cpu per due quanti consecutivi.
    Se intendi i "quanti" come inteso dallo schedulatore nativo, cioè i periodi di tempo-cpu che lo schedulatore dà ai thread volta per volta, questo lo ripeto, NON puoi controllarlo.
    Se invece intendi che lo stesso thread NON riesegua subito quel blocco di codice, cioè se ci sono per esempio i thread A B e C, e il thread A ha appena eseguito e terminato quel blocco di codice, allora solo B e C sono eleggibili per la esecuzione successiva, in modo che A non lo riesegua subito.
    Questo che ho appena detto si PUO' fare, bisogna sfruttare come minimo i wait/notify intrinseci degli oggetti con una tua piccola logica per cui se un thread X ha appena eseguito quel blocco allora deve restare in wait ALMENO finché un altro thread l'ha eseguito.
  • Re: Esercizio Multithread

    Si devo fare in modo che lo stesso thread non esegua subito quel blocco di codice; io ho provato a implementare questo schema, come potrei fare per inserire questo meccanismo che impedisca allo stesso thread di eseguire subito quel blocco di codice?

    class processo extends thread{
    int n_esec;
    CPU cpu;
    public processo(string str,int n_esec,CPU cpu){......}
    public void run(){...........}
    class CPU{
    int nthread=0;
    final int maxthread=1;
    synchronized boolean calcola(){........}
    synchronized void rilascia(){............}
  • Re: Esercizio Multithread

    MaryA ha scritto:


    Si devo fare in modo che lo stesso thread non esegua subito quel blocco di codice; io ho provato a implementare questo schema, come potrei fare per inserire questo meccanismo che impedisca allo stesso thread di eseguire subito quel blocco di codice?
    Non basta l'uso di synchronized. Questo garantisce solo la "mutua esclusione" ma non implica/impone nulla sulla sequenzialità dei thread che man mano acquisiscono il lock.

    Tra l'altro il lock intrinseco degli oggetti ha una politica di acquisizione che è "non-fair", ovvero l'acquisizione del lock NON segue esattamente l'ordine di richiesta. Se un thread A sta eseguendo un blocco synchronized e nel frattempo arriva il thread B che vorrebbe eseguirlo, va in attesa. Poco dopo arriva il thread C e va anche lui in attesa, poi arriva D e si mette anche lui in attesa. Quando il thread A esce dal blocco synchronized, quale dei tre thread B C D viene scelto NON è garantito, cioè è molto aleatorio e dipende anche dallo scheduler. Se i thread fanno un ciclo molto stretto su quel blocco di codice, è anche possibile in teoria che venga di nuovo scelto A per la esecuzione, addirittura PRIMA che B C D abbiano la possibilità di mettersi a competere per l'acquisizione del lock.

    Quello che a te serve è imporre una sequenzialità del tipo "lo stesso thread non può ripetersi consecutivamente". Per questo serve anche, come minimo, una "condition queue", ovvero sfruttare almeno il wait/notify degli oggetti.

    Un po' di tempo fa sul forum c'era stata una discussione in cui si era parlato di sequenzialità tra i thread. La discussione aveva coinvolto anche me. Faccio una ricerca, se la ritrovo te la link volentieri, perché ti potrebbe essere utile.
  • Re: Esercizio Multithread

    La discussione a cui mi riferivo e pensavo prima è questa:


    È un po' lunga ... ma ad un certo punto c'è un mio codice con spiegazione che ... spiega molto.
Devi accedere o registrarti per scrivere nel forum
6 risposte