/*
brk()
sbrk()
mmap()
更改进程地址空间的映射
系统维护一个数组,反映特定大小的内存的分配情况
当申请的大小类小于128k时用类似于伙伴算法的方法分配,调用brk()
else 用mmap分配
*/
#include<unistd.h>
#include<sys/mman.h>
#include"mymalloc.h"
#include<stdio.h>
#include<string.h>
#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name)
#define list_for_each(head,list) \
for(list=(head)->next;list!=(head);list=list->next)
#define list_add_head(head,list) \
do{ \
(list)->pre=(head); \
(list)->next=(head)->next; \
(head)->next=(list); \
(list)->next->pre=(list); \
}while(0)
#define list_del(list) \
do{ \
list->pre->next=list->next; \
list->next->pre=list->pre; \
}while(0)
#define to_entry(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
int inited;
/*
list_t list_free;
list_t list_used;
*/
list_t list_free=LIST_HEAD_INIT(list_free);
list_t list_used=LIST_HEAD_INIT(list_used);
int malloc_init()
{
#ifdef DEBUG
printf("initialise,though nothing to do\n");
#endif
inited=1;
return 0;
}
void* malloc_mmap(unsigned int bytes)
{
cnt_t * map_cnt=mmap(NULL,sizeof(cnt_t)+bytes,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0);
if(map_cnt==(void *) -1)
return NULL;
memset(map_cnt,0,sizeof(cnt_t));
map_cnt->mmap=1;
#ifdef DEBUG
printf("mmap the addr:%p \n",map_cnt->addr);
#endif
return (void *) map_cnt->addr;
}
void malloc_switch(list_t* list)
{
list_del(list);
list_add_head(&list_used,list);
}
void free_switch(list_t* list)
{
list_del(list);
list_add_head(&list_free,list);
}
void * malloc_brk(unsigned int bytes)
{
cnt_t * block=NULL;
list_t *plist;
list_for_each(&list_free,plist){
block=to_entry(plist,struct cnt,list);
if(block->size<bytes)
continue;
malloc_switch(plist); //将这个block从空闲链表移到used链表
return (void *)block->addr;
}
block=sbrk(sizeof(cnt_t)+bytes);
if(block==(void*) -1)
return NULL;
memset(block,0,sizeof(cnt_t));
list_add_head(&list_used,&(block->list));
// block->used=1;
block->size=bytes;
#ifdef DEBUG
printf("get the mem,addr:%p\n",block->addr);
#endif
return block->addr;
}
void * mymalloc(unsigned int bytes)
{
if(!inited && (malloc_init()==-1))
return NULL;
if((bytes>>17)>0)
return malloc_mmap(bytes);
return malloc_brk(bytes);
}
int addr_valid(void *addr)
{
return 1;
}
void myfree(void *ptr)
{
if(ptr==NULL)
return;
/*没有检查是否是已分配地址,这里假设是一个ok地址*/
if(!addr_valid(ptr))
return;
cnt_t *block=to_entry(ptr,cnt_t,addr);
if(block->mmap==1){
#ifdef DEBUG
printf("free addr:%p,munmap\n",ptr);
#endif
munmap(block,sizeof(cnt_t)+block->size);
return;
}
#ifdef DEBUG
printf("free addr:%p\n",ptr);
#endif
free_switch(&block->list);
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
malloc_ex.rar (4个子文件)
malloc_ex
mymalloc.back 2KB
test_malloc.c 322B
mymalloc.h 270B
mymalloc.c 3KB
共 4 条
- 1
资源评论
- Brett_PRS2014-06-03写得简单易懂,不过真要自己来写还是有难度,anyway,感谢分享!让我弄明白了内存分配的一些机制。
programprimer
- 粉丝: 0
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功