malloc,free 实现原理和机制
来源:互联网 发布:知乎android客户端 编辑:程序博客网 时间:2024/06/06 02:10
malloc()函数的工作机制
malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。
申请的时候实际上占用的内存要比申请的大。因为超出的空间是用来记录对这块内存的管理信息 大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等。这就意味着如果写过一个已分配区的尾端,则会改写后一块的管理信息。这种类型的错误是灾难性的,但是因为这种错误不会很快就暴露出来,所以也就很难发现。将指向分配块的指针向后移动也可能会改写本块的管理信息。
记录管理信息的数据结构
在大部分操作系统中,内存分配由以下两个简单的函数来处理:
void *malloc (long numbytes):该函数负责分配 numbytes大小的内存,并返回指向第一个字节的指针。
void free(void *firstbyte):如果给定一个由先前的 malloc返回的指针,那么该函数会将分配的空间归还给进程的“空闲空间”。
malloc_init将是初始化内存分配程序的函数。它要完成以下三件事:将分配程序标识为已经初始化,找到系统中最后一个有效内存地址,然后建立起指向我们管理的内存的指针。这三个变量都是全局变量:
1. 分配程序的全局变量
int has_initialized = 0;
void *managed_memory_start;
void *last_valid_address;
如前所述,被映射的内存的边界(最后一个有效地址)常被称为系统中断点或者 当前中断点。在很多 UNIX系统中,为了指出当前系统中断点,必须使用 sbrk(0) 函数。 sbrk根据参数中给出的字节数移动当前系统中断点,然后返回新的系统中断点。使用参数 0 只是返回当前中断点。
2. 分配程序初始化函数
3.记录管理信息的数据结构
4. 解除分配函数
记录管理信息的数据结构
struct mem_control_block {int is_available;int size;};
在大部分操作系统中,内存分配由以下两个简单的函数来处理:
void *malloc (long numbytes):该函数负责分配 numbytes大小的内存,并返回指向第一个字节的指针。
void free(void *firstbyte):如果给定一个由先前的 malloc返回的指针,那么该函数会将分配的空间归还给进程的“空闲空间”。
malloc_init将是初始化内存分配程序的函数。它要完成以下三件事:将分配程序标识为已经初始化,找到系统中最后一个有效内存地址,然后建立起指向我们管理的内存的指针。这三个变量都是全局变量:
1. 分配程序的全局变量
int has_initialized = 0;
void *managed_memory_start;
void *last_valid_address;
如前所述,被映射的内存的边界(最后一个有效地址)常被称为系统中断点或者 当前中断点。在很多 UNIX系统中,为了指出当前系统中断点,必须使用 sbrk(0) 函数。 sbrk根据参数中给出的字节数移动当前系统中断点,然后返回新的系统中断点。使用参数 0 只是返回当前中断点。
2. 分配程序初始化函数
void malloc_init(){last_valid_address = sbrk(0);managed_memory_start = last_valid_address;has_initialized = 1;}
3.记录管理信息的数据结构
struct mem_control_block {int is_available;int size;};
4. 解除分配函数
void free(void *firstbyte) {struct mem_control_block *mcb;mcb = firstbyte - sizeof(struct mem_control_block);mcb->is_available = 1;return;}5. 主分配程序
void *malloc(long numbytes) { void *current_location; struct mem_control_block *current_location_mcb; void *memory_location; if(! has_initialized) { malloc_init(); } numbytes = numbytes + sizeof(struct mem_control_block); memory_location = 0; current_location = managed_memory_start; while(current_location != last_valid_address) { current_location_mcb = (struct mem_control_block *)current_location; if(current_location_mcb->is_available) { if(current_location_mcb->size >= numbytes) { current_location_mcb->is_available = 0; memory_location = current_location; break; } } current_location = current_location + current_location_mcb->size; } if(! memory_location) { sbrk(numbytes); memory_location = last_valid_address; last_valid_address = last_valid_address + numbytes; current_location_mcb = memory_location; current_location_mcb->is_available = 0; current_location_mcb->size = numbytes; } memory_location = memory_location + sizeof(struct mem_control_block); return memory_location;}以上总结来源:http://baike.baidu.com/view/736228.htm
- malloc,free 实现原理和机制
- malloc 原理 实现机制 vs free 原理 实现机制
- malloc和free实现的原理
- C语言malloc和free实现原理
- malloc和free实现的原理
- C语言malloc和free实现原理
- 简述malloc和free实现原理
- malloc和free的实现原理
- C语言malloc和free实现原理
- malloc和free的实现原理
- malloc和free原理
- malloc和free原理
- malloc和free函数机制
- malloc和free的原理
- malloc和Free 工作原理
- malloc和free工作原理
- malloc()和free()的原理
- malloc和free的原理
- jquery函数大全
- Spring学习总结
- 涂鸦
- 虚拟机密码丢失处理
- HDU 1548-A strange lift
- malloc,free 实现原理和机制
- TLD(Tracking-Learning-Detection)学习与源码理解之(六)
- android APK反编译
- jquery基础
- javascript根据日期判断星期几
- 解决 YUM Repository updates is listed more than once in the configuration 的问题
- oracle动态性能视图分类
- 数学是一种思考方式
- 数据结构-06 栈Stack