Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
slab
slab内存分配器实现
发布于 2008-06-20 16:43:10 浏览:5366
订阅该版
slab内存分配器[DragonFlyBSD版本] DragonFlyBSD的内核内存分配采用了slab分配器,相应的代码文件是kern_slaballoc.c和slaballoc.h。 1、slab内存分配器把内存划分为小内存分配和大内存分配,两者的策略并不相同。 2、代码中的slab结构 根据系统总的内存大小,选择合适的zone大小(每个zone的大小都是相同的,一般为2^n个page) 对于一个特定的zone,在上面分配的chunk大小是固定的(即zone中,除了zone本身结构体中占用的大小外,剩余的内存被划分为相同大小的chunk,chunk即通常意义上分配出去的内存块) 而不同chunk大小的zone放在一个zone数组链表中管理,zone数组一般是128, 256, 512, 1024, 2048...chunk大小的zone方式排列。 zone结构中包括:chunk size,freed chunk,UIndex及UEndIndex(初始时UIndex指向第一个chunk), UIndexMax等 3、小内存分配: 当需要分配一块大小为size的小内存时, 分配器先根据size获得是哪种zone,然后取zone数组链表的表头,如果存在: 先检查是否有freed chunk,如果有分配之,否则分配UIndex,并把UIndex指向下一个项(如果UIndex到达UEndIndex,那么表示这个zone中的chunk已经分配完毕,需要把这个zone从zone数组链表中移除) 如果zone数组链表表头是空,那么需要新分配一块zone空间(先在系统的freed zones链表中查找是否有空闲zone,否则采用大内存分配策略),把它的第一块chunk分配出去并把新分配的zone放到zone数组链表中维护。 4、小内存释放 根据是否小内存地址获得相应zone的地址(因为zone的分配是zone对齐的),把小内存放到freed chunk链表中,如果freed chunk链表数目达到这个zone中最大chunk数目时(意味着这个zone是全部空闲的),把这个zone放到freed zones链表中。如果freed zones链表的数目超过一定数值时(例如2),把多余的空闲zone给释放掉(通过大内存释放方式) 5、大内存分配释放策略 直接按照page的整数倍进行分配释放; 大内存分配、释放需要考虑的一个问题:当需要释放一块内存时,如何知道这块内存是大内存还是小内存? 方法:用一个kmemusage数组记录每个page的使用方式(如果1GB内存,需要1M空间记录其状态)。大内存分配时,需要在kmemusage相应项中记录使用了多少个page数,释放时再把这个page数清为零。 6、多核的考虑 zone列表在每个CPU的存放一份,释放时,如果释放了另一CPU管理的chunk,可以通过发消息的形式给此CPU然后由此CPU释放掉。 7、slab算法的体现 slab分配的object即chunk,释放后将先保存在相应zone的freed chunk列表中,这样就实现了object的cache。 但对于在对象分配时进行对象自动构造,此功能似乎不在DragonFlyBSD代码中。
查看更多
1
个回答
默认排序
按发布时间排序
撰写答案
登录
注册新账号
关注者
0
被浏览
5.4k
关于作者
bernard
这家伙很懒,什么也没写!
提问
414
回答
5939
被采纳
76
关注TA
发私信
相关问题
1
slab内存管理malloc fail
2
内存管理slab算法中的疑问
3
slab动态内存管理中关于void*的用法
4
请教一个问题,slab内存管理算法可以完全避免内存碎片吗
5
关于rt_alloc(SLAB)函数的问题
6
关于SLAB动态内存管理的问题
7
SLAB内存分配与释放问题
8
[已解决]使用slab管理heap时,rt_malloc分配失败
9
slab.c BUG in rt_system_heap_init
10
[slab]偶现malloc/free时崩溃,定位到slab.c
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
TinyUSB Demo运行教程
2
RT-Thread学习大礼包一键带走!
3
freemodbus从机调试说明
4
【1024】瑞萨 RA 系列 BSP 制作与适配最新版本的 Keil 、 RSC、固件,较新的 FSP
5
基于 RT-Thread 星火一号开发板的俄罗斯方块
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
cubemx
PWM
flash
packages_软件包
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
用户名由3_15位
10
个答案
1
次被采纳
KunYi
4
个答案
1
次被采纳
踩姑娘的小蘑菇
2
个答案
1
次被采纳
bernard
1
个答案
1
次被采纳
rv666
1
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
4
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部