返回首页  设为首页  加入收藏  今天是:
网站首页电脑主板电脑cpu电脑内存电脑硬盘电脑显卡电脑电源显示器电脑配件电脑维修
相关文章
 RT-Thread内存管理算法源码阅…
 原神40内存条不能为read的解…
 现在3060显卡的电脑还能买吗…
 “分币不赚”的装机主播成了…
 40系显卡需要换主板吗 40系显…
 RTX 40系显卡性能提升多大 R…
 win10台式电脑双显卡如何切换…
 硬盘NTFS是什么意思什么叫NT…
 固态硬盘和机械硬盘哪一个寿…
 电脑机械硬盘装在哪(机械硬盘…
 宏碁优跃笔记本电脑发布 配备…
 上海人叫别人“硬盘”是什么…
 联想电脑售后怎么样?联想百…
 intel“你又跟我学有意思吗?…
 开关电源如何测量好坏?
 超高频D5内存价格创新低金百…
 MIUI125内测题目答案大全 申…
 MI2121 MI漏电开关测试仪
 清华同方19寸显示器
 清华紫光显示屏-清华紫光显示…
 清华同方报价大全【图解】
 激光代替光刻可降低超表面生…
 22年春节预算3000左右组装台…
 华擎推出三款全新纯白主板为…
 传说中的挖矿主板?映泰H81挖…
 英伟达人工智能概念股价飙升…
 5600cpu 6650xt显卡上什么主…
 华擎发布三款全白主板 带来更…
 电脑cpu转速调节(cpu转速怎么…
 cpu风扇转速多少_cpu风扇转速…
 CPU风扇转速调节怎么操作 CP…
 CPU风扇转速调节方法有哪些?…
 驱动人生科普电脑一直自动重…
 光威神策 DDR5-7200 内存上架…
 华为mate50pro内存运行多大 …
 英语一直在发展演化所以是先…
 苹果iPhone14内存是多少 可以…
 【视频】一加 Ace 2 Pro上手…
 ChromeOS游戏梦碎 谷歌取消支…
 人工智能最大赢家!NVIDIA H…
 售价25万起步 NVIDIA AI显卡…
 英伟达AI显卡供不应求:起售…
 想让黄仁勋降价 有多难!英伟…
 内存硬盘也能叫美团外卖?联…
 97名设计师集体离职一年后被…
 笔记本存储空间告急!固态硬…
 可以加密的移动硬盘 移动硬盘…
 闲置硬盘不要扔套上朗科WH51…
 联想笔记本电脑死机屏幕静止…
 联想新电脑有多次系统安装记…
专题栏目
网络
您现在的位置: 电脑评测网 >> 电脑内存 >> 正文
高级搜索
RT-Thread内存管理算法源码阅读
作者:佚名 文章来源:本站原创 点击数: 更新时间:2023/8/21 9:45:46 | 【字体:

  斜阳若影txt小内存管理算法是一个简单的内存分配算法。初始时,它是一块大的内存。当需要分配内存块时,将从这个大的内存块上分割出相匹配的内存块,然后把分割出来的空闲内存块还回给堆管理系统中。并有一个指针指向空闲内存块的第一个。

  每个内存块都包含一个管理用的数据头,而通过这个数据头和数据大小计算来偏移得到下一个内存块,本质上是通过数组的方式。

  每个内存块(不管是已分配的内存块还是空闲的内存块)都包含一个数据头,其中包括:

  1)magic:变数(或称为幻数),它会被初始化成 0x1ea0(即英文单词 heap),用于标记这个内存块是一个内存管理用的内存数据块;变数不仅仅用于标识这个数据块是一个内存管理用的内存数据块,实质也是一个内存保护字:如果这个区域被改写,那么也就意味着这块内存块被非法改写(正常情况下只有内存管理器才会去碰这块内存)。

  内存管理算法的初始化和删除比较简单,主要是对rt_small_mem​​和第一个内存块的初始化,以及对内核对象的操作。

  内存管理的表现主要体现在内存的分配与释放上,小型内存管理算法可以用以下例子体现出来。

  如下图所示的内存分配情况,空闲链表指针 lfree 初始指向 32 字节的内存块。当用户线 字节的内存块时,但此 lfree 指针指向的内存块只有 32 字节并不能满足要求,内存管理器会继续寻找下一内存块,当找到再下一块内存块,128 字节时,它满足分配的要求。因为这个内存块比较大,分配器将把此内存块进行拆分,余下的内存块(52 字节)继续留在 lfree 链表中,如下图分配 64 字节后的链表结构所示。

  另外,在每次分配内存块前,都会留出 12 字节数据头用于 magic、used 信息及链表节点使用。返回给应用的地址实际上是这块内存块 12 字节以后的地址,前面的 12 字节数据头是用户永远不应该碰的部分(注:12 字节数据头长度会与系统对齐差异而有所不同)。

  释放时则是相反的过程,但分配器会查看前后相邻的内存块是否空闲,如果空闲则合并成一个大的空闲内存块。

  RT-Thread 的 slab 分配器实现是纯粹的缓冲型的内存池算法。slab 分配器会根据对象的大小分成多个区(zone),也可以看成每类对象有一个内存池,如下图所示:

  一个 zone 的大小在 32K 到 128K 字节之间,分配器会在堆初始化时根据堆的大小自动调整。系统中的 zone 最多包括 72 种对象,一次最大能够分配 16K 的内存空间,如果超出了 16K 那么直接从页分配器中分配。每个 zone 上分配的内存块大小是固定的,能够分配相同大小内存块的 zone 会链接在一个链表中,而 72 种对象的 zone 链表则放在一个数组(zone_array[])中统一管理。

  其中在初始化时会初始化page_list​,相当于slab的内存池,每次分配都会从这个内存池当中进行分配。其中关于page的初始化、分配和释放和小内存管理算法是类似的,本质上都是使用数组和计算偏移的方式。具体可见rt_slab_page_init​、rt_slab_page_alloc​和rt_slab_page_free​。

  slab的初始化操作比较简单,仍然主要是对rt_slab​​结构进行初始化,以及初始化page_list​​以及memusage​​,memusage主要是用来标记page的大小以及类型。

  假设分配一个 32 字节的内存,slab 内存分配器会先按照 32 字节的值,从 zone array 链表表头数组中找到相应的 zone 链表。如果这个链表是空的,则向页分配器分配一个新的 zone,然后从 zone 中返回第一个空闲内存块。如果链表非空,则这个 zone 链表中的第一个 zone 节点必然有空闲块存在(否则它就不应该放在这个链表中),那么就取相应的空闲块。如果分配完成后,zone 中所有空闲内存块都使用完毕,那么分配器需要把这个 zone 节点从链表中删除。

  其次就是计算当前size应该放入哪个zone,由zoneindex​进行计算

  分配器需要找到内存块所在的 zone 节点,然后把内存块链接到 zone 的空闲内存块链表中。如果此时 zone 的空闲链表指示出 zone 的所有内存块都已经释放,即 zone 是完全空闲的,那么当 zone 链表中全空闲 zone 达到一定数目后,系统就会把这个全空闲的 zone 释放到页面分配器中去。

  如果是前面所述的特大内存,那就直接使用rt_slab_page_free​释放。

  memheap​管理算法适用于系统含有多个地址可不连续的内存堆。使用memheap​内存管理可以简化系统存在多个内存堆时的使用:当系统中存在多个内存堆的时候,用户只需要在系统初始化时将多个所需的memheap​初始化,并开启memheap​功能就可以很方便地把多个memheap​(地址可不连续)粘合起来用于系统的 heap 分配。

  除了包含基本信息外,rt_memheap​当中主要包含着一个链接所有内存块的block_list​和链接所有空闲内存块的free_list​,而rt_memheap_item​也主要围绕这两个结构,主要是指向前后两个块和前后两个空闲块。此外,rt_memheap​还有用来处理并发的信号量。

  memheap 工作机制如下图所示,首先将多块内存加入 memheap_item 链表进行粘合。当分配内存块时,会先从默认内存堆去分配内存,当分配不到时会查找 memheap_item 链表,尝试从其他的内存堆上分配内存块。应用程序不用关心当前分配的内存块位于哪个内存堆上,就像是在操作一个内存堆。

  这在RT-Thread真正的实现当中,主要是依靠内核对象完成的。首先heap参数是由上层封装的另一个接口传入的系统heap(在后面会讲解),所以实现多内存堆主要依靠遍历内核对象(memheap​在初始化会加入内存对象链表)获取每一个内存堆并尝试内存分配。

  对于memheap​的初始化和前两个管理算法是类似的,都比较简单,主要是对rt_memheap​的初始化和block_list​和free_list​的初始化,以及对内核对象的操作。

  如果当前整个memheap​的可用内存都不够大,则直接返回RT_NULL​交由上层处理

  如果这个内存块的大小超过了一个item​结构+要求分配的内存大小+最小可分配的内存块大小

  那么就切割这个内存块,主要就是对prev​和next​指针的链表操作。在free_list​中删除新分配的内存块,并加入切割出来的内存块

  因为RT-Thread支持多种内存管理算法,所以必须有一个统一的上层抽象,其中主要由rtconfig.h​以及中的宏来控制使用哪种算法

电脑内存录入:admin    责任编辑:admin 
  • 上一个电脑内存:

  • 下一个电脑内存: 没有了
  •  
     栏目文章
    普通电脑内存 RT-Thread内存管理算法源码阅读 (08-21)
    普通电脑内存 原神40内存条不能为read的解决方法 40内存条不… (08-21)
    普通电脑内存 光威神策 DDR5-7200 内存上架:海力士 A-Die … (08-20)
    普通电脑内存 华为mate50pro内存运行多大 昆仑玻璃版本值得… (08-20)
    普通电脑内存 英语一直在发展演化所以是先进的语言? (08-20)
    普通电脑内存 苹果iPhone14内存是多少 可以拍摄4K 60 fps视… (08-20)
    普通电脑内存 【视频】一加 Ace 2 Pro上手24GB超大内存的满… (08-20)
    普通电脑内存 苹果M3芯片Mac电脑将淘汰8GB内存 (08-20)
    普通电脑内存 一加Ace 2 Pro评测:内存比电脑大 真值得入手… (08-20)
    普通电脑内存 为什么手机和电脑内存实际比标注都要小?这是… (08-20)
    普通电脑内存 消息称苹果M3芯片Mac电脑将淘汰8GB内存各版本… (08-20)
    普通电脑内存 苹果M3芯片的Mac电脑将淘汰8GB内存你准备好了… (08-20)
    普通电脑内存 消息称西数6月11日为Xbox推出512GB和1TB两种规… (08-19)
    普通电脑内存 “手忙脚乱的、忙碌的”英语可以这么说英语听… (08-19)
    普通电脑内存 内存用英文怎么表示 计算机内存器和外存储器的… (08-19)
    普通电脑内存 内存的英文(内存的英文名) (08-19)
    普通电脑内存 IT干货 如何开启内存超频? (08-19)
    普通电脑内存 华为MateBook系列众多新品开售 升级32GB大内存 (08-19)
    普通电脑内存 线GB内存时代 (08-19)
    普通电脑内存 Ace2 Pro首发24GB内存 一加员工:用了就回不去 (08-19)