6.2 静态内存分配模式

news2024/9/22 5:41:23

Bruce Powel Douglass大师介绍-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/ChatCoding/article/details/134665868

嵌入式软件开发从小工到专家-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/ChatCoding/article/details/135297955

C嵌入式编程设计模式源码-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/ChatCoding/article/details/134819019

静态分配模式只适用于负载(内存量)高度可预测且稳定的简单系统。在适用的情况下,使用这种模式可以使系统易于设计和维护。

6.2.1 摘要

动态内存分配在实时嵌入式系统中存在两个主要问题:

  • 内存分配和释放的时间不确定。
  • 内存碎片化。

这种模式采用了一种非常简单的方法来解决这两个问题:禁止动态内存分配。这意味着所有对象都在系统初始化期间分配。如果设计时能够知道内存负载,并且能够为最坏情况分配足够的内存,那么系统虽然初始化时间会长一点,但运行时将更加稳定高效。

6.2.2 问题

动态内存分配在结构化和面向对象设计中非常普遍。例如,C++ 语言使用 newdelete 来分配和释放内存,C 语言则使用 mallocfree。在这些语言中,程序员都需要显式执行这些操作,但也很难想象任何大型程序不使用分配内存的指针。而 Java 语言更加彻底,所有对象都存放在动态内存中,这意味着所有对象创建都隐式地使用了动态内存分配。此外,Java 还会在内存不再使用时自动释放它,但具体何时何地发生则不在程序员的控制范围内。

尽管很常见,动态内存分配始终是让实时系统开发疼痛的问题,主要有以下三个难题:

  • 非确定性:动态内存分配和释放的时机通常是不可预测的,因为这通常需要搜索数据结构以找到可分配的空闲内存。这会导致系统的行为难以预测,甚至出现不可预料的延迟或中断。
  • 内存泄漏:如果程序员没有正确释放不再使用的内存,就会发生内存泄漏。这会导致系统内存的逐渐减少,最终导致系统崩溃。
  • 内存碎片化:由于内存是以不同大小的块分配的,释放顺序通常与分配顺序无关。这会导致空闲内存出现碎片化,即无法找到足够大的连续空闲内存块来满足新的内存请求。

上述三个难题都可能导致实时系统出现严重的性能问题或甚至崩溃。因此,在实时系统中,应尽量避免使用动态内存分配。

6.2.3 模式结构

图 6-1 展示了该模式的基本结构。它结构非常简单,但可以通过嵌套抽象层来处理任意大小的系统。系统对象启动初始化过程,并创建最高级别的复合对象。这些复合对象通过组合关系连接到其他复合对象或原始对象。原始对象被定义为不会动态创建其他对象的类。使用组合关系是因为它们清晰地标识了创建/删除的责任。

6.2.4 协作角色

  • Allocation Plan(分配计划):如果存在,标识最大系统复合对象应该按照哪个顺序分配。
  • Composite Object(复合对象):复合对象通过组合关系负责创建它所拥有的所有对象。

分配计划

分配计划(Allocation Plan)是可选的,用于指定最大系统复合对象的分配顺序。如果没有分配计划,则系统可以按任何所需的顺序分配对象。

复合对象

复合对象(Composite Object)是指与其他对象之间存在组合关系的对象,其他对象可以是复合对象或原始对象。复合对象负责通过组合创建它所拥有的所有对象。复合对象和系统对象都不能释放内存。

复合对象可以由其他复合对象组成,但每个通过组合关系拥有的对象只能属于一个复合对象。这意味着模式中清楚地标识了系统中每个对象的创建责任。

部件对象

部件对象(Part Object)是复合对象和原始对象的父类。它允许系统对象和复合对象通过组合包含复合对象和原始对象。

原始对象

原始对象(Primitive Object)是指不负责分配任何其他对象的类。所有原始对象由复合对象创建。

系统对象

系统对象(System Object)是系统中最高抽象层级的对象。它的职责是通过创建和初始化系统的主要部分(最高级别的复合对象)来“启动”系统。这些复合对象又会创建自己的部分,依此类推。一旦所有对象都创建完毕,系统对象就会通过运行 begin 操作启动系统执行。

6.2.5 结果

静态分配模式将所有对象都在系统启动时进行内存分配,适用于以下情况:

  1. 最坏情况可预测且内存充裕: 系统的峰值内存需求是已知且可控的,并且拥有足够的内存满足这种情况。
  2. 内存负载稳定: 系统在不同运行状况下的内存需求差异不大,保持相对稳定的内存占用。
  3. 系统规模较小: 需要预先分配所有对象内存的特点限制了系统规模,适合用于较小的系统。
  4. 对内存成本不敏感: 系统对内存成本相对不敏感,预先分配内存造成的潜在浪费可以承受。

使用静态分配模式的系统拥有以下优势:

  • 更快的运行速度: 启动后执行代码无须进行动态内存分配,运行速度通常比动态分配更快,有时显著更快。
  • 更可预测的执行: 消除了动态分配带来的非确定性因素,使系统运行更加可预测。
  • 无内存碎片化: 不进行内存释放,就不会出现内存碎片化的问题。

然而,静态分配模式也存在一定的缺点:

  • 启动时间较长: 需分配所有对象内存,导致启动时间可能明显延长,对启动时间要求苛刻的系统可能不适用。
  • 潜在内存浪费: 预先分配所有对象内存可能造成一定程度的浪费,如果实际内存需求低于最坏情况,则会占用额外的内存空间。

总结: 静态分配模式适用于最坏情况可预测、内存负载稳定、规模较小且对内存成本不敏感的系统。它能带来更快的运行速度、更可预测的执行和无碎片化等优势,但需要付出启动时间较长和潜在内存浪费的代价。

6.2.6 实施策略

这个模式非常容易实现。在许多情况下,甚至不需要单独的初始化方法,可以直接使用每个复合对象的构造函数来完成对象的创建和初始化。

6.2.7 相关模式

本章中介绍的其他模式也解决了类似的问题,但会带来略有不同的利弊。例如,池分配模式、固定大小缓冲区模式、垃圾回收器模式和垃圾压缩器模式等等。

6.2.8 示例模型

图6-2展示了一个使用完全构建系统实例的简单例子。图6-2a展示了对象图的实例结构,图6-2b展示了静态分配模式在启动时的工作方式。

总结来说,静态分配模式通过在系统启动时分配所有对象,避免了动态内存分配带来的时间不确定性和内存碎片化问题。这种模式适用于内存负载可预测、系统设计简单且内存成本不是主要考虑因素的情况。在实施时,需要在设计阶段对内存需求有准确的预测,以确保在最坏情况下有足够的内存。

图形中各个箭头的含义

  • 实线箭头:代表对象之间的组合关系

图形中各个对象的含义

  • 起搏器对象(Pacemaker Object):这是整个起搏器设备的总称。
    • 电池系统(Battery Subsystem):为起搏器提供动力。
      • 电池传感器(Battery Sensor):监测电池的电压,并在电池电量不足时向起搏器发出警报。
    • 通信子系统(Comm Subsystem):允许起搏器与外部设备(如程序器和监控系统)进行通信。它使用无线遥测系统来传输和接收数据。
      • 磁簧开关(Reed Switch):检测起搏器是否置于磁场中。这可用于激活起搏器的某些功能,例如遥测。
      • 消息队列(Message Queue):用于存储由通信子系统传输或接收的数据。
      • 收发器线圈(Transceiver Coil):用于无线传输和接收数据。
    • 起搏子系统(Pacing Subsystem):起搏器的核心
      • 心房(Atrial Chamber):心脏的上腔。
        • A 心脏传感器(A Heart Sensor):监测心房的电活动。
        • A 起搏电容器(A Pacing Canacitor):为起搏电路存储能量。
      • 心室(Ventricular Chamber):心脏的下腔。
        • V 心脏传感器(V Heart Sensor):监测心室的电活动。
        • V 起搏电容器(V Pacing Capacitor):为起搏电路存储能量。

起搏子系统(Pacing Subsystem):起搏器的核心,负责生成电脉冲来刺激心肌。它由起搏电路、起搏电极和起搏电容器组成。

  • 起搏电路(Pacing Circuit):生成电脉冲。
  • 起搏电极(Pacing Electrode):将脉冲传递给心肌。
  • 起搏电容器(Pacing Capacitor):为起搏电路存储能量。

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

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

相关文章

STM32单片机基本原理与应用(四)

直流电机驱动控制原理 1、电机正反转控制 在STM32中,直流电机的正反转控制主要通过改变电机输入电源的极性来实现。当电机的电压极性发生变化时,电机的旋转方向也会相应改变。在硬件电路中,可以通过继电器或晶体管等电子开关来切换电机的电源…

消息中间件RabbitMQ介绍

一、基础知识 1. 什么是RabbitMQ RabbitMQ是2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,简称MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法,由Erlang(专门针对于大…

【Tomcat与网络4】Tomcat的连接器设计

目录 1 如何设计一个灵活可靠的连接器 2 主要组件介绍 在上一篇,我们介绍了Tomcat提供服务的整体结构,本文我们一起来看一下Tomcat的连接器的设计。 在前面我们提到Tomcat主要完成两个功能: 处理 Socket 连接,负责网络字节流与…

中国的茶文化:现代生活中的茶文化

中国的茶文化:现代生活中的茶文化 引言 在现代社会的快节奏生活中,茶文化并未随时间流逝而褪色,反而以其独特的方式融入了全球各地人们的日常生活。它超越了饮品本身的范畴,成为一种连接历史、人文与现代生活方式的艺术形式。本文…

VRRP负载平衡

1.构图 2.实验 2.1如图提示配置pc1-pc4 掩码:255.255.255.0网关均设置为192.168.1(\2).254 2.2配置sw1-sw2 [sw1]port-group 1 //创建接口组,组号是1[sw1-port-group 1]group-member gigabitethernet 0/0/1 to gigabitethernet 0/0/3 //添加组成员,从…

Unity 设置鼠标

前言 本章主要对鼠标图标样式还有鼠标显隐进行设置 图标样式的设置 代码控制 有时候需要有改变鼠标样式的需求可以使用如下代码 Cursor.SetCursor(this.mouseTexture, Vector2.zero, CursorMode.Auto); 传入的要替换的图标偏移量允许您在支持的平台上使用硬件光标&#xff0…

【Javaweb】【C00157】基于SSM的宠物护理预定系统(论文+PPT)

基于SSM的宠物护理预定系统(论文PPT) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的宠物护理预订系统 本系统分为前台系统模块、后台管理员模块以及后台会员用户模块 其中前台系统模块:当游客打开系统的网址后&…

《Lua程序设计》-- 学习9

迭代器和泛型for 迭代器和闭包 迭代器(iterator)是一种可以让我们遍历一个集合中所有元素的代码结构。在Lua语言中,通常使用函数表示迭代器:每一次调用函数时,函数会返回集合中的“下一个”元素。 一个闭包就是一个…

万户 ezOFFICE SendFileCheckTemplateEdit.jsp SQL注入漏洞

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

C++/MFC:在窗体Form(Dialog)中多个编辑框时,在输入时将回车解释为TAB键,将输入焦点移到下一个编辑框的方法

很多时候,为了输入方便,常用的做法,就是将回车键解释为将输入焦点移动到下一个编辑框中。就像是我的VxTerm中的快速连接输入一样: VxTerm是一个国产化替代的SSH工具,可以从本站的资源中免费下载并且免费使用&#xff…

移动端基础:rem适配布局

rem单位 rem是相对单位,类似于em 但rem的基准是相对于HTML元素的字体大小 rem的优点是可以通过修改HTML文字大小改变页面元素大小,做到整体控制 媒体查询 使用media查询,可以针对不同的媒体类型定义不同的样式 可以针对不同的屏幕尺寸设…

大模型重塑车载语音交互:赛道巨头如何引领新周期?

车载语音交互赛道正进入新一轮竞争周期。 高工智能汽车注意到,传统车载语音交互赛道当前基本已进入成熟期,主要为任务型助手,包括从单轮对话到多轮对话,单音区到多音区,从单一的导航、多媒体娱乐等座舱功能扩展智能驾…

[嵌入式系统-6]:龙芯1B 开发学习套件 -3-软件层次架构

目录 一、龙芯软件架构 1.1 通用软件架构 1.2 龙芯软件架构 1.3 龙芯各种应用程序 1.4 龙芯SOC芯片硬件:龙芯1B 1.5 PMON软件 1.6 龙芯IDE管辖的软件 (1)CPU Core驱动程序 (2)SOC芯片外设驱动程序 &#xff…

人工智能(pytorch)搭建模型23-pytorch搭建生成对抗网络(GAN):手写数字生成的项目应用

大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型23-pytorch搭建生成对抗网络(GAN):手写数字生成的项目应用。生成对抗网络(GAN)是一种强大的生成模型,在手写数字生成方面具有广泛的应用前景。通过生成…

Adobe Camera Raw forMac/win:掌控原始之美的秘密武器

Adobe Camera Raw,这款由Adobe开发的插件,已经成为摄影师和设计师们的必备工具。对于那些追求完美、渴望探索更多创意可能性的专业人士来说,它不仅仅是一个插件,更是一个能够释放无尽创造力的平台。 在数字摄影时代,R…

数据结构——栈和队列(C语言)

栈种常见的数据结构,它用来解决一些数据类型的问题,那么好,我来带着大家来学习一下栈 文章目录 栈对栈的认识栈的模拟实现栈的练习方法一方法二 栈 对栈的认识 栈(stack)是限定只能在表的一端进行插入删除操作的线性…

苍穹外卖项目可以写的简历和如何优化简历

文章目录 重点写中规写添加自己个性的项目面试会问道的问题 我是一名双非大二计算机本科生,希望我的分享对你有帮助,点赞关注不迷路。 简历编写一直是很多人求职人的心病,我自己上学期有一门课程是去校内企业面试,当时我就感受出…

性能脚本设计

性能脚本设计 目标 - 性能脚本设计技巧 1. 为什么要设计性能脚本? 1.1 需求 100虚拟用户对(查询学院-所有)接口测试,以每秒启动10个用户,统计服务器平均响应时间和错误率1.2 问题 100虚拟用户请求服务器的时候,如何统计服务器响应时间和…

Unity_Timeline使用说明

Unity_Timeline使用说明 首先要找到工具吧?Unity2023.1.19f1c1打开如下: (团结引擎没找见哪儿打开,可能是引擎问题吧?有知道的同学可以告诉我在哪儿打开) Timelime使用流程: 打开之后会提示您…

18.通过telepresence调试部署在Kubernetes上的微服务

Telepresence简介 在微服务架构中,本地开发和调试往往是一项具有挑战性的任务。Telepresence 是一种强大的工具,使得开发者本地机器上开发微服务时能够与运行在 Kubernetes 集群中的其他服务无缝交互。本文将深入探讨 Telepresence 的架构、运行原理,并通过实际的案例演示其…