[C] coder un malloc??

coder un malloc?? [C] - C - Programmation

Marsh Posté le 24-02-2007 à 00:56:20    

Bonjour a tous,  
 
Je dois recoder la fonction malloc(). Avez vous une idee??  Par ou dois-je commencer?? Help... je suis perdu(:. Je dois utiliser les appels systeme brk() et sbrk(). J'ai compris le principe, le fonctionnement de ces deux fonctions. Mais a part ca rien. Quelqu'un pourrais-t-il m'orienter vers un debut de code?, les premiéres etapes.  
Merci.


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 24-02-2007 à 00:56:20   

Reply

Marsh Posté le 24-02-2007 à 00:59:29    

essaie plutot avec mmap, c'est plus simple.

Reply

Marsh Posté le 24-02-2007 à 01:13:45    

Taz a écrit :

essaie plutot avec mmap, c'est plus simple.


J'aimerai bien mais en fait je n'ai meme pas essayer de voir comment on se sert de mmap() vu que je n'ai pas le droit d'utiliser cette fonction. et oui je suis a l'ecole. On a des restriction. sinon tu ne peut pas me dire par ou je pourrai commencer??


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 24-02-2007 à 09:02:02    

man brk
man sbrk
 
sinon dans le K&R y a un exemple en fin de livre

Reply

Marsh Posté le 24-02-2007 à 11:22:46    

NAME
     brk, sbrk - change the amount of  space  allocated  for  the
     calling process's data segment
 
SYNOPSIS
     #include  
 
     int brk(void *endds);
 
     void *sbrk(int incr);
 
DESCRIPTION
     brk() and sbrk() are used to change dynamically  the  amount
     of  space  allocated  for the calling process's data segment
     (see  exec(2)).   The  change  is  made  by  resetting   the
     process's  break value and allocating the appropriate amount
     of space.  The break value is the address of the first loca-
     tion  beyond  the  end  of  the data segment.
     [...]
     brk() sets the break value to endds and  changes  the  allo-
     cated space accordingly.
 
     sbrk() adds incr bytes to the break value  and  changes  the
     allocated space accordingly.  incr can be negative, in which
     case the amount of allocated space is decreased.
 
     Upon successful completion, brk() returns a value of  0  and
     sbrk() returns the old break value.
 
http://www.linux-kheops.com/doc/ma [...] brk.2.html
 
[b]Conformité[b]
BSD 4.3  
brk et sbrk ne sont pas définis dans le C Standard, et sont volontairement exclus des standards POSIX.1 (paragraphes B.1.1.1.3 et B.8.3.3).  
 
Super [:shay]

Message cité 1 fois
Message édité par Tamahome le 24-02-2007 à 11:38:58
Reply

Marsh Posté le 24-02-2007 à 12:50:02    

Tamahome a écrit :

NAME
     brk, sbrk - change the amount of  space  allocated  for  the
     calling process's data segment
 
SYNOPSIS
     #include  
 
     int brk(void *endds);
 
     void *sbrk(int incr);
 
DESCRIPTION
     brk() and sbrk() are used to change dynamically  the  amount
     of  space  allocated  for the calling process's data segment
     (see  exec(2)).   The  change  is  made  by  resetting   the
     process's  break value and allocating the appropriate amount
     of space.  The break value is the address of the first loca-
     tion  beyond  the  end  of  the data segment.
     [...]
     brk() sets the break value to endds and  changes  the  allo-
     cated space accordingly.
 
     sbrk() adds incr bytes to the break value  and  changes  the
     allocated space accordingly.  incr can be negative, in which
     case the amount of allocated space is decreased.
 
     Upon successful completion, brk() returns a value of  0  and
     sbrk() returns the old break value.
 
http://www.linux-kheops.com/doc/ma [...] brk.2.html
 
[b]Conformité[b]
BSD 4.3  
brk et sbrk ne sont pas définis dans le C Standard, et sont volontairement exclus des standards POSIX.1 (paragraphes B.1.1.1.3 et B.8.3.3).  
 
Super [:shay]


 
 
Merci pour le copier coller mais les man je lai aient lus.
 
Par contre jai fai un peti prog qui alloue de la memoire avec sbrk mais le truk c'est que je ne sais pas comment le tester. Qulqu'un a t il une idee? ou un petit prog qui segment fault si on ne lui loue pas de memoire histoire ke j'alloue avec ma fontion??


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 24-02-2007 à 16:39:52    

Le malloc utilise t il l'appel exec()??


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 24-02-2007 à 17:51:33    

drexlbob a écrit :

Merci pour le copier coller mais les man je lai aient lus.
 
Par contre jai fai un peti prog qui alloue de la memoire avec sbrk mais le truk c'est que je ne sais pas comment le tester. Qulqu'un a t il une idee? ou un petit prog qui segment fault si on ne lui loue pas de memoire histoire ke j'alloue avec ma fontion??


 
manifestement, tu n'as pas bien lu...
 
Allez, comme je suis gentil :
 

Citation :

Upon successful completion, brk() returns a value of  0  and  
     sbrk() returns the old break value.

Reply

Marsh Posté le 24-02-2007 à 18:03:44    

facile [:dawa]

Code :
  1. void *malloc(size_t size){
  2.     static unsigned char buffer[1024*1024*1024]; //should be enough for everyone
  3.     static int lp=0;
  4.     lp+=size;
  5.     if(lp>sizeof(buffer)){
  6.          return NULL;
  7.     }else{
  8.          return &buffer[lp-size];
  9.     }
  10. }

Message cité 1 fois
Message édité par red faction le 24-02-2007 à 18:06:44
Reply

Marsh Posté le 24-02-2007 à 21:21:23    

Quel est exactement l'énonce du problème ?Quel est exactement l'énoncé du problème ?
 
Sinon j'ai une solution
 

Code :
  1. void* malloc(size_t size) {
  2.    return calloc(1, size);
  3. }

Reply

Marsh Posté le 24-02-2007 à 21:21:23   

Reply

Marsh Posté le 25-02-2007 à 00:16:37    

Reply

Marsh Posté le 25-02-2007 à 00:41:15    

et bien sur

Code :
  1. void* calloc(size_t n, size_t size)
  2. {
  3.   void *p = malloc(n * size);
  4.   if (p)
  5.     memset(p, 0, n * size);
  6.   return p;
  7. }

Reply

Marsh Posté le 25-02-2007 à 03:05:53    

en fait j'ai pas le droit d'utiliser malloc donc je dois recoder la fonction malloc avec les seul appel systeme brk() et sbrk().
Ca serait super cool de me donner uin site ou je pourrai trouver  des infos (pas sur malloc ou calloc) sur un algoritme utilisant les fonctions sbrk et brk. En fait c'est dans le cadre d'un projet. Merci d'avance


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 25-02-2007 à 15:17:45    


 


Pour ceux qui n'ont pas compris c'était du second degré ... rohh
 

Reply

Marsh Posté le 25-02-2007 à 15:35:03    

Olivier51 a écrit :

Pour ceux qui n'ont pas compris c'était du second degré ... rohh


Je pense que Taz avait compris :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 25-02-2007 à 18:16:52    

red faction a écrit :

facile [:dawa]

Code :
  1. void *malloc(size_t size){
  2.     static unsigned char buffer[1024*1024*1024]; //should be enough for everyone
  3.     static int lp=0;
  4.     lp+=size;
  5.     if(lp>sizeof(buffer)){
  6.          return NULL;
  7.     }else{
  8.          return &buffer[lp-size];
  9.     }
  10. }



 
Je ne vois en quoi cette fontion alloue de la memoire elle ne fait que retourner une adresse. En plus tu 'nutilise aucune allocation bas niveau (brk, sbrk)
 


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 25-02-2007 à 18:25:14    

drexlbob a écrit :

Je ne vois en quoi cette fontion alloue de la memoire elle ne fait que retourner une adresse. En plus tu 'nutilise aucune allocation bas niveau (brk, sbrk)


La fonction retourne une adresse sur une zone en static donc en mémoire permanente et positionne une variable sur l'offset de début de la zone libre pour pouvoir s'y retrouver lors de l'appel suivant => elle te donne donc un bien pointeur sur une zone réservée en mémoire.
 
Accessoirement c'était de l'humour... :pfff:


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 25-02-2007 à 23:02:33    

alors pour recoder malloc, regarde la derniere page du cours sur l'intra, on te file un algorithme pas trop pourrave (la section "notes sur malloc et free" )
Je cite:
 
Pour chaque bloc de mémoire que nous allons allouer avec sbrk(2), nous allons maintenir une structure qui nous est propre qui va contenir les informations suivantes:
 
typedef struct s_block_descriptor
{
   unsigned int   p;/* puissance de 2 de la taille du bloc*/
   struct s_block_descriptor *next; /* pointeur sur un autre bloc */
}  t_block_descriptor;
 
Quand un utilisateur fait un malloc(n), nous rajoutons à n la taille de notre structure (sizeof (t_block_descriptor)) puis nous cherchons la plus petite puissance p de 2 qui contient notre bloc. Exemple: pour malloc(12), à supposer que notre structure fait 8 octets, le total est 12 + 8 = 20 octets soit un bloc de 32 = 2^5 octets donc p = 5.
 
Nous collons notre structure au début du bloc et nous renvoyons à l'utilisateur l'adresse de début du bloc plus sizeof (t_block_descriptor).
 
Quand l'utisateur utilise free(ptr), nous retrouvons nos informations en soustrayant à l'adresse de ptr la taille de notre structure.
 
Nous rajoutons alors notre bloc libre dans une liste chaînée (freelist) correspondant à une entrée d'un tableau (hash) de 32 listes (sur un système 32 bits). L'entrée correspondant à la puissance de 2 de la taille de notre bloc.
 
t_block_descriptor *buckets[32];
 
Quand l'utilisateur utilise malloc() nous vérifions d'abord dans nos différentes freelists si un bloc de la même taille n'a pas déjà été alloué.  
 
Sinon accessoirement tu peux aussi jeter un oeil ici: http://en.wikipedia.org/wiki/Malloc les liens en fin de page sont tres instructifs et pourront te donner quelques pistes.
 
PS: je me permets de parler de l'intra car je me doute que tu as ce projet a rendre dans pas tres longtemps ";-)"


Message édité par meik le 25-02-2007 à 23:05:00

---------------
"Besides a mathematical inclination, an exceptionally good mastery of one's native tongue is the most vital asset of a competent programmer." E. Dijkstra
Reply

Marsh Posté le 26-02-2007 à 08:29:55    

voir K&R :o

Reply

Marsh Posté le 03-03-2007 à 22:14:52    

Olivier51 a écrit :

Pour ceux qui n'ont pas compris c'était du second degré ... rohh


masklinn a écrit :

Je pense que Taz avait compris :o


j'ai ri, au contraire. ça y est, je me fais peur, je ris sur du code  [:kzimir]

Reply

Marsh Posté le 03-03-2007 à 22:48:59    

tant que tu ris pas yeu...
 
 
 
 [:cytrouille]


Message édité par Tamahome le 03-03-2007 à 22:49:19
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed