Allocateur mémoire [Lanagage C]

Fermé
Wygan - 17 mai 2006 à 14:44
 Wygan - 18 mai 2006 à 12:31
Bonjour,

j'aurais besoin d'aide pour ce problème.

Est-ce que vous pourriez m'aider s'il vous plait .

Merci


Problème:Un allocateur
Nous souhaitons un allocateur de mémoire économique, pour cela nous allons travailler avec une allocation à deux niveaux. Un niveau “bloc” ou nous utilisons l'allocateur standart malloc (ou mmap) et un niveau “objet” ou nous ne fournissont pas la possibilité de désallouer.
L'allocation au niveau objet est faite dans un bloc

/*fichier allocateur.h*/
#include<sys/mman.h> //map
#include<pthread.h> //threads
//MAPPED indique que le bloc de mémoire doit etre alloué en utilisant mmap
//par défaut le bloc est alloué en utilisant malloc
#define MAPPED 0001
//THREAD_SAFE indique que les allocations dans le bloc doivent etre
//thread safe c'est à dire fonctionner en situation multi_thread
#define THREAD_SAFE 0002
//NOREGISTRY indique que l'on ne souhaite pas que me bloc soi référencé
//dans le registre global des allocateurs
#define NOREGISTRY 0004
//si la taille demandée dans newAllocator est négative ou nulle
//la taille par défaut est utilisée
#define BLOC_DEFAULT_SIZE 40960

struct allocate {
int flags; //drapeau de gestion
long taille; //taille d'un bloc alloué
char *start; //adresse du début du bloc
char *current; //position du premier octet libre dans le bloc
} ;
//nombre d'ocets encore disponibles
long reste(struct allocate *a);
//creation d'un nouvel allocateur
//flags & MAPPED si il faut faire un MAP
struct allocate *newAllocator(long taille, int flags);
//allocation a partir de la zone de size octets
//retourne NULL en cas d'echec
char *allocate(struct allocate *a, int size);
//libération de l'allocateur
void freeAllocateur(struct allocate *a);
//allocation dans une zone thread specifique
char *threadSpecifiqueAllocate(long taille)


Question 1
Ecrire la fonction reste

Question 2
Ecrire la fonction allocate. Qui vérifie qu'il ya assez de place dans le bloc et sinon retourne NULL. Sinon retourne la position courante dans le bloc et déplace celle-ci

Question 3
Expliquer ce qu'il faut faire pour que notre allocateur puisse etre utilisé dans un programme multi-thread. Quels problèmes cela pose-t-il et ou? Comment y remédier ?

Question 4
Ecrire la fonction newAllocator, pour toutes les valeurs possibles des flags (drapeaux, passés en paramètres). Vous supposerez l'existence d'une fonction addToRegistry(void *);(elle sera implémenté plus bas).Vous utiliserez la fonction mkstemp() pour créer un fichier temporaire pour pouvoir utiliser mmap.

Question 5
Le drapeau THREAD_SAFE indique que les allocate doivent pouvoir etre fait par plusieurs threads en concurrence.Modifier la fonction allocate pour cela/

Question 6
Le registry est une structure de donnée globale qui permet de stocker les adresses des différenres struct allocate.Expliquer comment implémenter ce registry et écrire les deux fonctions addToRegisty(void *) et removeFromRegistry(void *)

Question 7
Dans un environnement de programme multi-thread nous souhaitons utiliser notre nouvet allocateur .Nous souhaitons avoir un allocateur par thread qui soit géré par une variable thread spécifique qui pointe sur la struct allocate . Pour simpifier l'utilisation nous fournissons une fonction char *threadAllocate(int size); qui gère ,la création de la variable thread spécifique si nécessaire,l'allocation d'un bloc quand necessaire(taille par défaut) et retourne une zone fournie par allocate avec ce bloc référencé par la variable thread specifique.Ne pas oublier la fonction de destruction

Question 8
Pourquoi utiliser vous ou n'utilisez vous pas le drapeau THREAD_SAFE dans votre implémentation de threadAllocate()

Question 9
Ecrire un appel à atfork() qui permet de libérer les allocateurs inutiles.
Vous choisirez d'utiliser soit un registry soit l'interface threadAllocate()

1 réponse

Bonjour,

est-ce que quelqu'un pourrait m'aider svp?

Merci
0