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:
*
indica se è fermo o in movimento
*
indica (nel caso in cui sia in movimento) verso dove stà andando
*
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