INFOPedia : LSOTraghetti

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

Problema dei taghetti


In un arcipelago due isole (per semplicità chiamate A e B) sono collegate alla terra ferma e tra di loro da due traghetti (per semplicità T1 e T2), in funzione 24 ore su 24. T1 collega la terra ferma all'isola A; T2 collega l'isola A all'isola B.
L'isola A ha un porto molto piccolo e consente ad uno solo dei due traghetti di attraccare, quindi i traghetti partono nel momento in cui:
- hanno raggiungono il loro carico massimo (MAXLOADT1 e MAXLOADT2)
- oppure se uno dei due e' attraccato sull'isola A e sta sopraggiungendo l'altro traghetto.

Compito per gli alunni di secondo anno

1. Scrivere il programma Tragretti in C che abbia le i seguenti processi:
Trag1();
Trag2();
Il programma deve soddisfare alle seguenti caratteristiche:
a) assenza di deadlock
b) assenza di partenze con carico maggiore dal consentito
c) assenza di attrachi contemporanei sull'isola A.

2. Spiegare come le proprietà a)-c) sono rispettate dal vostro algoritmo.

//-------------------------------------------------------------------------
// IMPORTO LE LIBRERIE NECESSARIE
//-------------------------------------------------------------------------

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

//-------------------------------------------------------------------------
// DEFINISCO COSTATI E FUNZIONI
//-------------------------------------------------------------------------

#define MAXLOAD_1 2500
#define MAXLOAD_2 3000

#define T1 5000
#define T2 3000

#define randomize srand((unsigned)time(NULL));
#define GetRandom(min,max) ( ( rand()%(int)(max) ) +min ));
void trag1();
void trag2();


//-------------------------------------------------------------------------
// DEFINISCO LE VARIABILI
//-------------------------------------------------------------------------

int stato[2];                //  0 = fermo    1 = movimento 
int vattene[2];             //  0 = normale  1 = smuoviti
HANDLE h_porto ;            // Mutex per il porto A



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


void main(){

    //char ch;

    //INIZIALIZZO MUTEX ED I 2 THREADS
    h_porto = CreateMutex(NULL,false,NULL);
    CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)trag1,NULL,0,NULL);
    CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)trag2,NULL,0,NULL);

    getch();
   
}

void trag1(){
    int carico;
    DWORD result;
    while (1) {

        //VIAGGIO DA C ad A
       
        result = WaitForSingleObject(h_porto,300);
        //controllo la disponibilità del porto...
        if ( (result == WAIT_TIMEOUT ) || (result == WAIT_ABANDONED) ) {
            if (stato[1] == 0 ){
                printf("1) Faccio Partire l'altro traghetto\n");
                vattene[1] = 1;
                while(stato[1]==0);
            }
            else Sleep(T2); // aspetto che l'altro traghetto arriva
        }
        else{
            stato[0] = 1;
            printf("1) Parto da C verso A\n");
            Sleep(T1);
            printf("1) Arrivo in A\n");
            stato[0] = 0;

            printf("1 ) Carichiamo professori morti dall'isola A...\n");
            carico = 0;
            while ((carico != MAXLOAD_1) && (vattene[0] == 0)){ //carico professori morti
                carico += 100;
                Sleep(50);           
            }

            if (vattene[0]) {
                    printf("1 ) Parto perchè sta arrivando l'altro traghetto ...\n");
                    vattene[0] = 0;
            }
            else printf("1) Parto : CARICO PIENO\n");

            //VIAGGIO DA A a C
            ReleaseMutex(h_porto);
            stato[0] = 1;
            Sleep(T1);
            printf("1) Sono arrivato a C, scarico i prof \n");
            stato[0] = 0;
            Sleep(3000); //scarico i prof

           
        }

    }
}

void trag2(){

    int carico=MAXLOAD_2;
    DWORD result;
    while (1) {
       
        //VIAGGIO DA B ad A
       
        result = WaitForSingleObject(h_porto,300);
        //controllo la disponibilità del porto...
        if ( (result == WAIT_TIMEOUT ) || (result == WAIT_ABANDONED) ) {
            if (stato[0] == 0 ){
                printf("2) Faccio Partire l'altro traghetto\n");
                vattene[0] = 1;
                while(stato[0]==0);
            }
            else Sleep(T1); // aspetto che l'altro traghetto arriva
        }
        else{
            stato[1] = 1;
            printf("2) Parto da B verso A\n");
            Sleep(T2);
            printf("2) Arrivo in A\n");
            stato[1] = 0;
            printf("2 ) Scarichiamo professori vivi nell'isola A...\n");
            Sleep(3000); //scarico i prof

            while ((carico != 0) && (vattene[1] == 0)){ //carico professori morti
                carico -= 100;
                Sleep(50);           
            }
            if (vattene[1]){
                printf("2) Parto perchè sta arrivando l'altro traghetto ...\n");
                vattene[1] = 0;
            }
                else printf("2) Parto : CARICO VUOTO\n");
           
           
            //VIAGGIO DA A a B
            ReleaseMutex(h_porto);
            stato[1] = 1;
            Sleep(T2);
            printf("2) Sono arrivato a B, carico i prof \n");
            stato[0] = 0;
            while (carico != MAXLOAD_2) { //carico professori vivi
                carico += 100;
                Sleep(50);           
            }
           
           
        }//else
       
    }//while(1)
}




Torna a Lab 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.2384 secondi