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]