搜索
bottom↓
回复: 3

关于slab.c(内存分配)中几个函数的理解,错误之处,请大家指正

[复制链接]

出0入0汤圆

发表于 2010-10-17 16:06:38 | 显示全部楼层 |阅读模式
1、堆内存的初始化
在RT-Thread中,rtthread_startup(void)函数调用了rt_system_heap_init(void *begin_addr, void* end_addr),此函数的作用就是初始化系统堆内存。
堆内存按“页”单位来管理,每页大小由宏定义RT_MM_PAGE_SIZE指定。
在函数rt_system_heap_init()中,调用rt_page_init((void*)heap_start, npages)函数对这些“页”进行初始化,主要工作就是给这些“页”配备了一个管理机构,叫做rt_page_list,它在系统初始化初期,只是指向整个堆区(此时堆区还未被分配使用),并且记录有整个堆区的“页”数。当然,这里实际的工作是由函数rt_page_free(void *addr, rt_size_t npages)完成的。rt_page_free()的作用就是释放指定数目的“页”到由rt_page_list指向的“页”链表中去。不过此时(系统初始化初期),函数rt_page_free()只是执行了它体内的如下几条语句:
  n = (struct rt_page_head *)addr;

  prev = &rt_page_list;
  (b = *prev) != RT_NULL;

  n->page = npages;
  n->next = b;
  *prev = n;

2、“页”的分配
“页”的分配由rt_page_alloc(rt_size_t npages)实现。从由rt_page_list所指向的空闲“页块”链表中找出一个合适的“页块”,进行分配。此处应该是一旦找到合适的(即大于或等于指定的分配页数)“页块”,就进行分配,属于“first fit”.同时对rt_page_list进行调整。

3、“页”的释放
由函数rt_page_free(void *addr, rt_size_t npages)实现。根据即将释放“页块”的首地址和页数,在由rt_page_list所指向的空闲“页块”链表中找出一个合适的“页块”,这个“页块”应该是这样的,它和即将释放“页块”是伙伴关系(邻居关系),不是在即将释放“页块”的前面就是在其后面。找到这样的“页块”后,将它们合并成一个整“页块”。


ffxz在帖子“分析函数rt_page_free时,弄不懂其中的加法运算,请作者FFXZ帮忙释疑”http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4326133&bbs_page_no=1&bbs_id=3066 中的释疑使我有了以上的理解,还请大家多多指正。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2010-10-17 16:14:17 | 显示全部楼层
slab.c中的其他函数还没仔细研读。
对于slab算法,大致有个了解。RT-Thread中实现的是简化的slab算法(好像编程指南中如是说)。
希望自己能理解,然后写个总结,给大家拍砖。

出0入0汤圆

发表于 2010-10-18 09:13:56 | 显示全部楼层
继续研究,从复杂度上面来说,page的管理只占slab分配方式的1/5
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-9 18:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表