Se connecter avec
S'enregistrer | Connectez-vous

Allocation memoire en C

Dernière réponse : dans Programmation

Salut,
j'ai un problème avec les structures et les allocations.
Si,quelqu'un pouvait me donner un coup de main,se serait sympa.
Merci d'avance

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

  1. struct allocate {
  2. int flags; //drapeau de gestion
  3. long taille; //taille d'un bloc alloué
  4. char *start; //adresse du début du bloc
  5. char *current; //position du premier octet libre dans le bloc
  6. } ;

  1. //nombre d'ocets encore disponibles
  2. long reste(struct allocate *a);
  3. //creation d'un nouvel allocateur
  4. //flags & MAPPED si il faut faire un MAP
  5. struct allocate *newAllocator(long taille, int flags);
  6. //allocation a partir de la zone de size octets
  7. //retourne NULL en cas d'echec
  8. char *allocate(struct allocate *a, int size);
  9. //libération de l'allocateur
  10. void freeAllocateur(struct allocate *a);
  11. //allocation dans une zone thread specifique
  12. 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()

Autres pages sur : allocation memoire

Lassé par la pub ? Créez un compte
Lassé par la pub ? Créez un compte