Autolavaggio
In un lavaggio auto molto frequentato vi sono tre postazioni per il lavaggio automatico. Il tempo di lavaggio per le tre posatazioni è diverso l’uno dall’altro precisamente di t, 2t, ciascuno e solo il primo può essere utilizzato da vetture di grossa dimenzione come camion, monovolume ect.
La vita delle vetture è la seguente.
1) Si assegni in maniera random la tipologia delle vetture.
2) Esse in funzione della propria tipologia (1 normali, 2 grandi) aspettano che una delle tre o che la prima postazione si liberi
3) Si lavano per un tempo dipendente dalla posatazoione
5) Escono dalla postazione
a) Sviluppare in linguaggio C un programma che simuli la situazione descritta commentando le scelte fatte.
b) Descrivere una possibile situazione gestita da un Sistema Operativo che si avvicini alla situazione descritta.
//----------------------------------------------------------------------------------------------------------------
// Importo le librerie necessarie...
//----------------------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <process.h>
#include <conio.h>
#include <time.h>
//----------------------------------------------------------------------------------------------------------------
// Definisco le variabili globali e le costanti...
//----------------------------------------------------------------------------------------------------------------
#define __Lavaggi 3
#define t 2000
HANDLE H_Mutex_Lavaggi[__Lavaggi];
//----------------------------------------------------------------------------------------------------------------
// Definisco le procedure e le funzioni del listato...
//----------------------------------------------------------------------------------------------------------------
#define randomize srand((unsigned)time(NULL))
#define GetRandom(min,max) (rand()%((int)(max)-(min)+1)+(min))
HANDLE finito(LPDWORD lpdwParam);
void car(int *count);
//----------------------------------------------------------------------------------------------------------------
// Procedura MAIN...
//----------------------------------------------------------------------------------------------------------------
void main()
{
int fine = 0;
int count = 0;
//Creo un mutex per ogni lavaggio
for(int i=0;i<__Lavaggi;i++)
H_Mutex_Lavaggi[i] = CreateMutex(NULL,false,NULL);
//Creo il thread per gestire la fine del programma,e ne controllo la validità
if (CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) finito,(LPVOID) &fine,0,NULL) == NULL)
printf("ERRORE CREAZIONE THREAD!!!");
else
{
while (fine == 0)
{
Sleep(GetRandom(1,3000));
count++;
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) car,(LPVOID) &count,0,NULL);
}
}
}
//----------------------------------------------------------------------------------------------------------------
// Procedura che determina la fine del programma...
//----------------------------------------------------------------------------------------------------------------
HANDLE finito(LPDWORD lpdwParam)
{
int *fine;
fine=(int*)lpdwParam;
getch();
*fine=1;
return 0;
}
//----------------------------------------------------------------------------------------------------------------
// Procedura che gestisce le macchine...
//----------------------------------------------------------------------------------------------------------------
void car(int *count)
{
int car_type,car_num;
DWORD out,free_place;
randomize;
car_type = GetRandom(1,2);
car_num = *count;
if (car_type == 1)
{
printf("-----> E'' in arrivo la Macchina grande num%i <-----\n",car_num);
printf(" La macchina grande num%i controlla se il Lavaggio1 e'' libero,altrimenti attende...\n",car_num);
WaitForSingleObject(H_Mutex_Lavaggi[0],INFINITE);
printf("La macchina grande num%i occupa il Lavaggio1 e comincia lo sgrasciamento...\n",car_num);
Sleep(t);
printf("La macchina grande num%i ha finito lo sgrasciamento,libera il Lavaggio1...\n",car_num);
printf("***** Il lavaggio1 e'' ora Libero!! *****\n");
ReleaseMutex(H_Mutex_Lavaggi[0]);
}
else
{
printf("-----> E'' in arrivo la Macchina piccola num%i <-----\n",car_num);
printf(" La macchina piccola num%i controlla se c'e'' un lavaggio libero,altrimenti attende...\n",car_num);
out = WaitForMultipleObjects(__Lavaggi,H_Mutex_Lavaggi,false,INFINITE);
free_place = out-WAIT_OBJECT_0+1;
printf("La macchina piccola num%i occupa il Lavaggio%i e comincia lo sgrasciamento...\n",car_num,free_place);
Sleep(free_place * t);
printf("La macchina piccola num%i ha finito lo sgrasciamento,libera il Lavaggio%i...\n",car_num,free_place);
printf("***** Il lavaggio%i e'' ora Libero!! *****\n",free_place);
ReleaseMutex(H_Mutex_Lavaggi[free_place-1]);
}
}
Torna a Lab Sistemi Operativi
Non ci sono commenti in questa pagina. [Scrivi commento]