内存管理机制

news2024/11/28 13:32:19

aCoral内存管理机制

aCoral内存管理机制在伙伴系统基础上,采用了位图法方式提高内存分配和回收速度的确定性,更能满足系统实时性的需求。

aCoral内存管理机制分为两级,上一级采用改进的伙伴系统,负责确定要分配的内存的大小,下一级根据上一级确定的大小进行具体物理内存分配。

  1. 因为第一级内存管理总会分配2N大小的内存,解决了系统外部碎片和内部碎片问题。
  2. 第二级采用了固定块和可变大小两种内存管理方式。
  3. 除内核外,应用程序一般直接使用第一级的伙伴系统。

aCoral第一级内存管理算法

在这里插入图片描述

真正的物理内存被分成了两部分,一部分由内存控制块结构所使用,内存初始化函数buddy_init()将逐个初始化这些结构。剩下的内存是用户可用内存。

这些内存被划分为众多基本块,每个基本块的大小通过常量BLOCK_SIZE配置,这些基本内存块是从0到n逐个标记的。这样内存的分配和回收都是基于序列的。

逻辑上这些内存块被组织成了m层,最大层数m通过LEVEL配置,第0层每个内存块大小为BLOCK_SIZE,第1层每个内存块大小为2*BLOCK_SIZE,到第n层内存块大小为BLOCK_SIZE<<n。

aCoral第二级内存管理算法

内存资源池存储管理

内存资源池管理属于固定大小内存管理系统,内存池中内存块的分配和回收是基于第一级内存管理系统的,因为内存池中的内存块时由第一级内存管理的。

内存池资源管理系统主要用于操作系统的一些常用结构的内存管理
例如,线程控制块TCB、事件控制块ECB等,这些结构在系统运行过程中,比如会用到,而且会频繁地建立和释放。

使用第一级管理系统当然可以满足这些需求,为什么还要用的内存资源池这种机制进一步管理这些结构,对其进行内存分配和回收呢?

虽然第一级内存管理算法单次分配和回收内存的效率已经很高,但是频繁地回收和释放还是要消耗一定的时间。如果可以事先分配一些常用结构大小的内存,并把他们组织起来形成内存资源池,那么当操作系统真正需要的时候只需要将这些指针返回即可。在操作系统使用完这些结构并且销毁时,就可以把这些结构所占用的内存还给内存资源池,而不用进行真正的内存回收。

在这里插入图片描述
每一类资源[如线程控制块TCB结构(aCoral定义了六种资源类型)]可以拥有多个资源池Pool,每个资源池只为一种类型的资源所使用(内存体现就是相同大小内存块)。

资源控制块Pool_ctrl负责一类资源的管理,一个资源池控制块会对应多个资源池,如图所示就包括两个资源池Pool1、Pool2。

开始的时候,系统会根据需要为每一类资源控制块(如TCB)分配一些资源池,一旦资源池的资源用完时,可以重新申请一个资源池,然后挂载到空闲资源池链表上。每个资源池对应一个Pool结构,这个结构有两个重要的指针base_adr和res_free,分别用来指向资源对象数组的基址和空闲资源对象,每个资源对象对应一个资源控制块,如线程控制块TCB。如果某资源池的资源对象都用完时,res_free会指向NULL。

typedef struct {
  unsigned int type;
  unsigned int size;            ///<size of one single resource eg.size of TCB
  unsigned int num_per_pool;    ///<the amount of resource in one pool eg.there are 20 TCBs in one TCB pool
  unsigned int num;             ///<the amount of pools which contain a certain type of resource(maybe TCB) in system at present will be added once one pool created; restrict by max_pools below;
  unsigned int max_pools;       ///<upbound of the amount of pools for this type. eg. the number of TCB pool limited to 2 because that there are at most 40 thread in system at one time and every TCB pool contains 20.
  acoral_list_t *free_pools;
  acoral_list_t *pools,list[2];
  unsigned char *name;
}acoral_pool_ctrl_t;
/**
 * @brief  资源池
*/
typedef struct {
   void *base_adr; ///<这个有两个作用,在为空闲的时候,它指向下一个pool,否则为它管理的资源的基地址
   void *res_free;
   int id;
   unsigned int size;
   unsigned int num;
   unsigned int position;
   unsigned int free_num;
   acoral_pool_ctrl_t *ctrl;
   acoral_list_t ctrl_list;
   acoral_list_t free_list;
}acoral_pool_t;

为了实现资源池的管理,aCoral定义了资源对象。

typedef union {
   int id; //资源ID,当资源池空闲时,ID的高16位表示该资源对象在资源池的编号
   int next_id;
}acoral_res_t;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

莫比乌斯召回系统介绍

当前召回系统只能召回相关性高的广告&#xff0c;但不能保证该广告变现能力强。莫比乌斯做了如下两点创新&#xff1a; 在召回阶段&#xff0c;引入CPM等业务指标作为召回依据在召回阶段&#xff0c;引入CTR模型&#xff0c;从而召回更多相关性高且变现能力强的广告 参考 百度…

【ROS】Ubuntu20.04+ROS Noetic 配置PX4-v1.12.2和Gazebo11联合仿真环境【教程】

【ROS】Ubuntu20.04ROS Noetic 配置PX4-v-v1.12.2和Gazebo11联合仿真环境【教程】 文章目录 【ROS】Ubuntu20.04ROS Noetic 配置PX4-v-v1.12.2和Gazebo11联合仿真环境【教程】0. 安装UbuntuROS1. 安装依赖2. 安装QGC地面站3. 配置PX4-v1.12.23.1 安装PX43.2 测试PX4是否成功安装…

大数据Flink(八十):Checkpoint的状态后端和重启策略

文章目录 Checkpoint的状态后端和重启策略 一、状态后端

第21章_瑞萨MCU零基础入门系列教程之事件链接控制器ELC

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

Django:二、模板、静态文件及请求相应

一、HTML 在app01中创建文件夹“templates”&#xff0c;在templates中创建HTML文件。 二、静态文件 创建静态文件夹&#xff0c;并把相关包导入 在HTML中引入Jquery等包&#xff0c;需要完成几步&#xff1a; 三、模板语法 1、字符串和列表 2、字典 3、if语句

TouchGFX之缓存位图

位图缓存是专用RAM缓冲区&#xff0c;应用可将位图保存&#xff08;或缓存&#xff09;在其中。 如果缓存了位图&#xff0c;在绘制位图时&#xff0c;TouchGFX将自动使用RAM缓存作为像素来源。位图缓存在许多情况下十分有用。 从RAM读取数据通常比从闪存读取要快&#xff08;特…

济南某类国企单位面试复盘

题目 背景1. 多线程有哪些基本参数&#xff1f;2. 线程池是如何实现的&#xff1f;3. ThreadLocal是怎么存的&#xff1f;4. JVM内存模型&#xff08;JDK1.8&#xff09;了解吗&#xff1f;5. 直接内存是用来存什么的&#xff1f;6.NIO采用的是Linux哪种IO模型7.常用的限流算法…

linux驱动开发--day4(字符设备驱动注册内部流程、及实现备文件和设备的绑定下LED灯实验)

一、字符设备驱动注册的内部过程 1.分配struct cdev对象空间 2.初始化struct cdev对象 3.注册cdev对象 二、注册字符设备驱动分步实现 1.分配字符设备驱动对象 2.字符设备驱动对象初始化 3.设备号的申请 4.根据申请的设备号和驱动对象注册驱动 三、open函数回调驱动中…

了解冒泡排序

package com.mypackage.array;import java.util.Arrays;public class Demo07 {public static void main(String[] args) {int[] a {3,2,6,7,4,5,6,34,56,7};int[] sort1 sort1(a); //调用我们自己写的排序方法后&#xff0c;返回一个排序后的数组System.out.println(Array…

密码学概述

密码学的概念 密码&#xff0c;最初的目的是用于对信息加密&#xff0c;计算机领域的密码技术种类繁多。但随着密码学的运用&#xff0c;密码还被用于身份认证、防止否认等功能上。密码是通信双方按约定的法则进行信息特殊变换的一种重要保密手段。依照这些法则&#xff0c;变…

5.k8s jenkins集成k8s一键发布案例

文章目录 前言一、jenkins配置1.1 jenkins配置git1.2 jenkins 配置maven1.3 jenkins配置java 二、jenkins流水线配置2.1.新增项目2.2 springboot项目配置git仓库2.3 springboot项目配置maven打包2.4 系统配置 ssh到hadoop1配置&#xff0c;也就是k8s的master节点2.6 springboot…

Handler原理

Handler原理 前言1. Handler作用2. Handler概述3. 核心类 一、Handler源码分析1.创建Handler2.发送消息3.取消息4.消息处理5.线程切换 二、相关内容1.Handler原理2.epoll机制2.1什么是epoll机制&#xff1f;2.2 select/poll/epoll2.3 Handler中epoll是如何实现消息队列的阻塞和…

誉天在线项目~ElementPlus Tag标签用法

效果图 页面展现 <el-form-item label"课程标签"><el-tagv-for"tag in dynamicTags":key"tag"class"mx-1"closable:disable-transitions"false"close"handleClose(tag)"style"margin:5px;">…

解决Custom EmptyStringException: The string is empty

解决Custom EmptyStringException: The string is empty 解决Custom EmptyStringException: The string is empty摘要引言正文1. 理解异常的根本原因2. 处理空字符串问题3. 用户输入验证4. 异常处理 总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&…

gitlab runner 不清理云端已经删除的tag和branch问题记录

在使用gitlab runner的过程中&#xff0c;发现由于git存储限制&#xff0c;不允许在a/b分支后创建a/b/c的分支。所以移除云端a/b分支后创建a/b/c分支。 但是由于gitlab runner出于拉取代码的速度考虑&#xff0c;将本地代码路径做了持久化缓存。 在上述场景中&#xff0c;新建…

Layui + Flask | 实现注册、登录功能(案例篇)(08)

此案例内容比较多,建议滑到最后点击阅读原文,阅读体验更佳。后续也会录制案例视频,将在本周内上传到同名的 b 站账号。 已经看了 layui 表单相关的知识,接下来就可以实现注册功能,功能逻辑如下: 项目创建 新建 flask 项目下载 layui 文件,解压之后复制到指定文件编写前…

算法--选择排序

算法步骤 /*** 选择排序** version 1.0* date 2023/09/01 17:57:05*/ public class Select {/*** 升序选择排序** param a 待排序的数组* date 2023/9/1 15:29:10*/public static void sortAes(int[] a) {//数组长度int length a.length;for (int i 0; i < length-2; i) {…

Web应用开发 - 实训三 B Servlet基础

Web应用开发 - 实训三 B Servlet基础 前言&#xff1a; 零、前期准备准备工具创建项目导入 jar 包配置运行设置 一、实训第一部分第一张图第二张图第三张图 二、实训第二部分第一张图第二张图 前言&#xff1a; eclipse 是不可能用的&#xff0c;并不是说它界面丑&#xff0c;…

Navicat导入Excel数据顺序变了

项目场景&#xff1a; Navicat导入Excel数据 问题描述 从Excel表格中导入数据到数据库中。但是&#xff0c;在导入的过程中&#xff0c;我们常会发现数据顺序出现了问题&#xff0c;导致数据错位&#xff0c;给数据的处理带来了极大的麻烦。 原因分析&#xff1a; 这个问题的…

【CVPR2020】DEF:Seeing Through Fog Without Seeing Fog论文阅读分析与总结

Challenge&#xff1a; 之前网络架构的设计假设数据流是一致的&#xff0c;即出现在一个模态中的对象也出现在另一个模态中。然而&#xff0c;在恶劣的天气条件下&#xff0c;如雾、雨、雪或极端照明条件&#xff0c;多模态传感器配置中的信息可能不对称。不同传感器在特征提取…