La versione più recente è stata modificata il 2007-05-25 16:02:48 da ViViana
Aggiunzioni:
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.
Omissioni:
In un arcipelago due isole (per semplicità chiamatie 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.
Modificato il 2007-05-25 16:02:20 da ViViana [testo dell'esercizio]
Aggiunzioni:
In un arcipelago due isole (per semplicità chiamatie 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.
Omissioni:
In un arcipelago composto da due isole (per semplicità chiamati 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 e che collgano T1 la terra ferma all'isola A , e T2 l'isola A all'isola B . L'isola A ha un porto molto piccolo e consente uno solo dei due traghetti di attraccare quindi Il tragetti partono nel momento in cui o hanno raggiungono il loro carico massimo (MAXLOADT1 e MAXLOADT2) o se uno dei due e attraccato sull'isola A e sta sopragiungendo l'altro traghetto.
Modificato il 2006-06-08 16:57:36 da DenteDiLupo
Aggiunzioni:
Modificato il 2006-06-08 16:56:23 da DenteDiLupo [Versione + aggiornata]
Aggiunzioni:
IMPORTO LE LIBRERIE NECESSARIE
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");
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)
Omissioni:
Importo le librerie necessarie...
#include <stdlib.h>
#include <process.h>
Definisco le funzioni e procedure...
#define randomize srand((unsigned)time(NULL))
#define GetRandom(min,max) ((rand()%(int)(max)+(min)))
Definisco le variabili globali e le costanti...
#define T 2000 definisco un tempo di percorrenza tra 2 porti
#define max_T1 10 definisco il carico massimo del traghetto T1
#define max_T2 20 definisco il carico massimo del traghetto T2
HANDLE H_Mutex_A; definisco un handle per l'isola A
int porto[2]; variabile che mi indica dove è attraccato il traghetto Tn
CRITICAL_SECTION stampa; no comment
void Trag1();
void Trag2();
MAIN...
void main()
{
inizializzo la critical section
InitializeCriticalSection(&stampa);
Creo il mutex
H_Mutex_A =
CreateMutex(NULL,false,NULL);
inizializzo le posizioni di partenza dei traghetti
porto[0] = 0; il traghetto T1 parte dalla terra ferma
porto[1] = 0;
il traghetto T2 parte dal porto dell'isola B
Creo i due thread dei traghetti
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)
Trag1,NULL,0,NULL);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)
Trag2,NULL,0,NULL);
while (getch() != 'q');
Trag1...
void Trag1()
{
int carico = 0; variabile che mi indica il carico attuale del traghetto
int finito;
variabile che mi indica se ho finito di caricare
int temp; variabile per il carico da aggiungere
while (1)
{
controllo se il traghetto è nella terra ferma
if (porto[0] 0)
{
il traghetto è attraccato al porto di terra ferma con carico = 0
finito = 0;
finchè non è completamente carico non parte
while ( (carico < max_T1) && (finito
0) )
{
arriva un carico
randomize;
temp =
GetRandom(1,5);
if ( (carico+temp) <= max_T1)
{
carico = carico + temp;
}
else
{
finito = 1;
}
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T1 ha caricato %d\n",carico);
esco dalla critical section <
LeaveCriticalSection(&stampa);
una volta carico,deve partire per il porto dell'isola A
controllo se il porto dell'isola A è libero
if ( porto[1] 0 )
{
altrimenti,costringo il traghetto T2 a levarsi dalle palle.
else
{
indico a T2 che T1 sta partendo per il porto dell'isola A
porto[0] = 1;
WaitForSingleObject(H_Mutex_A,INFINITE);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("nel porto A c'era T2,lo mando a cagar,e parto...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
Sleep(T);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T1 e' arrivato al porto dell'isola A,scarica la merce...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
controllo se il traghetto si trova nel porto dell'isola A
else
{
il taghetto è attraccato al porto dell'isola A con carico = 0
finito = 0;
parte o quando è completamente carico,o quando T2 chiede l'attracco al porto A.
while ( ( carico < max_T1 ) && ( porto[1]
0) && (finito 0) )
{
arriva un carico
randomize;
temp =
GetRandom(1,5);
if ( (carico+temp) <= max_T1)
{
carico = carico + temp;
}
else
{
finito = 1;
}
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T1 ha caricato %d\n",carico);
esco dalla critical section <
LeaveCriticalSection(&stampa);
ReleaseMutex(H_Mutex_A);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T1 e' partito dal porto dell'isola A\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
Sleep(T);
porto[0] = 0;
Trag2...
void Trag2()
{
int carico = 0; variabile che mi indica il carico attuale del traghetto
int finito;
variabile che mi indica se ho finito di caricare
int temp; variabile per il carico da aggiungere
while (1)
{
controllo se il traghetto è nella terra ferma
if (porto[1]
0)
{
il traghetto è attraccato al porto di terra ferma con carico = 0
finito = 0;
finchè non è completamente carico non parte
while ( (carico < max_T2) && (finito 0) )
{
arriva un carico
randomize;
temp =
GetRandom(1,5);
if ( (carico+temp) <= max_T2)
{
carico = carico + temp;
}
else
{
finito = 1;
}
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T2 ha caricato %d\n",carico);
esco dalla critical section <
LeaveCriticalSection(&stampa);
una volta carico,deve partire per il porto dell'isola A
controllo se il porto dell'isola A è libero
if ( porto[0]
0 )
{
altrimenti,costringo il traghetto T1 a levarsi dalle palle.
else
{
indico a T1 che T2 sta partendo per il porto dell'isola A
porto[1] = 1;
WaitForSingleObject(H_Mutex_A,INFINITE);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("nel porto A c'era T1,lo mando a cagar,e parto...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
Sleep(T);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T2 e' arrivato al porto dell'isola A,scarica la merce...\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
controllo se il traghetto si trova nel porto dell'isola A
else
{
il taghetto è attraccato al porto dell'isola A con carico = 0
finito = 0;
parte o quando è completamente carico,o quando T2 chiede l'attracco al porto A.
while ( ( carico < max_T2 ) && ( porto[0] 0) && (finito
0) )
{
arriva un carico
randomize;
temp =
GetRandom(1,5);
if ( (carico+temp) <= max_T2)
{
carico = carico + temp;
}
else
{
finito = 1;
}
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T2 ha caricato %d\n",carico);
esco dalla critical section <
LeaveCriticalSection(&stampa);
ReleaseMutex(H_Mutex_A);
entro nella critical section <
EnterCriticalSection(&stampa);
printf("il traghetto T2 e' partito dal porto dell'isola A\n");
esco dalla critical section <
LeaveCriticalSection(&stampa);
Sleep(T);
porto[1] = 0;
Modificato il 2006-06-03 15:07:01 da ChiptuttoFuso
Aggiunzioni:
Trag1();
Trag2();
Omissioni:
Trag1;
Trag2;
Modificato il 2006-06-03 15:06:22 da DenteDiLupo
Aggiunzioni:
Trag1;
Trag2;
Omissioni:
Trag1;
Trag2;
Modificato il 2006-06-03 15:01:55 da ChiptuttoFuso
Aggiunzioni:
Torna a Lab Sistemi Operativi
La versione più vecchia di questa pagina è stata modificata il 2006-06-03 14:57:33 da ChiptuttoFuso [sistemato bordello che avevo fatto..]
Vista della pagina:
Problema dei taghetti
In un arcipelago composto da due isole (per semplicità chiamati 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 e che collgano T1 la terra ferma all'isola A , e T2 l'isola A all'isola B . L'isola A ha un porto molto piccolo e consente uno solo dei due traghetti di attraccare quindi Il tragetti partono nel momento in cui o hanno raggiungono il loro carico massimo (MAXLOADT1 e MAXLOADT2) o se uno dei due e attraccato sull'isola A e sta sopragiungendo 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 <stdlib.h>
#include <process.h>
#include <windows.h>
#include <conio.h>
#include <time.h>
//---------------------------------------------------------------------------------------------
// Definisco le funzioni e procedure...
//---------------------------------------------------------------------------------------------
#define randomize srand((unsigned)time(NULL))
#define GetRandom(min,max) ((rand()%(int)(max)+(min)))
//---------------------------------------------------------------------------------------------
// Definisco le variabili globali e le costanti...
//---------------------------------------------------------------------------------------------
#define T 2000 //definisco un tempo di percorrenza tra 2 porti
#define max_T1 10 //definisco il carico massimo del traghetto T1
#define max_T2 20 //definisco il carico massimo del traghetto T2
HANDLE H_Mutex_A; //definisco un handle per l'isola A
int porto[2]; //variabile che mi indica dove è attraccato il traghetto Tn
CRITICAL_SECTION stampa; //no comment
void Trag1();
void Trag2();
//---------------------------------------------------------------------------------------------
// MAIN...
//---------------------------------------------------------------------------------------------
void main()
{
//inizializzo la critical section
InitializeCriticalSection(&stampa);
//Creo il mutex
H_Mutex_A = CreateMutex(NULL,false,NULL);
//inizializzo le posizioni di partenza dei traghetti
porto[0] = 0; //il traghetto T1 parte dalla terra ferma
porto[1] = 0; //il traghetto T2 parte dal porto dell'isola B
//Creo i due thread dei traghetti
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Trag1,NULL,0,NULL);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Trag2,NULL,0,NULL);
while (getch() != 'q');
}
//---------------------------------------------------------------------------------------------
// Trag1...
//---------------------------------------------------------------------------------------------
void Trag1()
{
int carico = 0; //variabile che mi indica il carico attuale del traghetto
int finito; //variabile che mi indica se ho finito di caricare
int temp; //variabile per il carico da aggiungere
while (1)
{
//controllo se il traghetto è nella terra ferma
if (porto[0] == 0)
{
//il traghetto è attraccato al porto di terra ferma con carico = 0
carico = 0;
finito = 0;
//finchè non è completamente carico non parte
while ( (carico < max_T1) && (finito == 0) )
{
//arriva un carico
randomize;
temp = GetRandom(1,5);
if ( (carico+temp) <= max_T1)
{
carico = carico + temp;
}
else
{
finito = 1;
}
}
//entro nella critical section <-------------------------------------------------------------------------
EnterCriticalSection(&stampa);
printf("il traghetto T1 ha caricato %d\n",carico);
//esco dalla critical section <-------------------------------------------------------------------------
LeaveCriticalSection(&stampa);
//una volta carico,deve partire per il porto dell'isola A
//controllo se il porto dell'isola A è libero
if ( porto[1] == 0 )
{
WaitForSingleObject(H_Mutex_A,INFINITE);
//entro nella critical section <-------------------------------------------------------------------------
EnterCriticalSection(&stampa);
printf("il porto A e' libero,il traghetto T1,carico di merda,parte...\n");
//esco dalla critical section <-------------------------------------------------------------------------
LeaveCriticalSection(&stampa);
Sleep(T);
porto[0] = 1;
//entro nella critical section <-------------------------------------------------------------------------
EnterCriticalSection(&stampa);
printf("il traghetto T1 e' arrivato al porto dell'isola A,scarica la merce...\n");
//esco dalla critical section <-------------------------------------------------------------------------
LeaveCriticalSection(&stampa);
}
//altrimenti,costringo il traghetto T2 a levarsi dalle palle.
else
{
//indico a T2 che T1 sta partendo per il porto dell'isola A
porto[0] = 1;
WaitForSingleObject(H_Mutex_A,INFINITE);
//entro nella critical section <-------------------------------------------------------------------------
EnterCriticalSection(&stampa);
printf("nel porto A c'era T2,lo mando a cagar,e parto...\n");
//esco dalla critical section <-------------------------------------------------------------------------
LeaveCriticalSection(&stampa);
Sleep(T);
//entro nella critical section <-------------------------------------------------------------------------
EnterCriticalSection(&stampa);
printf("il traghetto T1 e' arrivato al porto dell'isola A,scarica la merce...\n");
//esco dalla critical section <-------------------------------------------------------------------------
LeaveCriticalSection(&stampa);
}
}
//controllo se il traghetto si trova nel porto dell'isola A
else
{
//il taghetto è attraccato al porto dell'isola A con carico = 0
carico = 0;
finito = 0;
//parte o quando è completamente carico,o quando T2 chiede l'attracco al porto A.
while ( ( carico < max_T1 ) && ( porto[1] == 0) && (finito == 0) )
{
//arriva un carico
randomize;
temp = GetRandom(1,5);
if ( (carico+temp) <= max_T1)
{
carico = carico + temp;
}
else
{
finito = 1;
}
}
//entro nella critical section <-------------------------------------------------------------------------
EnterCriticalSection(&stampa);
printf("il traghetto T1 ha caricato %d\n",carico);
//esco dalla critical section <-------------------------------------------------------------------------
LeaveCriticalSection(&stampa);
ReleaseMutex(H_Mutex_A);
//entro nella critical section <-------------------------------------------------------------------------
EnterCriticalSection(&stampa);
printf("il traghetto T1 e' partito dal porto dell'isola A\n");
//esco dalla critical section <-------------------------------------------------------------------------
LeaveCriticalSection(&stampa);
Sleep(T);
porto[0] = 0;
}
}
}
//---------------------------------------------------------------------------------------------
// Trag2...
//---------------------------------------------------------------------------------------------
void Trag2()
{
int carico = 0; //variabile che mi indica il carico attuale del traghetto
int finito; //variabile che mi indica se ho finito di caricare
int temp; //variabile per il carico da aggiungere
while (1)
{
//controllo se il traghetto è nella terra ferma
if (porto[1] == 0)
{
//il traghetto è attraccato al porto di terra ferma con carico = 0
carico = 0;
finito = 0;
//finchè non è completamente carico non parte
while ( (carico < max_T2) && (finito == 0) )
{
//arriva un carico
randomize;
temp = GetRandom(1,5);
if ( (carico+temp) <= max_T2)
{
carico = carico + temp;
}
else
{
finito = 1;
}
}
//entro nella critical section <-------------------------------------------------------------------------
EnterCriticalSection(&stampa);
printf("il traghetto T2 ha caricato %d\n",carico);
//esco dalla critical section <-------------------------------------------------------------------------
LeaveCriticalSection(&stampa);
//una volta carico,deve partire per il porto dell'isola A
//controllo se il porto dell'isola A è libero
if ( porto[0] == 0 )
{
WaitForSingleObject(H_Mutex_A,INFINITE);
//entro nella critical section <-------------------------------------------------------------------------
EnterCriticalSection(&stampa);
printf("il porto A e' libero,il traghetto T2,carico di merda,parte...\n");
//esco dalla critical section <-------------------------------------------------------------------------
LeaveCriticalSection(&stampa);
Sleep(T);
porto[1] = 1;
//entro nella critical section <-------------------------------------------------------------------------
EnterCriticalSection(&stampa);
printf("il traghetto T2 e' arrivato al porto dell'isola A,scarica la merce...\n");
//esco dalla critical section <-------------------------------------------------------------------------
LeaveCriticalSection(&stampa);
}
//altrimenti,costringo il traghetto T1 a levarsi dalle palle.
else
{
//indico a T1 che T2 sta partendo per il porto dell'isola A
porto[1] = 1;
WaitForSingleObject(H_Mutex_A,INFINITE);
//entro nella critical section <-------------------------------------------------------------------------
EnterCriticalSection(&stampa);
printf("nel porto A c'era T1,lo mando a cagar,e parto...\n");
//esco dalla critical section <-------------------------------------------------------------------------
LeaveCriticalSection(&stampa);
Sleep(T);
//entro nella critical section <-------------------------------------------------------------------------
EnterCriticalSection(&stampa);
printf("il traghetto T2 e' arrivato al porto dell'isola A,scarica la merce...\n");
//esco dalla critical section <-------------------------------------------------------------------------
LeaveCriticalSection(&stampa);
}
}
//controllo se il traghetto si trova nel porto dell'isola A
else
{
//il taghetto è attraccato al porto dell'isola A con carico = 0
carico = 0;
finito = 0;
//parte o quando è completamente carico,o quando T2 chiede l'attracco al porto A.
while ( ( carico < max_T2 ) && ( porto[0] == 0) && (finito == 0) )
{
//arriva un carico
randomize;
temp = GetRandom(1,5);
if ( (carico+temp) <= max_T2)
{
carico = carico + temp;
}
else
{
finito = 1;
}
}
//entro nella critical section <-------------------------------------------------------------------------
EnterCriticalSection(&stampa);
printf("il traghetto T2 ha caricato %d\n",carico);
//esco dalla critical section <-------------------------------------------------------------------------
LeaveCriticalSection(&stampa);
ReleaseMutex(H_Mutex_A);
//entro nella critical section <-------------------------------------------------------------------------
EnterCriticalSection(&stampa);
printf("il traghetto T2 e' partito dal porto dell'isola A\n");
//esco dalla critical section <-------------------------------------------------------------------------
LeaveCriticalSection(&stampa);
Sleep(T);
porto[1] = 0;
}
}
}