免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2362 | 回复: 6

[内存管理] 关于slab的问题 [复制链接]

论坛徽章:
0
发表于 2012-05-24 09:40 |显示全部楼层
本帖最后由 zhuqing_739 于 2012-05-24 11:55 编辑

在网上找到了一段程序,是关于slab分配的,程序如下:
  1. #include <linux/module.h>  
  2. #include <linux/init.h>  
  3. #include <linux/kernel.h>   
  4. #include <linux/mm.h>  
  5. #include <linux/errno.h>  
  6. #include <linux/slab.h>  
  7. #include <linux/gfp.h>  
  8.   
  9. struct slab_test{  
  10.     int val;  
  11. };  
  12.   
  13. static int n;  
  14. struct kmem_cache *test_cachep = NULL;  
  15. struct slab_test *object1 = NULL, *object2 = NULL;  
  16.   
  17. void slab_ctor(void *cachep){  
  18.     printk("slab_ctor is called! object %d has been inited!\n", n);  
  19.     n++;  
  20. }  
  21.   
  22.   
  23. static int __init slab_test_init(void){  
  24.     printk("slab test module init\n");  
  25.     n = 0;  
  26.     test_cachep = kmem_cache_create("slab_test_cachep", sizeof(struct slab_test), 0, SLAB_HWCACHE_ALIGN, slab_ctor);  
  27.     if(!test_cachep)  
  28.         return -ENOMEM;  
  29.     object1 = kmem_cache_alloc(test_cachep, GFP_KERNEL);  
  30.     if(!object1)  
  31.         return -ENOMEM;  
  32.     else  
  33.         printk("object one has been created!\n");  
  34.     object2 = kmem_cache_alloc(test_cachep, GFP_KERNEL);  
  35.     if(!object2)  
  36.         return -ENOMEM;  
  37.     else  
  38.         printk("object two has been created!\n");  
  39.     return 0;  
  40. }  
  41.   
  42. static void __exit slab_test_exit(void){  
  43.     printk("slab test module exit\n");  
  44.     kmem_cache_free(test_cachep, object1);  
  45.     kmem_cache_free(test_cachep, object2);  
  46.     if(test_cachep)  
  47.         kmem_cache_destroy(test_cachep);  
  48. }  
  49.   
  50. module_init(slab_test_init);  
  51. module_exit(slab_test_exit);  
  52. MODULE_LICENSE("GPL");  
  53. MODULE_AUTHOR("embeddedlwp@163.com");
复制代码
我编译后加载,出现这个打印信息:
slab test module init
slab_ctor is called! object 0 has been inited!
slab_ctor is called! object 1 has been inited!
......
......
slab_ctor is called! object 501 has been inited!
slab_ctor is called! object 502 has been inited!
slab_ctor is called! object 503 has been inited!
slab_ctor is called! object 504 has been inited!
slab_ctor is called! object 505 has been inited!
slab_ctor is called! object 506 has been inited!
slab_ctor is called! object 507 has been inited!
object one has been created!
object two has been created!
然后我cat /proc/slabinfo 得到:
/mnt/3515 $ cat /proc/slabinfo                        
slabinfo - version: 2.1
# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
slab_test_cachep       2    508      4  508    1 : tunables  120   60    0 : slabdata      1      1      0
我想问一下,这个508什么意思?怎么会出来个508?奇怪。。。。。谢谢

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
发表于 2012-05-24 12:57 |显示全部楼层
回复 1# zhuqing_739


我写的啊??貌似很明显这个是object的数量啊,从0~507,是508个吧!


   

论坛徽章:
0
发表于 2012-05-24 14:33 |显示全部楼层
我的意思是怎么会爆出来个 508 ????????

论坛徽章:
0
发表于 2012-05-24 14:36 |显示全部楼层
{:3_190:}怎么不是其它的数呢??????????

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
发表于 2012-05-24 20:49 |显示全部楼层
这个确实不知啊,等kouu兄指点!

论坛徽章:
0
发表于 2012-05-28 10:20 |显示全部楼层
slabinfo 里面有:objperslab==508、pagesperslab=1
说明,slab里面object不足的时候最少分配一个page,而这个page分配之后会得到508个object。
至于为什么是508,这个就跟具体的机器情况、内核版本、编译选项、等有关了。大概猜测一下,机器应该是32位的,object大小是sizeof(int),4字节。由于带有ctor,每个object要额外带有一个sizeof(void*)作为空间链表中的next指针。那么一个object的大小就是8字节,508个object就是4064字节。还剩32字节,估计是保留空间,这个得根据具体内核版本和编译选项来解释了……

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
发表于 2012-05-28 19:58 |显示全部楼层
回复 6# kouu

lz的kernel很有可能用的已经是slub了,那么每个object的结构如下

gg.png

那么这个图里的object align是多大呢?


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP