Bonjour a tous! Je suis nouveau sur le forum mais egalement nouveau en C. Dans un de mes cours, je dois coder une petite librairie de gestion de memoire par region dans ce meme langage. Oui mais voila, je recontre quelques petits problemes (de conceptualisation surtout) qui m'empechent d'avancer.
En fait, on nous oblige a utiliser la fonction : mmap (NULL, nbytes, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)
pour notre allocation de memoire "bas-niveau". J'ai lu la doc sur mmap et c'est pas la que le probleme ce pose.
On nous demande dans l'enonce que :
"mmap ne peut allouer que des multiples de pages (i.e. des multiples de 4KB par exemple). Pour des regions de grande taille ou de taille illimitee, on peut sans autres dedier chaque page a une region. Mais pour des regions de petite taille (e.g. qui ne contiennent que un ou deux objects de quelques bytes), cela peut entraıner un gaspillage inacceptable, donc il faudra s’arranger pour partager des pages entre plusieurs de ces petites regions."
Et c'est la que mon probleme se pose. Il est possible d'allouer uniquement des pages entieres de memoire donc, lorsque nous creons notre premiere region, aussi petite soit-elle, nous allouons une premiere page. Maintenant, lorsque l'on decide d'allouer une autre region de taille inferieur a la taille de la page moins la taille de la region precedent, comment recuperer la page deja allouee pour y inserer la nouvelle region?
A vous tous merci!
PS : voici l'enonce du probleme : http://www.iro.umontreal.ca/~monnier/2035/tp2/tp2.pdf
et voici le code qu'on nous fournit a la base :
et pour finir, le code rgn.h :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 /* rgn.c --- Routines d'allocation mémoire par régions. */ #include "rgn.h" #include <sys/mman.h> #include <unistd.h> /* L'allocation de bas niveau se fait avec "mmap": ptr = mmap (NULL, nbytes, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0) où nbytes doit être un multiple de la taille d'une page, i.e. un multiple de sysconf(_SC_PAGESIZE). Cette mémoire peut être libérée plus tard avec "munmap". Voir "man mmap", "man munmap", et "man sysconf" pour de plus amples informations. */ /* Type d'un descripteur de région. */ struct rgn { /* ... */ }; /* Crée une nouvelle région dont la taille maximale est "maxbytes", ou qui peut grandir sans limite si "maxbytes" est égal Ã* 0. */ rgn *rgn_new (size_t maxbytes) { /* ... */ } /* Alloue un espace de "nbytes" dans la région "r" et renvoie son adresse, ou NULL si l'allocation échoue. */ void *rgn_alloc (rgn *r, size_t nbytes) { /* ... */ } /* Libère l'espace occupé par la région "r". */ void rgn_free (rgn *r) { /* ... */ } #if 0 /* On put implanter "malloc" au-dessus de nos régions. */ void *malloc (size_t nbytes) { rgn *r = rgn_new (nbytes + sizeof (rgn*)); rgn **x = rgn_alloc (r, nbytes + sizeof (rgn*)); *x = r; return x+1; } void free (void *ptr) { rgn **x = ptr; rgn_free (x[-1]); } #endif /* arch-tag: 64fdb756-d391-4f17-98b7-a5ecff6b652f */
Encore une fois merci!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 /* rgn.h --- Routines d'allocation mémoire par régions. */ #ifndef RGN_H #define RGN_H #include <stdlib.h> /* Type d'un descripteur de région. Reste opaque ici: son implantation n'est visible que dans rgn.c. */ typedef struct rgn rgn; /* Crée une nouvelle région dont la taille maximale est "maxbytes", ou qui peut grandir sans limite si "maxbytes" est égal Ã* 0. */ rgn *rgn_new (size_t maxbytes); /* Alloue un espace de "nbytes" dans la région "r" et renvoie son adresse, ou NULL si l'allocation échoue. */ void *rgn_alloc (rgn *r, size_t nbytes); /* Libère l'espace occupé par la région "r". */ void rgn_free (rgn *r); #endif /* arch-tag: ac7599d3-b67d-4810-84fd-f18d104cb859 */
Partager