coder un malloc?? [C] - C - Programmation
Marsh Posté le 24-02-2007 à 00:59:29
ReplyMarsh 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??
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
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
Marsh Posté le 24-02-2007 à 12:50:02
Tamahome a écrit : NAME |
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??
Marsh Posté le 24-02-2007 à 16:39:52
Le malloc utilise t il l'appel exec()??
Marsh Posté le 24-02-2007 à 17:51:33
drexlbob a écrit : Merci pour le copier coller mais les man je lai aient lus. |
manifestement, tu n'as pas bien lu...
Allez, comme je suis gentil :
Citation : Upon successful completion, brk() returns a value of 0 and |
Marsh Posté le 24-02-2007 à 18:03:44
facile
Code :
|
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 :
|
Marsh Posté le 25-02-2007 à 00:41:15
et bien sur
Code :
|
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
Marsh Posté le 25-02-2007 à 15:17:45
Siluro a écrit : (...) |
Taz a écrit : (...) |
Pour ceux qui n'ont pas compris c'était du second degré ... rohh
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
Marsh Posté le 25-02-2007 à 18:16:52
red faction a écrit : facile
|
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)
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...
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 ";-)"
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 |
j'ai ri, au contraire. ça y est, je me fais peur, je ris sur du code
Marsh Posté le 03-03-2007 à 22:48:59
tant que tu ris pas yeu...
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!!!!