Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
slab
slab内存分配器实现
发布于 2008-06-20 16:43:10 浏览:5425
订阅该版
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
回答
5948
被采纳
77
关注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
【RT-Thread】【ci】【scons】将ci.attachconfig.yml和scons结合使用
2
Rt-thread中OTA下载后,bootloader不搬程序
3
ulog 日志 LOG_HEX 输出时间改为本地日期时间
4
在RT-Thread Studio中构建前执行python命令
5
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
9
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
4
次点赞
Ghost_Girls
1
篇文章
7
次点赞
xiaorui
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部