Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ALGORITHME D'ORDONANCEMENT


Information sur la source

Description

l'algorithme nous fait montrer une simulation de la mémoire virtuelle ;comment est l'ordonnancement des pages en mémoire selon les politiques fifo,lru et fifo seconde chance
 

Source

  • #include<stdio.h>
  • //*****************************************************
  • //structure de donnée sur l'etat de la memoire
  • #define NUMBER_FRAMES 10;
  • struct memorystatetype {
  • char state; //libre 1 alloue 0
  • int page; //numero de page logique si alloue
  • };
  • struct memorystatetype memorystate[10];
  • //*****************************************************
  • //structure de donnée sur la table de page
  • #define NUMBER_PAGES 20;
  • struct pagetabletype {
  • int frame; //numero page physique
  • char in; //bit de validité 1:in 0:out
  • char reference; //bit de reference
  • //int loadtime;
  • long loadtime; //temps de chargement
  • //int lastreferencetime;
  • long lastreferencetime;//temps derniers reference
  • char dirty; //bit de modification
  • };
  • struct pagetabletype pagetable[20];
  • //*****************************************************
  • //STRUCTURES DE DONNÉES SUR LA CHAINE DE REFERENCE
  • #define max_references 30;
  • struct referencestringtype {
  • int page; //la page referencee
  • char accessmode; // lecture 0 ecriture 1
  • };
  • struct referencestringtype referencestring[30];
  • //*****************************************************
  • //initialisation
  • //initialiser la memoire
  • void initmem(int m)
  • {int i;
  • for(i=1;i<=m;i++)
  • {
  • memorystate[i].page=-1;
  • memorystate[i].state=0;
  • }
  • }
  • //*****************************************************
  • //initialiser la table des pages TCP
  • void initTCP(int k)
  • {
  • int i;
  • for (i=1;i<=k;i++)
  • {
  • pagetable[i].frame=-1;
  • pagetable[i].in=0;
  • pagetable[i].reference=0;
  • pagetable[i].loadtime=0;
  • pagetable[i].lastreferencetime=0;
  • pagetable[i].dirty=0;
  • }
  • }
  • //*****************************************************
  • //procedure de l'affichage de l'etat de la memoire
  • void memorystatedraw(int test, int m, int ref)
  • {
  • int i;
  • //switch (test)
  • { if (test==-1) { //printf("| ");
  • printf("%d",ref);
  • printf(" ");
  • printf(" référence incorrecte \n");
  • }
  • if (test==0) { //printf("Page référencée n° ");
  • printf(" ");
  • printf("%d", ref);
  • printf(" ");
  • for (i=1; i<=m; i++)
  • {
  • if (memorystate[i].page==-1)
  • printf(" ");
  • else
  • printf("%d", memorystate[i].page);
  • printf(" ");
  • }
  • printf(" succes \n");
  • }
  • if (test==1) { //printf("Page référencée n° ");
  • printf(" ");
  • printf("%d",ref);
  • //printf(" Etat de la mémoire | ");
  • printf(" ");
  • for (i=1; i<=m; i++)
  • {
  • if (memorystate[i].page==-1)
  • printf(" ");
  • else
  • printf("%d", memorystate[i].page);
  • printf(" ");
  • }
  • printf(" echec \n");
  • }
  • }
  • }
  • //*****************************************************
  • //intialisee la chaine de reference
  • void initrefstring(int n)
  • {int i;
  • //intialisee la chaine de reference
  • for (i=1;i<=n;i++)
  • {
  • referencestring[i].page=-1;
  • }
  • }
  • //*****************************************************
  • //fonction de choix de l'algoithme de remplacement
  • int choixalgo(int choix)
  • {
  • printf("\n\n \n");
  • printf(" Algorithmes de remplacement\n");
  • printf(" \n\n");
  • printf(" Pour F I F O Tapez 1\n");
  • printf(" Pour L R U Tapez 2\n");
  • printf(" Pour F I F O 2ieme chance Tapez 3\n");
  • printf(" \n");
  • printf(" Donner votre choix : ");
  • choix: scanf("%d",&choix);
  • return (choix);
  • }
  • //*****************************main*********************//
  • int main()
  • {
  • int n,m,k,i,x,choix,e,p,frame,victime,pl;
  • char rep,rep2;
  • int test,j;
  • //******************************************************
  • printf("\n **********************************************************\n");
  • printf(" ******Simulation de la memoire virtuelle******************\n");
  • printf(" **********************************************************\n\n");
  • rep='p';
  • rep2='p';
  • e=0;
  • n=0;
  • printf("donnez le nombre de cadre de page : ");
  • scanf("%d",&m);
  • initmem(m);
  • printf("donnez le nombre de page logique : ");
  • scanf("%d",&k);
  • initTCP(k);
  • printf("donnez le nombre de reference : ");
  • scanf("%d",&n);
  • printf("entrez votre chaine de reference \n");
  • for (i=1; i<=n;i++)
  • {
  • printf("N° de page : ");
  • scanf("%d",&referencestring[i].page);
  • }
  • //*****************************************************
  • choix=choixalgo(choix);
  • //*****************************************************
  • // affichage
  • printf("\n\n\n\n \n");
  • printf(" Page référencée n° : ");
  • printf(" Etat de la mémoire: ");
  • printf(" resultat : \n");
  • printf(" \n");
  • //*****************************************************
  • //parcourir les m peremiere reference
  • //on aura surement m echec au depart
  • e=0;
  • for (x=1; x<=m; x++)
  • { e=e+1;
  • pl=referencestring[x].page;
  • memorystate[x].page= pl;
  • pagetable[pl].frame= x;
  • pagetable[pl].in=1;
  • pagetable[pl].loadtime=x; //time();
  • pagetable[pl].lastreferencetime=x;
  • if (referencestring[x].accessmode==1)
  • pagetable[pl].dirty=1; //bit de modification
  • else
  • pagetable[pl].dirty=0;
  • memorystatedraw(1,m,referencestring[x].page);
  • }
  • //*****************************************************
  • //parcourir la chaine de reference apres les m 1ere references
  • for (i=m+1; i<=n; i++)
  • { test=-1;
  • for (x=1; x<=k; x++)
  • { if (x==referencestring[i].page)
  • {
  • if (pagetable[x].in==1) test=0;
  • else test=1;
  • }
  • }
  • //switch (test)
  • //{ // reference incorrecte
  • if (test==-1)
  • //*******************************************************
  • //reference incorrecte
  • {
  • memorystatedraw(-1,m,referencestring[i].page);
  • }
  • //*******************************************************
  • // cas de succes
  • if (test==0)
  • {
  • p = referencestring[i].page;
  • pagetable[p].lastreferencetime=i; //time();
  • pagetable[p].reference=1;
  • memorystatedraw(0,m,referencestring[i].page);
  • }
  • if (test==1)
  • //****************************************************
  • { // defaut de page
  • //case 1: {
  • p = referencestring[i].page;
  • pagetable[p].lastreferencetime=i; //time();
  • pagetable[p].reference=1;
  • e=e+1;
  • //*******************************************************
  • //choix du l'algorithme de remplacement
  • //switch (choix)
  • // algo fifo
  • if (choix==1)
  • {
  • //victime=replaceFIFO(k,frame);
  • //printf("%d",victime);
  • victime=memorystate[1].page;
  • frame=pagetable[victime].frame;
  • //chercher celle qui a le temps de chargement + ancien
  • for (j=1; j<=k; j++)
  • {
  • if(pagetable[j].in==1)
  • if (pagetable[j].loadtime < pagetable[victime].loadtime)
  • {
  • victime=j;
  • frame=pagetable[j].frame;
  • }
  • }
  • }
  • //**************************************************************
  • //case 2:{ //replaceLRU;
  • if (choix==2)
  • {
  • victime=memorystate[1].page;
  • frame=pagetable[victime].frame;
  • //chercher celle qui a le temps de reference le + ancien
  • //ça veut dire la moins recement utilisée
  • for (j=1; j<=k; j++)
  • {
  • if(pagetable[j].in==1)
  • if (pagetable[j].lastreferencetime < pagetable[victime].lastreferencetime)
  • {
  • victime=j;
  • frame=pagetable[j].frame;
  • }
  • }
  • }// fin case 2
  • //************************************************************
  • //algo 2 ieme chance
  • //case 3: victime=replaceclock(k,frame);
  • if (choix==3)
  • {
  • // memorystatedraw(0,m,referencestring[i].page);
  • victime =-1;
  • while (victime==-1)
  • //chercher celle qui a le temps de chargement + ancien
  • {
  • for (j=1; j<=k; j++)
  • {
  • printf("\npage:");
  • printf("%d",j);
  • printf("\nframe:");
  • printf("%d",pagetable[j].frame);
  • printf("\nin:");
  • printf("%d",pagetable[j].in);
  • printf("\ncharge:");
  • printf("%d",pagetable[j].loadtime);
  • printf("\nref :");
  • printf("%d",pagetable[victime].reference);
  • if(pagetable[j].in==1)
  • if ((victime==-1) || (pagetable[i].loadtime < pagetable[victime].loadtime))
  • {
  • victime=j;
  • frame=pagetable[j].frame;
  • }
  • //si cette page est référencée on lui donne une 2eme chance
  • if (pagetable[victime].reference==1)
  • {
  • printf("victime");
  • printf("\n%d",victime);
  • pagetable[victime].loadtime=i-1; //time();
  • printf("\niiii ");
  • printf("%d",i);
  • pagetable[victime].reference=0;
  • victime=-1;
  • }
  • }
  • } }
  • //********************************************************
  • //mettre a jour le TCP
  • frame = pagetable[victime].frame;
  • pl=referencestring[i].page;
  • memorystate[frame].page= pl;
  • pagetable[pl].frame = frame;
  • pagetable[pl].in=1;
  • pagetable[pl].loadtime=i;
  • if (referencestring[i].accessmode==1)
  • pagetable[pl].dirty=1; //bit de modification
  • else
  • { pagetable[pl].dirty=0;
  • pagetable[victime].in=0;
  • }
  • printf("\n");
  • memorystatedraw(1,m,referencestring[i].page);
  • printf("\nvictime ");
  • printf("%d",victime);
  • printf("\nframe ");
  • printf("%d",frame);
  • }
  • test=-1;
  • printf(" \n");
  • //*****************************************************
  • printf("le nombre de defaut de page est : %d\n",e);
  • }}
#include<stdio.h>
//*****************************************************
//structure de donnée sur l'etat de la memoire
#define NUMBER_FRAMES 10;
struct memorystatetype {
	char state; 	//libre 1 alloue 0
	int page; 	//numero de page logique si alloue

};
struct memorystatetype memorystate[10];
//*****************************************************
//structure de donnée sur la table de page
#define NUMBER_PAGES 20;
struct pagetabletype {
	int frame; 	//numero page physique
	char in;	//bit de validité 1:in 0:out
	char reference;	//bit de reference
	//int loadtime;
	long loadtime;	//temps de chargement
	//int lastreferencetime;
	long lastreferencetime;//temps derniers reference
	char dirty;	//bit de modification
	};

struct pagetabletype pagetable[20];
//*****************************************************
//STRUCTURES DE DONNÉES SUR LA CHAINE DE REFERENCE
#define max_references 30;
struct referencestringtype {
	int page;	//la page referencee
	char accessmode;   // lecture 0 ecriture 1
	};

struct referencestringtype referencestring[30];

 //*****************************************************
//initialisation
//initialiser la memoire
void initmem(int m)
{int i;
for(i=1;i<=m;i++)
{
	memorystate[i].page=-1;
	memorystate[i].state=0;
}
}
//*****************************************************
 //initialiser la table des pages TCP
void initTCP(int k)
{
int i;
for (i=1;i<=k;i++)
{
	pagetable[i].frame=-1;
	pagetable[i].in=0;
	pagetable[i].reference=0;
	pagetable[i].loadtime=0;
	pagetable[i].lastreferencetime=0;
	pagetable[i].dirty=0;
}
}


//*****************************************************
//procedure de l'affichage de l'etat de la memoire
void memorystatedraw(int test, int m, int ref)
{
	int i;
	//switch (test)
	{ 	if (test==-1) {	//printf("|        ");
				printf("%d",ref);
					  printf("                             ");
				printf("               référence incorrecte    \n");
				  }
		if (test==0)  {	//printf("Page référencée n° ");
				printf("        ");
				printf("%d", ref);

			  printf("                      ");
				for (i=1; i<=m; i++)
				{
					if (memorystate[i].page==-1)
						printf(" ");
					else
						printf("%d", memorystate[i].page);
					printf("     ");
				}
				printf("        succes             \n");
				 }
		if (test==1) {	//printf("Page référencée n° ");
					  printf("        ");
				printf("%d",ref);
						//printf("      Etat de la mémoire    | ");
			  printf("                    ");
						for (i=1; i<=m; i++)
						{
					if (memorystate[i].page==-1)
											printf(" ");
										else
						printf("%d", memorystate[i].page);
							printf("     ");
						}
					printf("     echec                   \n");
						}
	}
}

//*****************************************************
//intialisee la chaine de reference
void initrefstring(int n)
{int i;
//intialisee la chaine de reference
for (i=1;i<=n;i++)
{
	referencestring[i].page=-1;
}
}


 //*****************************************************
//fonction de choix de l'algoithme de remplacement
int choixalgo(int choix)
{
	printf("\n\n                                                        \n");
	printf("         Algorithmes  de  remplacement\n");
	printf("                                                          \n\n");
	printf("         Pour    F I F O                 Tapez   1\n");
	printf("         Pour    L R U                   Tapez   2\n");
	printf("         Pour    F I F O  2ieme chance    Tapez   3\n");
	printf("                                                  \n");
	printf("         Donner votre choix : ");
choix:	scanf("%d",&choix);
return (choix);
}

 //*****************************main*********************//

int main()
{
int n,m,k,i,x,choix,e,p,frame,victime,pl;
char rep,rep2;
int test,j;
 //******************************************************
printf("\n  **********************************************************\n");
printf("  ******Simulation de la memoire virtuelle******************\n");
printf("  **********************************************************\n\n");
rep='p';
rep2='p';
e=0;
n=0;

printf("donnez le nombre de cadre de page : ");
scanf("%d",&m);
initmem(m);

printf("donnez le nombre de page logique : ");
scanf("%d",&k);
initTCP(k);

		printf("donnez le nombre de reference : ");
			scanf("%d",&n);

				printf("entrez votre chaine de reference \n");
			for (i=1; i<=n;i++)
			{
			printf("N° de page : ");
			scanf("%d",&referencestring[i].page);


	}
//*****************************************************
	choix=choixalgo(choix);

//*****************************************************
// affichage
	printf("\n\n\n\n                                                    \n");
	printf("  Page référencée n° : ");
	printf("     Etat de la mémoire:    ");
	printf("   resultat :              \n");
	printf("                                                            \n");

//*****************************************************
	//parcourir les m peremiere reference
	//on aura surement m echec au depart

	e=0;
	for (x=1; x<=m; x++)
	{	e=e+1;
	pl=referencestring[x].page;
	memorystate[x].page= pl;
	pagetable[pl].frame= x;
	pagetable[pl].in=1;
	pagetable[pl].loadtime=x;   //time();
	pagetable[pl].lastreferencetime=x;
	if (referencestring[x].accessmode==1)
	pagetable[pl].dirty=1; //bit de modification
	else
	pagetable[pl].dirty=0;
	memorystatedraw(1,m,referencestring[x].page);
	}
//*****************************************************
	//parcourir la chaine de reference apres les m 1ere references
	for (i=m+1; i<=n; i++)
	{	test=-1;
	for (x=1; x<=k; x++)
	{  if (x==referencestring[i].page)
		{
		if (pagetable[x].in==1) test=0;
			else  test=1;
			}
	}
	//switch (test)
	//{	// reference incorrecte
		if (test==-1)
//*******************************************************
		//reference incorrecte
			{
			memorystatedraw(-1,m,referencestring[i].page);
			}
 //*******************************************************
		// cas de succes
		if (test==0)
			{
			p = referencestring[i].page;
			pagetable[p].lastreferencetime=i;   //time();
			pagetable[p].reference=1;
			memorystatedraw(0,m,referencestring[i].page);
			}

	if (test==1)
//****************************************************
	{	// defaut de page
		//case 1:	{
			p = referencestring[i].page;
						pagetable[p].lastreferencetime=i; //time();
								pagetable[p].reference=1;
			e=e+1;
//*******************************************************
//choix du l'algorithme de remplacement
			//switch (choix)
			// algo fifo
			if (choix==1)
					{
					//victime=replaceFIFO(k,frame);
					//printf("%d",victime);
					victime=memorystate[1].page;
					frame=pagetable[victime].frame;
					//chercher celle qui a le temps de chargement + ancien
					for (j=1; j<=k; j++)
					{
					if(pagetable[j].in==1)
					if (pagetable[j].loadtime < pagetable[victime].loadtime)
						{
						victime=j;
						frame=pagetable[j].frame;
						}
					}
				}
//**************************************************************
				//case 2:{  //replaceLRU;
			if (choix==2)
					{
					victime=memorystate[1].page;
													 frame=pagetable[victime].frame;
					//chercher celle qui a le temps de reference le + ancien
					//ça veut dire la moins recement utilisée
					for (j=1; j<=k; j++)
					{
					if(pagetable[j].in==1)
					if (pagetable[j].lastreferencetime < pagetable[victime].lastreferencetime)
						{
						victime=j;
						frame=pagetable[j].frame;
									}
								}
					}// fin case 2
 //************************************************************
	//algo 2 ieme chance
						  //case 3:  victime=replaceclock(k,frame);
			if (choix==3)
			{
		//	memorystatedraw(0,m,referencestring[i].page);
				victime =-1;
				while (victime==-1)
				//chercher celle qui a le temps de chargement + ancien
					{
				for (j=1; j<=k; j++)
						{
					printf("\npage:");
					printf("%d",j);
					printf("\nframe:");
													printf("%d",pagetable[j].frame);
					printf("\nin:");
													 printf("%d",pagetable[j].in);
					printf("\ncharge:");
					printf("%d",pagetable[j].loadtime);
					printf("\nref :");
					printf("%d",pagetable[victime].reference);

					if(pagetable[j].in==1)
					if ((victime==-1) || (pagetable[i].loadtime < pagetable[victime].loadtime))
									{
							victime=j;
									frame=pagetable[j].frame;
							}

						//si cette page est référencée on lui donne une 2eme chance
					if (pagetable[victime].reference==1)
							{
						printf("victime");
						printf("\n%d",victime);
						pagetable[victime].loadtime=i-1;   //time();
						printf("\niiii ");
						printf("%d",i);
							pagetable[victime].reference=0;
								victime=-1;

						}
					}

			} }

	//********************************************************
	//mettre a jour le TCP
				frame = pagetable[victime].frame;
				pl=referencestring[i].page;
					memorystate[frame].page= pl;
					pagetable[pl].frame = frame;
					pagetable[pl].in=1;
					pagetable[pl].loadtime=i;
					if (referencestring[i].accessmode==1)
					pagetable[pl].dirty=1; //bit de modification
				else
					{	pagetable[pl].dirty=0;
							pagetable[victime].in=0;
				}
				printf("\n");
				memorystatedraw(1,m,referencestring[i].page);
				printf("\nvictime ");
			printf("%d",victime);
			printf("\nframe ");
			printf("%d",frame);


				}

	test=-1;
	printf("                                                                 \n");
   //*****************************************************
	printf("le nombre de defaut de page est : %d\n",e);


}}

Commentaires et avis

signaler à un administrateur
Commentaire de xkamen le 04/07/2007 12:07:42

Source intéressante, mais est ce que tu as implémenté ces mêmes algorithmes de façon à avoir de meilleures performances ?

Et as-tu prévu d'implémenter d'autres algorithmes d'ordonnancement tels que le LFU, NRU, Clock, ARC, LIRS, CAR ?

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.