运行应用所占内存主要有五个段,分别为栈、堆、全局/静态数据段、常量数据段、代码段
Why:让应用方便/灵活/高效地使用有限的内存
静态内存分配是指编译时的内存分配
动态内存分配是指运行时的内存分配 动态内存
为什么要使用动态内存分配?
动态内存分配主要有两类
动态内存 申请方式
申请大小
动态内存分配函数
void * malloc (size_ t size);
注:
void free (void *ptr)
连续内存分配
内存碎片:不能被利用的空闲内存
设计思路
最先匹配(First Fit)分配策略
优点:简单,在高地址空间有大块的空闲分区
缺点:外部碎片,分配大块时较慢
示例:分配400字节, 使用第1个空闲块
最佳匹配(Best Fit)分配策略
思路:分配n字节,分配n字节分区时, 查找并使用不小于n的最小空闲分区。释放分区时,检查是否可与临近的空闲分区合并
示例:分配400字节, 使用第3个空闲块(最小)
最差匹配(Worst Fit)分配策略
思路:分配n字节,使用尺寸不小于n的最大空闲分区 。释放分区时,检查是否可与临近的空闲分区合并
示例:分配400字节,使用第2个空闲块(最大)
伙伴系统(Buddy System)的缘起
观察&分析
我们需要新的连续内存分配策略
伙伴系统(Buddy System)
非连续内存分配的缘起
设计目标: 提高内存利用效率和管理灵活性
非连续分配需要解决的问题
非连续分配的硬件辅助机制
程序运行的段地址空间由多个段组成
段表:位于内存中,被内核管理,段表与任务/进程对应
页帧(帧、物理页面, Frame, Page Frame)
页面(页、逻辑页面, Page)
页面到页帧
页表:位于内存中,被内核管理,页表与任务/进程对应
性能相关的解决办法
容量相关的解决办法 -- 多级页表
容量相关的解决办法 -- 反置页表
#include <stdlib.h> int main(){ int *ptr; ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */ if (ptr != NULL) { *(ptr + 5) = 480; /* assign 480 to sixth integer */ printf("Value of the 6th integer is %d",*(ptr + 5)); } }
第一步:OS加载程序运行
第二步:程序发出malloc函数调用,且Lib库有空闲空间
第二步:程序发出malloc函数调用,且Lib库无空闲空间
http://en.wikipedia.org/wiki/Buddy_memory_allocation
2017ppt