#include #include #include #include #include "Liste.h" int NMax; float lambda0; //lambda0 on aura lambda (Paramètre de la loi exponentielle) = file*lambda0 float *dateLibre; //Dates auxquelles les serveurs sont libres int serveur; //numéro du serveur dans lequel se trouve le processus int serveurSuivant; //numéro du prochain serveur sur la route int compteur; //nombre de processus générés Liste* pile; //Liste contenant tous les processus int experience; //Numéro de l'expérience float *fin_on; //date de fin de la prochaine période On float *duree_off; //Durée de la période Off float *perteFile; //Nombre de pertes sur une file float *perteRoute; //Nombre de pertes sur une route int topologie; //Topologie du réseau //Pour les statistiques int *totalSorties; //Nombre de sorties extérieures par routes float *totalIntervalles; //Somme des intervalles de sorties pour une route donnée float *derniereSortie; //date de dernière sortie d'un processus int *totalEntrees; //Nombre d'entrees extérieures par routes float *totalIntervallesEntrees;//Somme des intervalles d'entree pour une route donnée float *derniereEntree; //date de dernière sortie d'un processus float *totalTempsReponse; //Somme des temps de présence dans une file int *totalEntreesReelles; //Nombre de toutes les entrées confondues int *totalSortiesReelles; //Nombre de toutes les sorties confondues float *totalTempsReponseRoute; //Somme des temps de réponse pour chaque route. //En fonction de la TTL d'un processus, on peut déterminer sur quelle route il se trouve. float ***nbClients; //Variation du Nombre de clients (avec date) présents dans chaque file int *indice; //Conserve les indices de parcours de chaque tableau nbClients int *calculClients; //Nombre de clients dans la file à un instant donné int *maxiClients; //Nombre maxi de clients dans chaque file int *repSup10; //Nombre de temps de réponse supérieurs à 10ms int *repSup20; //...20ms int *repSup50; //...50ms bool encours; float *dateEntree; //Sauvegarde la dernière date d'entrée //Fonction de sauvegarde d'un tableau dans fichier void toFic(char* fichier,float** tab, int numFile){ FILE* desc; desc=fopen(fichier,"w+"); for(int i=0; ij)?i:j); } //Nettoyage des fichiers superflus void nettoyage(){ system("rm *.o"); system("rm commandes"); system("rm Sommet*"); } //nb aleatoire entre 0 et 1 float uniforme() { return random()/(double)RAND_MAX; } //Distribution exponentielle float exponentielle(float l){ return(-log(random()/(double)RAND_MAX)/l); } //Génère le temps de service en fonction des expériences float tempService(){ switch(experience){ case 1: case 2:{ //Le paramètre de exponentielle est le débit. Pour un intervalle de temps moyen de 0.001s //le débit lambda0 est de 1000 s-1 return (exponentielle(1000)); break; } case 3: case 4:{ return (0.001); break; } } } //Calcul des dates de fin de chaque période On et Off //La première période commence à 0. void onOff(int file){ /*Date de fin de la période On en cours = derniere date de fin + durée de la période Off + durée de la période On en cours)*/ fin_on[file]+=duree_off[file]+0.02; duree_off[file]=exponentielle((file*lambda0)/(20-lambda0*file*0.02));//Durée de la prochaine période Off } //Génère la prochaine arrivée en fonction de l'expérience float genereSuivant(float date, int file){ file++; //La file i commence sur le somment i-1 switch(experience){ case 1:{ //pour le débit de chaque file, on fixe le paramètre de exponentielle à lambda0*file return (date + exponentielle(lambda0*file)); break; } case 2: case 3: case 4:{ float tmp; tmp = date + 0.001; while(tmp>fin_on[file]) { tmp+=duree_off[file]; //Ajout de la durée de la période Off onOff(file); //Nouvelle date On et Off } return (tmp); break; } } } //Fonction d'affichage void afficherStatistiques(){ float tpsService = 0.001; cout<<"Données"<50ms \t"<<100*repSup50[i]/totalSortiesReelles[i]<<" %"<20ms \t"<<100*repSup20[i]/totalSortiesReelles[i]<<" %"<10ms \t"<<100*repSup10[i]/totalSortiesReelles[i]<<" %"<=0)?tmp:6+tmp); } //Renvoie le serveur suivant de manière aléatoire int nextServeur(int s){ if(topologie==1) return((s==5)?0:s+1); else{ int temp=s; while((s==temp)||(temp==6)){ temp = (int)(6*(random()/(double)RAND_MAX)); } return(temp); } } //Fonction principale int main(int argc, char** argv){ init(argc, argv); //Création de l'arrivee des premiers processus pour chaque file pile = new Liste(); Cell* tempo=new Cell(-1, 'A', 0.001, 3, -1); pile->insere(tempo); compteur = 6; for(int i=0; i<6; i++) { totalEntrees[i]=1; derniereEntree[i] = 0.001; tempo=new Cell(i, 'A', 0.001, -1, i); pile->insere(tempo); onOff(i); } Cell* test=pile->premier(); //Parcours de la liste jusqu'à peut plus while(test!=pile->dernier()) { pile->enleve(test); serveur = test->getNumFile(); serveurSuivant = nextServeur(serveur); switch(test->getType()){ case 'A':{ //Statistique (Nombre total de toutes les entrées) totalEntreesReelles[serveur]++; //*** Prochaine arrivée sur ce serveur *** float suivant; if ((test->getTTL()==-1)&&(compteurgetDate(), serveur); dateEntree[serveur] = suivant; int ttl = ((topologie==1)?3:-1); Cell* prochain = new Cell(compteur, 'A', suivant, ttl, serveur); pile->insere(prochain); compteur ++; //Statistiques totalEntrees[serveur]++; totalIntervallesEntrees[serveur] += (suivant - derniereEntree[serveur]); derniereEntree[serveur] = suivant; } //*** Fin Prochaine arrivée sur ce serveur *** //On limite la capacité de la file à 100 if ((experience==4)&&(calculClients[serveur]>100)){ perteFile[serveur]++; perteRoute[quelleRoute(serveur, test->getTTL())]++; } else{ //*** Calcul Fin du traitement de ce processus *** dateLibre[serveur]=max(dateLibre[serveur], test->getDate())+tempService();//Calcul de la date libre apres le traitement du processus Cell* fin=new Cell(test->getNumProc(), 'F', dateLibre[serveur], test->getTTL(), serveur); pile->insere(fin); //*** Fin Calcul Fin du traitement de ce processus *** //Statistique (temps de réponse) totalTempsReponse[serveur]+=(dateLibre[serveur]-test->getDate()); totalTempsReponseRoute[quelleRoute(serveur,test->getTTL())]+=(dateLibre[serveur]-test->getDate()); //*** Fin Calcul Fin du traitement de ce processus *** //Statistique (probabilité du temps de réponse) if(dateLibre[serveur]-test->getDate()>0.05) repSup50[serveur]++; if(dateLibre[serveur]-test->getDate()>0.02) repSup20[serveur]++; if(dateLibre[serveur]-test->getDate()>0.01) repSup10[serveur]++; //Statistique (nombre de clients dans la file) calculClients[serveur]++; nbClients[serveur][indice[serveur]][0]=test->getDate(); nbClients[serveur][indice[serveur]][1]=calculClients[serveur]; if(calculClients[serveur]>maxiClients[serveur]) maxiClients[serveur]=calculClients[serveur]; //Sauvegarde du maxi de clients simultanés dans la file indice[serveur]++; } break; } case 'F':{ //Nombre total de toutes les sorties totalSortiesReelles[serveur]++; //Statistiques calculClients[serveur]--; nbClients[serveur][indice[serveur]][0]=test->getDate(); nbClients[serveur][indice[serveur]][1]=calculClients[serveur]; indice[serveur]++; //*** Transfert du processus sur serveur suivant *** if ((topologie==1)&&(test->getTTL()>1)){ Cell* prochain = new Cell(test->getNumProc(), 'A', test->getDate(), test->getTTL()-1, serveurSuivant); pile->insere(prochain); } if (topologie==2){ if (test->getTTL()==-1){ Cell* prochain = new Cell(test->getNumProc(), 'A', test->getDate(), serveur, serveurSuivant); pile->insere(prochain); } else if(test->getTTL()>-1){ Cell* prochain = new Cell(test->getNumProc(), 'A', test->getDate(), -2, test->getTTL()); pile->insere(prochain); } } //*** Fin Transfert du processus sur serveur suivant *** //Gestion des statistiques if (test->getTTL()==-2){ totalSorties[serveur]++; totalIntervalles[serveur] += test->getDate() - derniereSortie[serveur]; derniereSortie[serveur] = test->getDate(); } break; } } test=pile->premier(); } //tracerCourbes(); afficherStatistiques(); //nettoyage(); }