INFOPedia : LSOIsolaTerra

HomePage :: Categorie :: Indice :: Ultime modifiche :: Ultimi commenti :: Login/Registrazione

Traghetti di cui uno con priorità


Un isola I è collegata alla terra ferma T tramite due traghetti T1 e T2. Il traghetto T1 inizia le sue corse dalla terra ferma , ha una capacita di carico pari a 10 vetture ed una velocità tale da percorrere la distanza in 20’. Il traghetto T2 inizia le sue corse dall’isola, ha una capacita di carico pari a 5 vetture ed una velocità tale da percorrere la distanza in 30’. I porti dell’isola e della terra ferma consentono un unico attracco quindi non è possibile che i due traghetti siano attraccati allo stesso porto. Il traghetto T1 ha priorità rispetto a T2 ossia T1 non deve aspettare T2. I traghetti aspettano l’arrivo delle autovetture distanziate di un tempo t random da 1 a 10’, e partono alla volta del porto successivo dopo avere imbarcato il loro massimo numero di vetture o per T2 in presenza dell’arrivo di T1.

La vita dei traghetti è la seguente:

finché non affonda

1. finché il numero di vetture imbarcate < CDC o per T2 T1 sta arrivando

a. si aspetti un tempo random da 1 a 10 l’arrivo di una vetture

2. Si attraversi il tratto di mare da I a T o viceversa

3. ritorna al punto 1

Sviluppare in linguaggio C in ambiente linux o windows un programma che simuli la situazione descritta commentando le scelte fatte.
//------------------------------------------
// IMPORTO LE LIBRERIE NECESSARIE
//------------------------------------------

#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <time.h>

//------------------------------------------
//DEFINISCO COSTANTI E FUNZIONI
//------------------------------------------
#define TEMPO1 20000        //tempo di percorrenza primo traghetto
#define TEMPO2 30000        //tempo di percorrenza secondo traghetto

#define randomize srand((unsigned)time(NULL));
#define GetRandom(min,max) (rand()% ((int)(max)+1-(min)) + (min));

void T1();                    //funzione per il primo traghetto
void T2();                    //funzione per il secondo traghetto


//------------------------------------------
//DICHIARO LE VARIABILI
//------------------------------------------
CRITICAL_SECTION cs;


int tratta=0;    //indica che tratta stà percorrendo il traghetto T1
int stato=0;    //indica se il tragetto 1 è fermo 0 o in movimento 1
int posizione=0;//indica se il traghetto è fermo, in che posizione si trova



//------------------------------------------
//MAIN
//------------------------------------------

void main(){
   

    InitializeCriticalSection(&cs);

    printf("*******************************\n");
    printf("***Premi un tasto per uscire***\n");
    printf("*******************************\n");


    //Creo i Thread T1 e T2
    CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)T1,NULL,0,NULL);
    CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)T2,NULL,0,NULL);

    //Quando premo un tasto esco
   
    getch();
}

//------------------------------------------
//THREAD1
//------------------------------------------

/*
 * IL traghetto T1 memorizza in delle variabili globali protette da CriticalSection
 * informazioni sul suo stato, in particolare :
 * stato indica se è fermo o in movimento
 * tratta indica (nel caso in cui sia in movimento) verso dove stà andando
 * posizione indica (nel caso in cui sia fermo) la posizione del traghetto
 * Avrei potuto usare meno variabili, ma le ho tenute per la leggibilità del codice
 */


void T1(){

int source = 0;        //posizione del traghetto il traghetto T1 è nella terraferma
int carico=0;        //carico attuale del traghetto
int tempo;            //Tempo di attesa per nuova macchina


while(1){

    EnterCriticalSection(&cs)//aggiorno le infomazioni sullo stato del traghetto T1
        printf("IL traghetto T1 è in  %d\n",source);
        posizione = source;
        stato=0;
    LeaveCriticalSection(&cs);

       

        /* ********************
        * ***FASE DI CARICO***
        * ********************
        */

       
        Sleep(1000);
        carico = 0;        //Il traghetto scarica le macchine

        while(carico<10){ //fino a quando non sono state caricate 10 autovetture
            carico++;
            tempo = GetRandom(1000,10000);
            Sleep(tempo);
        }

        printf("Traghetto 1 : PIENO\n");

        /* ********************
        * ****SI PARTE!!!!****
        * ********************
        */

            printf("Il Traghetto T1 parte da %d verso %d\n",source,1-source);
           
            Sleep(TEMPO1/2); //A metà tratta comunico che stò arrivando
           
            EnterCriticalSection(&cs); //aggiorno le infomazioni sullo stato del traghetto T1
                stato=1;
                tratta=1-source;
            LeaveCriticalSection(&cs);

            Sleep(TEMPO1/2); //Faccio l'ultima metà del viaggio
            source = 1-source; //aggiorno la posizione del traghetto
           
    }
}

//------------------------------------------
//THREAD2
//------------------------------------------

/* IL traghetto T2 deve tenere sotto controllo T1, in particolare :
 * durante la fase di carico oltre a controllare che il suo carico attuale superi quello max
 * controlla se il traghetto T1 è in movimento e si muove verso il suo porto.
 * Inoltre , prima di partire aspetta se il traghetto è fermo nel porto di destinazione
 * Non ci sono DeadLock perchè T1 può ottenere la risorsa (il porto) costringendo T2
 * a lasciare il porto, prima che questa abbia finito di caricare le macchine
 */


void T2(){
int source=1; //posizione attuale del traghetto, se 0 = terra ferma, se 1 = isola;
int carico=0;
int tempo;



while(1){
   
    printf("IL traghetto T2 è in  %d\n",source);
       

        /* ********************
        * ***FASE DI CARICO***
        * ********************
        */

   
        Sleep(1000);
        carico = 0;        //Il traghetto scarica le macchine
        while((carico<5) && (stato==0) && (tratta != source)){ //fino a quando non sono state caricate 10 autovetture oppure T1 è in movimento verso il porto di T2
            carico++;
            tempo = GetRandom(1000,10000);
            Sleep(tempo);
        }

        if ((stato==1) && (tratta == source)) printf("Traghetto 2 : parto perchè stà arrivando T1\n");
        else
            printf("Traghetto 2 : PIENO\n");

        while((stato==0) && (posizione == 1-source)); //aspetto se l'altro traghetto è fermo nella mia destinazione
       
        /* ********************
        * ****SI PARTE!!!!****
        * ********************
        */


        printf("Il Traghetto T2 parte da %d verso %d\n",source,1-source);
        Sleep(TEMPO2);            //tempo del viaggio
        source = 1-source;        //aggiorno la posizione del traghetto
       
}
}




Laboratorio di Sistemi Operativi

Non ci sono commenti in questa pagina. [Scrivi commento]

Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by Wikka Wakka Wiki 1.1.6.1
La pagina è stata generata in 0.1833 secondi