免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1056 | 回复: 3
打印 上一主题 下一主题

[内核入门] 关于SLUB分配器的一个疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-12-07 20:04 |只看该作者 |倒序浏览
本帖最后由 626788149 于 2015-12-08 11:37 编辑

问题已经解决。




最近一直在写操作系统,写到内存管理那块了。想实现一个SLUB分配器。
差不多实现完成了,不过出现了SMP的同步问题,还没被释放的对象可能会被分配出去,我差不多是按照linux的SLUB系统写的。
如果在SLUB分配接口加上一把大锁,同步问题就不会出现。

我一直没看懂第27行。
c->page->inuse = c->page->objects;  

可能同步问题跟inuse这个值有关。

谁能告诉我c->page->inuse = c->page->objects; 这行是啥意思?
  1. static void *__slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node,  
  2.               unsigned long addr, struct kmem_cache_cpu *c)  
  3. {  
  4.     void **object;  
  5.     struct page *new;  
  6.   
  7.     /* We handle __GFP_ZERO in the caller */  
  8.     gfpflags &= ~__GFP_ZERO;  
  9.   
  10.     if (!c->page)/*本地CPU的slab结构中没有存储可分配的内存,则要为其寻找新的slab*/  
  11.         goto new_slab;  
  12.   
  13.     slab_lock(c->page);  
  14.     if (unlikely(!node_match(c, node)))//节点不匹配   
  15.         goto another_slab;  
  16.   
  17.     stat(c, ALLOC_REFILL);  
  18.   
  19. load_freelist:  
  20.     object = c->page->freelist;//获取一个对象   
  21.     if (unlikely(!object))  
  22.         goto another_slab;  
  23.     if (unlikely(SLABDEBUG && PageSlubDebug(c->page)))  
  24.         goto debug;  
  25.   
  26.     c->freelist = object[c->offset]; //更新freelist   
  27.     c->page->inuse = c->page->objects;  
  28.     /*一旦slab从partial slab链表转移到本地CPU,则page_freelist不再负责维护空闲对象了,
  29.       因此设为NULL*/  
  30.     c->page->freelist = NULL;  
  31.     c->node = page_to_nid(c->page);  
  32. unlock_out:  
  33.     slab_unlock(c->page);  
  34.     stat(c, ALLOC_SLOWPATH);  
  35.     return object; //返回对象   
  36.   
  37. another_slab:  
  38.     deactivate_slab(s, c);//将本地CPU的slab移回partial slab链表   
  39.   
  40. new_slab:  
  41.     /*从partial slab链表中寻找一个slab*/  
  42.     new = get_partial(s, gfpflags, node);  
  43.     if (new) {/*获取成功则直接将该slab交给本地CPU*/  
  44.         c->page = new;  
  45.         stat(c, ALLOC_FROM_PARTIAL);  
  46.         goto load_freelist;  
  47.     }  
  48.   
  49.     if (gfpflags & __GFP_WAIT)  
  50.         local_irq_enable();  
  51.   
  52.     /*如果partial slab链表中已无法获取slab则创建新的slab*/  
  53.     new = new_slab(s, gfpflags, node);  
  54.   
  55.     if (gfpflags & __GFP_WAIT)  
  56.         local_irq_disable();  
  57.   
  58.     if (new) {//创建成功   
  59.         c = get_cpu_slab(s, smp_processor_id());//获取本地CPU的slab信息结构   
  60.         stat(c, ALLOC_SLAB);  
  61.         if (c->page)//本地CPU中存在slab,则移除该slab   
  62.             flush_slab(s, c);  
  63.         slab_lock(new);  
  64.         __SetPageSlubFrozen(new);//冻结slab,表明slab处于本地CPU中   
  65.         c->page = new;//本地CPU中的slab设置为新创建的slab   
  66.         goto load_freelist;  
  67.     }  
  68.     if (!(gfpflags & __GFP_NOWARN) && printk_ratelimit())  
  69.         slab_out_of_memory(s, gfpflags, node);  
  70.     return NULL;  
  71. debug:  
  72.     if (!alloc_debug_processing(s, c->page, object, addr))  
  73.         goto another_slab;  
  74.   
  75.     c->page->inuse++;  
  76.     c->page->freelist = object[c->offset];  
  77.     c->node = -1;  
  78.     goto unlock_out;  
  79. }
复制代码

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
2 [报告]
发表于 2015-12-08 16:48 |只看该作者
大概是说page上的objects全被使用了(处于frozen状态?)
或者说,page上剩余的objects全部被本地cache接管了。

论坛徽章:
0
3 [报告]
发表于 2015-12-08 17:47 |只看该作者
回复 2# nswcfd


    谢谢您的回复,我已经想通了,差不多就是您说的意思

论坛徽章:
0
4 [报告]
发表于 2015-12-08 21:27 |只看该作者
通俗讲,如果c->page->objects大于0,则c->page->inuse为真,否则就为0了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP