文章目录
LiteOS_华为云
- 为何会有 IPC 初始化?IPC 通信不应该是基础内核部分?
- slab 算法和 LiteOS 中使用的 slab 的区别?
内核架构
LiteOS 包括不可裁剪的极小内核和其它模块,支持在单核(UP)和多核(SMP)上运行。
内存管理
+ 提供静态内存和动态内存两种算法,支持内存申请、释放。目前支持的内存管理算法有固定大小的BOX算法、动态申请的bestfit算法和bestfit_little算法。
+ 提供内存统计、内存越界检测功能。
调测
检测的内存问题包括缓冲区溢出(buffer overflow),释放后使用(use after free),多重释放(double free)和释放野指针(wild pointer)。
启动流程
初始化过程主要围绕极小内核完成,内存、任务、时钟、中断和异常。直至开启系统时钟和任务调度后,初始化工作完成。
内存管理
内存利用率、使用效率、内存碎片
-
静态内存管理:在静态内存池中分配用户初始化时预设的固定大小的内存块;
- 分配和释放效率高,静态内存池中无碎片?;
- 只能申请到预设大小的内存块,不能按需申请;
-
动态内存管理:在动态内存池中分配用户指定大小的内存块;
- 按需分配;
- 容易产生外部碎片;
动态内存运行机制
内存管理算法:
- bestfit
- bestfit_little
bestfit 算法
- 一、堆内存(内存池)的起始地址及大小;
- 二、数组(每个元素为双向链表的free节点控制头,链表上的元素为 used节点)每次申请内存的时候,会从这个数组检索最合适大小的free节点以分配内存。每次释放内存时,会将该内存作为free节点存储至这个数组以便下次再使用;
- 三、存放各节点的实际区域,占用极大空间;
节点在内存中的位置如何记录?
保证数据空间首地址能够满足对齐要求,通过增加 Gap 域? 确保返回的指针符和对齐要求。
bestfit_little算法
bestfit_little = bestfit(选择内存池中最小最合适的内存块进行分配) + slab(用于分配固定大小的内存块,减少产生内存碎片的可能性)
slab:把不同对象划分为高速缓存组,每个对象对应一个高速缓存,slab 由一个或者多个物理上连续的页组成。
- 减少伙伴算法在分配小块内存时所产生的碎片;
- 将频繁使用的对象缓存起来,减少分配、初始化和释放的开销;
- 通过着色技术调整对象更好地使用硬件高速缓存;
可以配置 slab class 数目以及每个 class 的大小。
首先按照 best_fit 算法申请 4 个 slab class,每个slab class 512 字节。
- 第一个slab class被分为32个16字节的slab块;
- 第二个slab class被分为16个32字节的slab块;
- 第三个slab class被分为8个64字节的slab块;
- 第四个slab class被分为4个128字节的slab块;
现在申请 20 字节,会在 32 字节的 slab 块中寻找,如果成功,则将 slab 块返回给用户,释放时整块回收。
如果32字节的slab块中没有可分配的内存块,那么从内存池中按照最佳适配算法申请,而不是从更大的slab块中申请。释放时,检查是否属于 slab class,如果是则还回对应的 slab class 中,否则还回内存池中。
静态内存运行机制
实质是一个静态数组,静态内存池内的块大小在初始化时设定,初始化后块大小不可变更。
静态内存池有一个控制块和若干相同大小的内存块构成。