CMU 15213:malloc笔记和malloc实验
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));
}
- 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
- 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实验相关推荐
- linux内核计数函数,Linux 内核学习笔记:malloc 函数
Linux 0.11 实现的 malloc 函数实际上分配的是内核程序所用的内存,而不是用户程序的,因为源码中找不到类似系统调用 malloc 的代码.在 Linux 0.98 后,为了不与用户程序使 ...
- 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) ...
- STM32学习笔记:按键实验
STM32学习笔记:按键实验 一.所使用的函数 1.时钟使能函数 RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState New ...
- new和malloc区别和malloc详解
参考:https://www.cnblogs.com/huhuuu/archive/2013/11/19/3432371.html https://blog.csdn.net/chance_wang/ ...
- linux内存管理实验malloc,linux内存管理实验报告.doc
linux内存管理实验报告 操作系统实验报告 院别:XXXXXX 班级:XXXXXX 学号:XXXXXX 姓名:稻草人 实验题目:内存管理实验 实验目的 通过本次试验体会操作系统中内存的分配模式: 掌 ...
- [C++学习笔记](double*)malloc(n * sizeof(double));
用malloc申请一段连续的内存空间, 这段内存可以存放n个double类型的变量, 实际上就是动态申请了一个double[n]的数组 因为malloc的返回类型都是(void *)所以强制转换为(d ...
- CMU 15-213 CSAPP (Ch1~Ch3)
视频链接 课件链接 该视频课程使用 64位 编译器! 本文使用编译器从Ch.3.6开始换到64位,因此3.6之前 地址 为4字节,之后为8字节! Ch1.计算机系统漫游 C编译(ccl)与链接(ld) ...
- CSAPP(CMU 15-213):Lab6 Malloclab详解
# 前言 本系列文章意在记录答主学习CSAPP Lab的过程,也旨在可以帮助后人一二,欢迎大家指正! tips:本lab主要是为了体验应用程序如何使用和管理虚拟内存,写一个动态存储分配器(dynami ...
- c语言中malloc分配矩阵,malloc,分配矩阵
我以这种方式分配字符串向量: int number =0; char** matrix = (char**)malloc(10); //when I have to allocate a string ...
最新文章
- unity, monoDevelop ide 代码提示不起作用的解决方法
- 六月第一枪:股市震荡,下一步该做什么?
- FastFormers:实现Transformers在CPU上223倍的推理加速
- python入门教程非常详细-python初学者怎么入门:python入门教程非常详细
- 考教育统计与测量可以带哪种计算机,《教育统计与测量》练习题库及答案
- python length-1_TypeError:使用基本操作时,只有length1数组可以转换为Python标量
- C++结构体,联合体与枚举类
- 网易wap新闻客户端
- GlobalMapper20坐标转换
- ALINETEK 2.8寸 TFTLCD驱动原理
- 如何用ESP8266 向手机App 发送信息
- 【生物电信号】基于matlab GUI生物电信号仿真【含Matlab源码 684期】
- H无穷控制学习笔记——H无穷/H2控制
- easyui动态修改required
- 傻瓜式PHP模版,poscms傻瓜式开发模块
- QtQuick 移动端开发实战系列(7)_屏幕旋转实现(Android)
- FlinkCEP的底层理论:NFA-b Automaton原理介绍
- Excel 2010 VBA 入门 066 读取其他工作簿的数据
- DOSBOX的简单使用
- AlphaZero:一种人类从未见过的智慧