1. malloc笔记

1.1 基础概念

1.dynamic memory allocators:应用程序运行期间申请的内存(malloc)。

2.堆:dynamic memory allocator管理的进程内存区域
3.types of allocator:隐式分配器(new and garbage collection)和显示分配器(malloc & free)

1.2 explicit allocator

1.malloc、free、realloc
2.16-byte (x86-64) alignment on 64-bit systems
3.内部碎片产生的原因:

  • 维持堆所需的数据结构开销
  • 对齐的需要
  • 分配器实现的策略(比如,to return a big block to satisfy a small request)

4.外部碎片:Occurs when there is enough aggregate heap memory, but no single free block is large enough。(大块被划分成小块,虽然整个空闲内存能够放下程序,但是找不到单独的一块去存放)

5.keep track of free blocks:显式、隐式链表、Segregated free list(Different free lists for different size classes)、Blocks sorted by size(红黑树,长度为key)

1.2.1 隐式空闲链表

1.block structures

typedef struct block
{word_t header;//包含1bit的是否分配、剩下的表示payload大小 unsigned char payload[0];
} block_t;

2.Header access

  • Getting allocated bit from header return header & 0x1;
  • Getting size from header return header & ~0xfL;
  • Initializing header block->header = size | alloc;

3.Traversing list

static block_t *find_next(block_t *block)
{return (block_t *) ((unsigned char *) block + get_size(block));
}
  1. Finding a Free Block
  • first fit
static block_t *find_fit(size_t asize)
{block_t *block;for (block = heap_start; block != heap_end;block = find_next(block)) {{if (!(get_alloc(block)) && (asize <= get_size(block)))return block;}return NULL; // No fit found
}
  • next fit
  • best fit

5.Allocating in Free Block and Splitting Free Block

6.Freeing a Block and Coalescing and Bidirectional Coalescing

1.2.2 显式空闲链表

1.Unordered(插入时间复杂度O(1))

  • LIFO (last-in-first-out) policy
  • FIFO (first-in-first-out) policy
  1. Address-ordered policy(插入时间复杂度O(n))

1.2.3 Segregated List

1.按照不同的大小划分不同的List

2.To allocate a block of size n:

  • Search appropriate free list for block of size m > n (i.e., first fit)
  • If an appropriate block is found:
    Split block and place fragment on appropriate list
    If no block is found, try next larger class
  • Repeat until block is found

3.If no block is found:

  • Request additional heap memory from OS (using sbrk())
  • Allocate block of n bytes from this new memory
  • Place remainder as a single free block in appropriate size class.

1.3 隐式内存管理(垃圾收集)

1.How does the memory manager know when memory can be freed?

  • In general we cannot know what is going to be used in the future since it depends on conditionals
  • But we can tell that certain blocks cannot be used if there are no pointers to them

2.Must make certain assumptions about pointers

  • Memory manager can distinguish pointers from non-pointers
  • All pointers point to the start of a block
  • Cannot hide pointers (e.g., by coercing them to an int, and then back again):比如c语言,可以任意的使用指针,所以c语言不能够自动清理垃圾

3.采用有向图标记:堆中分配的block看成节点,边看成指针。利用dfs算法,可以标记现在或者未来依然会使用的堆中的block。

malloc实验

看了几个博客,用隐式链表的话能得个50分左右,采用显式空闲链表+LIFO或者显式空闲链表+地址排序能得个80分左右,采用Segregated List得分较高,有100分左右。

CMU 15213:malloc笔记和malloc实验相关推荐

  1. linux内核计数函数,Linux 内核学习笔记:malloc 函数

    Linux 0.11 实现的 malloc 函数实际上分配的是内核程序所用的内存,而不是用户程序的,因为源码中找不到类似系统调用 malloc 的代码.在 Linux 0.98 后,为了不与用户程序使 ...

  2. CMU 15-213 CSAPP (Ch5~Ch7)

    CMU 15-213 CSAPP (Ch1~Ch3) CMU 15-213 CSAPP (Ch5~Ch7) CMU 15-213 CSAPP (Ch8) CMU 15-213 CSAPP (Ch9) ...

  3. STM32学习笔记:按键实验

    STM32学习笔记:按键实验 一.所使用的函数 1.时钟使能函数 RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState New ...

  4. new和malloc区别和malloc详解

    参考:https://www.cnblogs.com/huhuuu/archive/2013/11/19/3432371.html https://blog.csdn.net/chance_wang/ ...

  5. linux内存管理实验malloc,linux内存管理实验报告.doc

    linux内存管理实验报告 操作系统实验报告 院别:XXXXXX 班级:XXXXXX 学号:XXXXXX 姓名:稻草人 实验题目:内存管理实验 实验目的 通过本次试验体会操作系统中内存的分配模式: 掌 ...

  6. [C++学习笔记](double*)malloc(n * sizeof(double));

    用malloc申请一段连续的内存空间, 这段内存可以存放n个double类型的变量, 实际上就是动态申请了一个double[n]的数组 因为malloc的返回类型都是(void *)所以强制转换为(d ...

  7. CMU 15-213 CSAPP (Ch1~Ch3)

    视频链接 课件链接 该视频课程使用 64位 编译器! 本文使用编译器从Ch.3.6开始换到64位,因此3.6之前 地址 为4字节,之后为8字节! Ch1.计算机系统漫游 C编译(ccl)与链接(ld) ...

  8. CSAPP(CMU 15-213):Lab6 Malloclab详解

    # 前言 本系列文章意在记录答主学习CSAPP Lab的过程,也旨在可以帮助后人一二,欢迎大家指正! tips:本lab主要是为了体验应用程序如何使用和管理虚拟内存,写一个动态存储分配器(dynami ...

  9. c语言中malloc分配矩阵,malloc,分配矩阵

    我以这种方式分配字符串向量: int number =0; char** matrix = (char**)malloc(10); //when I have to allocate a string ...

最新文章

  1. unity, monoDevelop ide 代码提示不起作用的解决方法
  2. 六月第一枪:股市震荡,下一步该做什么?
  3. FastFormers:实现Transformers在CPU上223倍的推理加速
  4. python入门教程非常详细-python初学者怎么入门:python入门教程非常详细
  5. 考教育统计与测量可以带哪种计算机,《教育统计与测量》练习题库及答案
  6. python length-1_TypeError:使用基本操作时,只有length1数组可以转换为Python标量
  7. C++结构体,联合体与枚举类
  8. 网易wap新闻客户端
  9. GlobalMapper20坐标转换
  10. ALINETEK 2.8寸 TFTLCD驱动原理
  11. 如何用ESP8266 向手机App 发送信息
  12. 【生物电信号】基于matlab GUI生物电信号仿真【含Matlab源码 684期】
  13. H无穷控制学习笔记——H无穷/H2控制
  14. easyui动态修改required
  15. 傻瓜式PHP模版,poscms傻瓜式开发模块
  16. QtQuick 移动端开发实战系列(7)_屏幕旋转实现(Android)
  17. FlinkCEP的底层理论:NFA-b Automaton原理介绍
  18. Excel 2010 VBA 入门 066 读取其他工作簿的数据
  19. DOSBOX的简单使用
  20. AlphaZero:一种人类从未见过的智慧

热门文章

  1. 基于vue和nodejs的项目知识信息分享平台
  2. angular实现excel导入
  3. 生成对抗网络(GAN)的5个最有趣的应用
  4. 【转】iPhone X
  5. C盘temp目录cab_xxxx_x文件
  6. 【转】CPU个数,核心数,线程数
  7. 讲一下PMP证书含金量具体体现在哪
  8. Javascript网页打印方法汇总
  9. c 语言isnan函数,_isnan, _isnanl
  10. 数据结构-希尔排序(Java实现)