INFOPedia : LSOIsolaTerra

HomePage :: Categorie :: Indice :: Ultime modifiche :: Ultimi commenti :: Login/Registrazione
La versione più recente è stata modificata il 2006-06-16 14:03:32 da DenteDiLupo

\Nessuna differenza.


Modificato il 2006-06-16 14:03:16 da DenteDiLupo [Aggiunto testo esercizio]

Aggiunzioni:
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.




Modificato il 2006-06-16 14:01:13 da DenteDiLupo

Aggiunzioni:
* 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


Omissioni:
*
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




La versione più vecchia di questa pagina è stata modificata il 2006-06-16 14:00:45 da DenteDiLupo [Aggiunta pagina]
Vista della pagina:

Traghetti di cui uno con priorità


//------------------------------------------
// 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
Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by Wikka Wakka Wiki 1.1.6.1
La pagina è stata generata in 0.1952 secondi