这三种内存管理算法你知道吗?
本文分享自中移OneOS公众号《内存管理》。
根据应用程序需求和系统资源的差异,操作系统提供了不同的内存分配管理算法,分别是小内存管理算法、slab管理算法和memheap管理算法。
小内存管理算法主要针对系统RAM空间比较少的情况,一般用于小于2MB内存空间的系统,也是使用最广泛的内存管理算法。
slab内存管理算法则主要是在系统RAM空间比较丰富的情况,提供了一种近似内存池分配的快速算法。
memheap算法则用于系统存在多个内存堆的情况,它可以将多个内存连接在一起,形成一个大的内存堆,应用程序使用时感知不到多个内存堆的存在。
这几类内存堆管理算法在系统运行时只能选择其中之一或者完全不使用,他们提供给应用程序的API接口完全相同。
小内存管理算法
在小内存管理算法中,使用内存块的形式管理。
每个内存块都包含一个数据头,通过数据头把内存块用双向链表的方式连接起来,不论使用块或者空闲块都在同一个链表中管理。内存块的数据头数据结构定义如下:
struct os_heap_mem { os_uint16_t magic; /*魔数*/ os_uint16_t used; /*使用标识*/ os_size_t prev; /*指向前控制块的指针*/ os_size_t next; /*指向后控制块的指针*/ };
其中,next和prev用于双向链表的连接,magic是魔数,系统使用0x1ea0标识内存管理块的头部,同时通过该值可以检测内存非法改写的问题,如果该值变化即表示内存被非法写。used表示该内存块的分配状态。
内存管理的表现主要体现在内存的分配与释放上,分配内存时从空闲内存指针位置开始遍历,当找到一块足够大小内存块时,根据情况进行分割,前半部分返回给调用程序使用,分割后剩余的部分继续插入链表中。
下面举例说明申请内存的过程,空闲链表free指针指向64字节的内存块,当调用分配函数申请一个512字节的内存块时,64字节的内存不足,内存管理器开始遍历内存块,next指针指向的下一块内存头部的used为1已经被使用;查找到下一块未使用的内存并且大小为1024字节,满足请求大小,管理器使用分割功能,将申请的512字节加上12字节头部空间分成前半部分,used标记为已使用返回给应用;剩余的512字节空间,前面12字节用于数据头,剩余500字节用于数据体,used标记为0,并且插入双向链表中,如下图。
<内存分配示意图>
释放内存是相反的过程,内存管理器会查看前后相邻的内存块是否空闲,如果空闲则合并成一个大的空闲内存块,防止系统长时间运行后形成内存碎片。
slab管理算法
slab是一个缓冲型的内存池算法。slab分配器是由多个区来管理内存,每一个区对应一类占用空间大小不同的对象,系统最多支持72种对象。
一个zone的大小在32K到128K字节之间,系统初始化时根据堆的大小自动调整。slab管理器一次最大能够分配16K的内存空间,如果超出了16K那么直接从页分配器中分配。每个zone上分配的内存块大小是固定的并且使用链表进行管理,而72种对象的zone链表则放在一个数组中统一管理,如下图。
<slab管理结构>
下面举例说明内存申请的过程,假设分配一个16字节的内存,slab内存分配器从zone array链表表头数组中找到对应的zone链表。如果链表为空,则向页分配器分配一个新的zone,然后从zone中返回第一个空闲内存块。如果链表非空,则链表中的第一个节点必然有空闲块存在,取相应的空闲块返回。如果分配完成后,此zone中所有空闲内存块都使用完毕,分配器会把这个zone节点从链表中删除。
内存释放时,分配器遍历zone_array,找到内存块所在的zone节点,然后把内存块连接到zone的空闲内存块链表中。如果此时zone的空闲链表中所有内存块都已经释放,当zone链表中全空闲zone达到一定数目后,系统就会把这个全空闲的zone释放到页面分配器中去。
memheap管理算法
如果系统含有多个地址不连续的内存堆,前面两种管理算法就不适用,操作系统提供了memheap管理算法解决这种场景。
如果指定使用该算法,在系统初始化时,就可以将多片不连续的内存加入memheap管理链表。当需要分配内存时,分配器首先从默认memheap中查找是否有剩余空间可用,如果有直接分配返回,如果已经不足分配则遍历链表,直到找到足够分配的memheap,从这里分配内存返回给应用。应用不需要关心从哪里分配的内存,简化了使用。
释放内存的过程类似,遍历链表查找到内存地址所在的memheap,释放地址空间。
内存管理接口设计如下:
(1)初始化内存堆
(2)分配内存块
(3)释放内存块
(4)重分配内存块
(5)分配多个内存块
(6)内存分配回调函数
(7)内存释放回调函数

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
StarRocks极客营:技术大牛带你推开数据库梦想之门!
操作系统、编译器、数据库是软件工程师的梦之所向,对于大多数人而言,却是近在眼前、远在天边: 你是否曾渴望加入 Linux 这样伟大的社区,然觉门槛太高无从下手? 你是否也曾想象参与开发 MySQL 这样顶级的项目,可融入无门? 你是否梦想让自己的代码为更多人所用,苦于孤军奋战、条件不足? 在StarRocks 社区, 实现梦想并没有想象中那么难! StarRocks 极客营, 专为数据库领域的开发爱好者而打造, 在 16 天内挑战不同难度的开发实战, 真枪实干,不玩虚的! 隐藏在社区中的极客们, 春天到了,露一手! ●活动亮点● 总有一款适合你! StarRocks 社区选取Execution Engine、Storage Engine、Data Lake Analysis、Ecosystem、Loading、Observability、Planner、Usability 8 个方向,开放了 34 个开发任务,难度分为挑战级、中等、简单三档。无论你是新手开发者、进阶攻城狮、资深技术专家,此次活动的开发任务,总有一款适合你。通过本次极客营,你将对 OLAP 技术有更加深入的了解和洞察,助...
- 下一篇
社区分享丨雪花啤酒的JumpServer堡垒机使用体会
编者注:2022年1月,JumpServer开源社区与雪花啤酒(成都)有限公司的王工就堡垒机使用的话题进行了在线访谈。以下内容根据本次访谈的内容整理而成。 华润雪花啤酒成立于1993年,总部位于北京,省级公司覆盖全国,下辖70间啤酒酿造厂。2020年,华润雪花啤酒国内市场占有率超过30%,年销售总量达到了超过1110万千吨,年产能超过1800万千吨。近年来,华润雪花啤酒相继启动品牌重塑、产能优化、营运变革、信息化升级等举措,构建高端品牌矩阵。除雪花啤酒品牌外,公司还发力高端品牌,陆续收购了喜力、苏尔、红爵、虎牌等国外知名品牌,业务规模持续扩大。 作为一家全国性的专业啤酒公司,华润雪花啤酒一直严格遵循相关的信息安全标准。无论是在总部层面,还是下辖分支机构,对于相关IT资产都会进行规范的运维安全审计操作。华润雪花啤酒四川有限责任公司(以下简称为雪花啤酒四川公司)是华润雪花啤酒在成都成立的一家区域公司,拥有成都、绵阳、德阳、内江、乐山、南充、广安、遂宁、凉山等9家啤酒生产工厂,产品覆盖西南地区。 目前,雪花啤酒四川公司的内部IT资产通过JumpServer开源堡垒机进行运维安全审计。在使用J...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- 设置Eclipse缩进为4个空格,增强代码规范
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- MySQL8.0.19开启GTID主从同步CentOS8