Vous êtes sur la page 1sur 10

Temani Afif II2H

02/21/2012

Mthode dallocation par subdivision (Buddy System)

Introduction

La technique d'allocation de mmoire par subdivision est un algorithme qui divise la mmoire en partitions pour tenter de satisfaire une demande de mmoire de la faon la plus approprie que possible. Ce systme permet l'utilisation de la mmoire divise en deux moitis pour essayer de donner un meilleur ajustement. Selon Donald Knuth, le systme de jumelage a t invent en 1963 par Harry Markowitz, qui a remport le prix Nobel 1990 en conomie, et a d'abord t dcrit par Kenneth C. Knowlton. L'allocation de mmoire Buddy System est relativement facile mettre en uvre. Comme le montre la figure ci-dessous, la mmoire initiale de 1024 Ko constitue un seul bloc libre. Pour placer le programme A, le bloc de 1024 Ko est subdivis en 1 bloc de 512 Ko, 1 bloc de 256 Ko, 1 bloc de 128 Ko, le dernier bloc de 128 Ko tant affect au programme A. Le programme B ncessite un espace de 64 Ko qui n'existe pas. On choisit donc de partitionner un bloc de 128 Ko en deux blocs de 64 Ko, l'un tant affect au programme B, l'autre tant libre. Le placement du programme C ncessite un bloc de 128 Ko obtenu en partitionnant un bloc de 256 Ko. La fin des programmes A puis B libre un bloc de 128 Ko, puis un autre de 64 Ko dont le "compagnon" est libre. Ils sont donc fusionns en un bloc de 128 Ko dont le compagnon est lui aussi libre. Leur runion conduit un bloc de 256 Ko.

Temani Afif II2H

02/21/2012

Le simulateur
Objectif : Ce programme simule lallocation/libration de la mmoire selon la

mthode de subdivision dcrite ci-dessus. Le simulateur affiche le contenu de la mmoire centrale aprs chaque opration demande. Il nous donne une information sur le pourcentage doccupation de chaque partition ainsi que la taille des fragments internes.
Rq : ce programme effectue toutes les allocations ensuite les librations. Il peut tre amlior en ajoutant un menu interactif offrant la possibilit de choisir entre une allocation ou une libration chaque demande.

Structure de donnes : Pour lenregistrement des donnes de la mmoire jai opt pour

une structure darbre binaire ou chaque feuille reprsente un bloc mmoire (libre ou occup) et les blocs de mme taille auront la mme hauteur dans larbre.

Exemple dexcution : Voici un exemple dexcution du simulateur avec les processus suivant : Processus 1 avec une taille de 80 Processus 2 avec une taille de 40 Processus 3 avec une taille de 256 Processus 4 avec une taille de 128

Temani Afif II2H

02/21/2012

Temani Afif II2H

02/21/2012

Temani Afif II2H

02/21/2012

Cest une excution sous Windows, mais le simulateur marche aussi sous Unix.

Les fonctions du simulateur : le programme contient principalement 3 fonctions qui

sont rcursives. Une premire fonction pour lallocation de la mmoire et la cration de nouvelles partitions (elle fera appel une fonction initialisation pour crer les feuilles de larbre). Une deuxime fonction pour la libration de lespace allou un processus donn. Une troisime fonction pour laffichage de ltat de la mmoire.
Jai utilis 2 autres fonctions pour linteraction avec lutilisateur, qui peuvent bien sr tre amliores pour plus dinteractivit.

C:\Users\Afif\Desktop\BuddySystem.c

dimanche 2 dcembre 2012 18:16

/* Temani Afif 02/12/2012 Ce programme simule la mthode d'allocation mmoire par subdivision (Buddy System) */ #include<stdio.h> #include<stdlib.h> /* dclaration de la structure de la mmoire : arbre binaire */ enum etat{Rouge,Jaune,Vert}; struct memoire { int taille; int taille_occupee; enum etat e; int pid; struct memoire *filsg; struct memoire *filsd; };

typedef struct memoire * Mem;

//dclaration des variables globales Mem L; //la mmoire int a; // la taille de la mmoire int nb_proc; //le nombre de processus

//fonction pour initialiser la mmoire et construire les noeuds de l'arbre (les partition de la mmoire) void initialisation(int taille, Mem *L) { (*L)=(Mem)malloc(sizeof(struct memoire)); (**L).taille=taille; (**L).e=Vert; (**L).pid=0; (**L).filsd=(**L).filsg=NULL; (**L).taille_occupee=0; }

//allocation de la mmoire un processus "pid" de taille "taille" // rcursive


-1-

C:\Users\Afif\Desktop\BuddySystem.c

dimanche 2 dcembre 2012 18:16

int allouer(int taille,int pid,Mem L) { if((*L).taille<taille) { return -1; } if((*L).e==Vert) { if(((*L).taille)/2<taille) { (*L).taille_occupee=taille; (*L).e=Rouge; (*L).pid=pid; //printf("%d : \tla partition a ete allouee au processus de pid=%d\n\n",(*L).taille,pid); return 1; } else { //printf("%d : \tla partition est divisee en 2 de meme taille=%d\n\n",(*L).taille,(*L).taille/2); initialisation((*L).taille/2,&((*L).filsg)); initialisation((*L).taille/2,&((*L).filsd)); (*L).e=Jaune; return allouer(taille,pid,(*L).filsg); } } if((*L).e==Jaune) { if( ((*((*L).filsg)).e!=Rouge) && ((*((*L).filsd)).e==Rouge) ) return allouer(taille,pid,(*L).filsg); if( ((*((*L).filsd)).e!=Rouge) && ((*((*L).filsg)).e==Rouge) ) return allouer(taille,pid,(*L).filsd); if( ((*((*L).filsg)).e==Jaune) && ((*((*L).filsd)).e!=Rouge) ) if(allouer(taille,pid,(*L).filsg)!=1) return allouer(taille,pid,(*L).filsd); else return 1; if( ((*((*L).filsg)).e==Vert) && ((*((*L).filsd)).e==Jaune) ) if(allouer(taille,pid,(*L).filsd)!=1) return allouer(taille,pid,(*L).filsg); else return 1; } } //liberation de la mmoire dtenue par le processus "pid" // rcursive int liberer(int pid,Mem L) { if( ((*L).e==Rouge) && ((*L).pid==pid)) { //printf("le processus de pid=%d libere la partiton de taille %d\n\n",pid,(*L).taille);
-2-

C:\Users\Afif\Desktop\BuddySystem.c

dimanche 2 dcembre 2012 18:16

(*L).taille_occupee=0; (*L).e=Vert; (*L).pid=0; return 1; } if( ((*L).e==Rouge) && ((*L).pid!=pid)) { return -1; } if( ((*L).e==Jaune) ) { if( ((*((*L).filsg)).e!=Vert) && ((*((*L).filsd)).e!=Vert) ) if(liberer(pid,(*L).filsg)!=1) return liberer(pid,(*L).filsd); else return 1; if( ((*((*L).filsg)).e!=Vert) && ((*((*L).filsd)).e==Vert) ) { liberer(pid,(*L).filsg); if((*((*L).filsg)).e==Vert) { free((*L).filsg); free((*L).filsd); (*L).e=Vert; //printf("les partitions de taille %d on ete reassemblee en une seule de %d\n\n",(*L).taille/2,(*L).taille); return 1; } return -1; } if( ((*((*L).filsg)).e==Vert) && ((*((*L).filsd)).e!=Vert) ) { liberer(pid,(*L).filsd); if((*((*L).filsd)).e==Vert) { free((*L).filsg); free((*L).filsd); (*L).e=Vert; //printf("les partitions de taille %d on ete reassemblee en une seule\n\n",(*L).taille/2); return 1; } return -1; } } } // affichier l'tat de la mmoire (les partitions libres et occupes) // rcursive int afficher_etat(Mem L) { if( ((*L).e==Vert) ) { if((*L).taille/1000!=0) printf("\t| Taille = %d else if((*L).taille/100!=0)

|\n",(*L).taille);

-3-

C:\Users\Afif\Desktop\BuddySystem.c

dimanche 2 dcembre 2012 18:16

printf("\t| Taille = %d |\n",(*L).taille); else if((*L).taille/10!=0) printf("\t| Taille = %d |\n",(*L).taille); else printf("\t| Taille = %d |\n",(*L).taille); printf("\t| libre |\n"); printf("\t--------------------%d\n",a=a-(*L).taille); return 1; } if( ((*L).e==Rouge) ) { if((*L).taille/1000!=0) printf("\t| Taille = %d |\n",(*L).taille); else if((*L).taille/100!=0) printf("\t| Taille = %d |\n",(*L).taille); else if((*L).taille/10!=0) printf("\t| Taille = %d |\n",(*L).taille); else printf("\t| Taille = %d |\n",(*L).taille); printf("\t| occupee par %d | <-- fragment interne = %d\n",(*L).pid,(*L).taille-(*L ).taille_occupee); printf("\t| a %.1f%% |\n",((*L).taille_occupee*100)/(float)(*L).taille); printf("\t--------------------%d\n",a=a-(*L).taille); return 1; } if( ((*L).e==Jaune) ) { afficher_etat((*L).filsd); return afficher_etat((*L).filsg); } }

int demande_allocation() { int taille; printf("donnez la taille du processus %d \t(-1 pour terminer les allocation)\n",nb_proc); do { scanf("%d",&taille); if(taille==-1) return 0; if(taille<=0) printf("taille erronee, reesayez \n"); } while(taille<=0);

if(allouer(taille,nb_proc,L)==1) { printf("\tallocation du processus %d\n\n",nb_proc); printf("\t--------------------%d\n",a); afficher_etat(L); a=1024; nb_proc++; } else


-4-

C:\Users\Afif\Desktop\BuddySystem.c

dimanche 2 dcembre 2012 18:16

printf("mmoire insuffisante, reesayez\n"); return 1; } void demande_liberation() { int pid; printf("entrez le numero de processus a liberer \n"); scanf("%d",&pid);

liberer(pid,L); printf("\tliberation du processus %d\n\n",pid); printf("\t--------------------%d\n",a); afficher_etat(L); a=1024; } int main() { L=NULL; printf("\tinitialisation de la memoire\n\n"); a=1024; nb_proc=1; initialisation(a,&L); printf("\t--------------------%d\n",a); afficher_etat(L); a=1024; while(demande_allocation()!=0) {;}

while((*L).e!=Vert) { demande_liberation(); } }

-5-