没有什么难以理解的地方

static void *heap_listp;extern int mm_init(void);
extern void *mm_malloc(size_t size);
extern void mm_free(void *ptr);static void *extend_heap(size_t words);
static void *coalesce(void *bp);
static void *find_fit(size_t asize);
static void *place(void *bp,size_t asize);
/*Basic constants and macros*/
#define WSIZE 4              /*Word and header/footer size(bytes)*/
#define DSIZE 8              /*Double word size (bytes)*/
#define CHUNKSIZE (1<<12)    /*Extend heap by this amout (bytes)*/#define MAX(x,y) ((x) > (y)? (x):(y))/*Pack a size and allocated bit into a word*/
#define PACK(size,alloc) ((size) | (alloc))/*Read and write a workd at address p*/
#define GET(p) (*(unsigned int*)(p))
#define PUT(p,val) (*(unsigned int*)(p) = (val))/*Read the size and allocated fields from address p*/
#define GET_SIZE(p) (GET(p) & ~0x7)
#define GET_ALLOC(p) (GET(p) & 0x1)/*Given block ptr bp,comute address of its header and footer*/
#define HDRP(bp) ((char*)(bp)-WSIZE)
#define FTRP(bp) ((char*)(bp)+GET_SIZE(HDRP(bp))-DSIZE)/*Given block ptr bp,compute address of next and previous blocks*/
#define NEXT_BLKP(bp) ((char*)(bp)+GET_SIZE(((char*)(bp)-WSIZE)))
#define PREV_BLKP(bp) ((char*)(bp)-GET_SIZE(((char*)(bp)-DSIZE)))int mm_init(void) {/*Create the initial empty heap*/if((heap_listp = mem_sbrk(4*WSIZE)) == (void*)-1) return -1;PUT(heap_listp,0);                          /*Alignment padding*/PUT(heap_listp+(1*WSIZE),PACK(DSIZE,1));    /*Prologue header*/PUT(heap_listp+(2*WSIZE),PACK(DSIZE,1));    /*Prologue footer*/PUT(heap_listp+(3*WSIZE),PACK(0,1));        /*Epilogue header*/heap_listp+=(2*WSIZE);/*Extend the empty heap with a free block of CHUNKSIZE bytes*/if(extend_heap(CHUNKSIZE/WSIZE) == NULL) return -1;return 0;
}static void *extend_heap(size_t words) {char *bp;size_t size;/*Allocate an even number of words to maintain alignment*/size=(words%2)? (words+1)*WSIZE : words*WSIZE;if((long)(bp = mem_sbrk(size)) == -1) return NULL;/*Initialize free block header/footer and the epilogue header*/PUT(HDRP(bp),PACK(size,0));              /*New block header and Free Epilogue*/PUT(FTRP(bp),PACK(size,0));              /*New block footer*/PUT(HDRP(NEXT_BLKP(bp)),PACK(0,1));      /*New Epilogue header*//*Coalesce if the previous block was free*/return coalesce(bp);
}void mm_free(void *bp){size_t size=GET_SIZE(HDRP(bp));PUT(HDRP(bp),PACK(size,0));PUT(FTRP(bp),PACK(size,0));coalesce(bp);
}static void *coalesce(void *bp){size_t prev_alloc=GET_ALLOC(FTRP(PREV_BLKP(bp)));size_t next_alloc=GET_ALLOC(HDRP(NEXT_BLKP(bp)));size_t size=GET_SIZE(HDRP(bp));if(prev_alloc && next_alloc) {                 /*Case 1*/return bp;}else if(prev_alloc && !next_alloc) {           /*Case 2*/size+=GET_SIZE(HDRP(NEXT_BLKP(bp)));PUT(HDRP(bp),PACK(size,0));PUT(FTRP(bp),PACK(size,0));}else if(!prev_alloc && !next_alloc) {          /*Case 3*/size+=GET_SIZE(HDRP(PREV_BLKP(bp)));PUT(HDRP(bp),PACK(size,0));PUT(HDRP(PREV_BLKP(bp)),PACK(size,0));bp = PREV_BLKP(bp);}else {                                         /*Case 4*/size+=GET_SIZE(HDRP(PREV_BLKP(bp)))+GET_SIZE(FTRP(NEXT_BLKP(bp)));PUT(HDRP(PREV_BLKP(bp)),PACK(size,0));PUT(FTRP(NEXT_BLKP(bp)),PACK(size,0));}return bp;
}void *mm_malloc(size_t size) {size_t asize;                    /*Adjusted block size*/size_t extendsize;               /*Amount to extend heap if no fit*/char *bp;/*Ignore spurious requests*/if(size == 0) return NULL;/*Adjust block size to include overhead and alignment reqs.*/if(size < DSIZE) asize=2*DSIZE;else asize=DSIZE*((size+(DSIZE)+(DSIZE-1))/DSIZE);     /*judge size*//*Search the free list for a fit*/if((bp = find_fit(asize)) != NULL) {place(bp,asize);return bp;}/*No fit found.Get more memory and place the block*/extendsize = MAX(asize,CHUNKSIZE);if((bp = extend_heap(extendsize/WSIZE)) == NULL) return NULL;place(bp,asize);return bp;
}static void *find_fit(size_t asize) {char *bp = (heap_listp+DSIZE);                           /*get first block*/size_t this_alloc=GET_ALLOC(HDRP(NEXT_BLKP(bp)));        /*judge if 0*/size_t this_size=GET_SIZE(HDRP(bp));                     /*get size*/while(!(this_alloc == 0x1 && this_size == 0)) {          /*scan the list*/if(this_alloc == 0x0 && this_size >= asize) return bp; /*get the good block*/bp=NEXT_BLKP(bp);                                      /*get the next one*/this_alloc=GET_ALLOC(HDRP(NEXT_BLKP(bp)));             this_size=GET_SIZE(HDRP(bp));}return NULL;                                             /*bad scan*/
}static void *place(void *bp,size_t asize){size_t old_size=GET_SIZE(HDRP(bp));                      /*save old size*/if(asize == old_size) {                                  /*same size*/PUT(HDRP(bp),PACK(asize,1));PUT(FTRP(bp),PACK(asize,1));}else {                                                   /*samller size*/size_t rem_size=old_size-asize;                        /*get the remain size*/PUT(HDRP(bp),PACK(asize,1));                           /*set the alloc*/PUT(FTRP(bp),PACK(asize,1));void *next_bp=NEXT_BLKP(bp);PUT(HDRP(next_bp),PACK(rem_size,0));                   /*set alloc and size*/PUT(FTRP(next_bp),PACK(rem_size,0));}
}

下面是memlib   注意MAX_HEAP 不要取太大不然开不了

#define MAX_HEAP (1<<20)/*Private global variables*/static char *mem_heap;       /*Points to first byte of heap*/
static char *mem_brk;        /*Points to last byte of heap plus 1*/
static char *mem_max_addr;   /*Max legal heap addr plus 1*//**mem_init - Initialize the memory system model*/void mem_init(void) {mem_heap = (char*)malloc(MAX_HEAP);mem_brk = (char*)mem_heap;mem_max_addr = (char*)(mem_heap + MAX_HEAP);
}/**mem_sbrk - Simple model of the sbrk function. Extends the heap *      by incr bytes and returns the start address of the new area.In*      this model,the heap cannot be shrunk.*/void *mem_sbrk(int incr) {char *old_brk = mem_brk;if((incr < 0) || ((mem_brk + incr) > mem_max_addr)) {errno = ENOMEM;fprintf(stderr,"ERROR: memsbrk failed. Ran out of memory ...\n");return (void*)-1;}mem_brk+=incr;return (void*)old_brk;
}

加上相应的库函数就可以运行了.不过问题是mm_free有没有很好的工作我还没想到很好的方法检验.

转载于:https://www.cnblogs.com/tclan126/p/8413499.html

简单显示分配器的实现相关推荐

  1. C语言读取bmp图像并做简单显示

    C语言读取bmp图像并做简单显示) bmp文件格式 读取bmp文件信息并展示 bmp文件格式 bmp文件大体上分为四个部分: bmp文件构成 位图文件头BITMAPFILEHEADER 位图信息头BI ...

  2. 如何在html上显示时间设置,js实现在网页上简单显示时间的方法

    本文实例讲述了js实现在网页上简单显示时间的方法.分享给大家供大家参考.具体如下: 这是一款网页时钟JS代码,纯javascript实现,显示时.分.秒.网页时间显示.网页时钟有很多,这个真的挺简易的 ...

  3. 基于嵌入式linux的freetype矢量字体简单显示的实现

    一.freetype简介 FreeType库是一个完全免费(开源)的.高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,可以非常方便我们开发字体显示相关的程序功能.它支持单色位图.反 ...

  4. 乐视三合一体感摄像头Astra pro开发记录1(深度图、彩色图及点云简单显示)

    在某鱼上淘的乐视三合一体感摄像头,捡漏价九十几块,买来玩玩. 网上已经有一些关于此款摄像头的开发资料. 官方的开发资料:官网链接 按官方网站以及其他帖子,下载并安装相机的驱动和SDK,不难配置好相机. ...

  5. iOS版MapABC的简单显示地图的Demo

    iOS开发也学习了有一些时日了,很想写点什么,但是又觉得自己的水平还不是很好,今天就借MapABC,写一个简单的程序.MapABC的iOS API只提供了文档和静态库,没有提供Demo,所以我自己写了 ...

  6. arduino 的 oled时钟简单显示

    记录下 好像代码逻辑有点low 不过能用,后期再来优化下: #include <Arduino.h> #include <U8g2lib.h> #include <Wir ...

  7. 利用 Matplotlib 简单显示神经网络训练损失变化曲线

    常用 TensorBoard 来显示神经网络训练损失值变化曲线,但需要下载包,操作相对比较麻烦,因此对于非特殊情况可以使用 Matplotlib 来输出曲线,具体代码如下. import matplo ...

  8. 【ArcGIS Engine开发入门】1.简单显示地图LicenseContro,ToolbarControl,TOCControl,MapControl

    必需是VS2012(下载的高版本VS不能装Engine,可以装俩个VS),和ArcMap 10.2(ArcGIS只能装一个,且必须要保证删干净) 下载安装可以看其他人的教程 .Arcgis Engin ...

  9. java swing实现简单图片显示(测试生成图片快捷方式)

    原链接:https://yq.aliyun.com/articles/58303 package com.ts.x;import java.awt.Image; import java.awt.ima ...

最新文章

  1. 做砸数据中台项目的9种方法
  2. ORA-00907: 缺失右括号问题整理解决
  3. 计算机网络是通信技术和,计算机网络是计算机技术和通信技术相结合的产物。()...
  4. Android热修复升级探索——SO库修复方案 1
  5. 数学之美 系列十 有限状态机和地址识别
  6. C++学习基础七——深复制与浅复制
  7. php如何水平对齐所有星星,css怎么设置水平对齐
  8. apache部署https
  9. 支持与不支持in-place操作的OpenCV函数汇总
  10. centos6.5 rpm安装mysql_CentOS6.5系统下RPM包安装MySQL5.6(转)
  11. 一道多线程通信实例分析
  12. UVA11351 Last Man Standing【约瑟夫环+数学】
  13. Windows网络编程——查询本机的主机名称及IP地址(控制台应用程序)
  14. 因果信号的傅里叶变换_信号傅里叶变换系列文章(1):傅里叶级数、傅里叶系数以及傅里叶变换...
  15. ios沙箱软件_ios沙盒2存档-ios沙盒2最新版下载0.5.2苹果版-西西软件下载
  16. IDEA引入JDK/jar包无效、java 文件灰色右下角橙色java图标显示等问题解决办法
  17. Windows注册表开机自启,右键菜单,运行的位置介绍
  18. MinDoc v0.4 发布 轻量级文档在线管理系统
  19. 深度学习计算框架综述(一)行业内计算框架总览
  20. 钉钉添加自定义机器人,实现每周定时@某人

热门文章

  1. Shell(6)——if语句
  2. java 局部性原理_程序局部性原理
  3. LC.exe”已退出,代码为 -1
  4. centos安装mysql 简书_在centos上安装mysql
  5. VS Code运行Python程序
  6. 删除二叉搜索树中的节点
  7. ValueError: slice index xxxx of dimension 0 out of bounds,详细分析。
  8. mac下登录mysql数据库_1.Mac下面按照mysql数据库的步骤:
  9. 定期定量采购_定量采购方式
  10. 部署环境_Jenkins环境搭建和部署项目的过程