Bruce Powel Douglass大师介绍-CSDN博客https://blog.csdn.net/ChatCoding/article/details/134665868嵌入式软件开发从小工到专家-CSDN博客https://blog.csdn.net/ChatCoding/article/details/135297955C嵌入式编程设计模式源码-CSDN博客https://blog.csdn.net/ChatCoding/article/details/134819019
静态分配模式是一种内存管理策略,仅适用于系统本质上静态的系统。
内存池模式也是一种内存管理策略,它在系统启动时预先分配一定数量的对象,并在需要时提供给客户端使用。这种模式既避免了动态分配的非确定性和碎片化,又提供了静态分配的灵活性,适用于需要在运行期间分配和回收大量相似对象的系统。
许多应用程序中,大量的客户端可能需要创建对象,例如数据对象或消息对象。这些对象的需求往往难以预测。这时,预先创建对象池就很有意义(此时,没必要初始化对象)。客户端可根据需要获取对象,用完后归还池中。
内存池模式适用于以下系统:
具体来说,内存池模式可以解决以下问题:
图 6-3 展示了内存池模式的结构。可参数化的泛型池管理器类用于创建特定类型的池化对象。系统中通常会存在多个这样的实例化池,但每个特定的池化类型只有一个。
每个池创建并管理其对象集,在需要时分配对象,并返回分配对象的引用或句柄给客户端。在释放后,对象将被放回可用对象列表。
客户端(Client)
在嵌入式系统中,任何需要使用resourceClass
类的对象都是客户端。客户端通过调用ResourcePool::allocate()
向池请求对象,并在使用完成后通过ResourcePool::release()
释放对象归还给池。
通用池管理器(Generic Pool Manager)
通用池管理器是一个模板类,它使用模板参数pooledClass
和BufferSize
分别指定要池化的对象类型和数量。
内存池(PooledClass)
PooledClass 表示实例化类对象对所对应的存储空间(内存池)。它可以是任何你想要的对象,但通常情况下,它们是简单、小型的类,由各种客户端使用。例如,在嵌入式系统中,PooledClass 可以是事件、消息、数据对象等。
资源池管理器(Resource Pool Manager)
资源池管理器类是已实例化的通用池管理器,系统中可以有多个这样的实例,但每个特定资源类最多只有一个实例。
模板实例化是指为模板类或模板函数指定具体的类型的过程。
优点:
缺点:
总结:
内存池模式是一种有效的内存管理模式,适用于需要频繁创建和销毁大量相似小型对象的嵌入式系统。在使用该模式时,需要注意其对设计要求高、系统扩展受限等缺点,并结合系统的实际需求进行权衡。
本节提供了实现模式的策略,特别是在C++中。建议重写new和delete操作符以使用池管理器,这可以隐藏应用程序程序员不必直接处理池化与动态分配的复杂性。
内存池模式的实现相对简单。在 C++ 中,为了方便使用,通常会重写 new
和 delete
运算符,使其直接调用池管理器进行分配和释放操作。这样,应用程序开发人员无需关心是动态分配还是池化分配,简化了代码。
扩展与组合:
内存池模式可以与其他设计模式组合使用,例如与工厂模式([1])结合,根据需要创建特定的子类型对象。
具体实现参见《C++高级编程》
内存池模式与其他内存管理模式的关系:
总结:
内存池模式是嵌入式系统中常用的内存管理技术,适用于需要频繁创建和销毁大量相似小型对象的场景。选择合适的内存管理模式需要根据系统复杂性、性能需求和灵活性等因素进行权衡,并考虑与其他模式的组合使用。
原书内容存在错误,见红色
对象模型 (图 6-4a):
图 6-4a 展示了基于图 6-3 所示模式派生出来的类模型的对象关系。系统中存在一个 TempDataPool
对象,管理着 1000 个 TempData
对象实例。图中还展示了三个 TempDataPool
的客户端:
TempData
对象来存储温度信息。TempData
对象,归还给池中。TempData
对象,而是将它们缓存起来。当收到新的温度数据时,它会释放最老的 TempData
对象,腾出空间存储新的数据。时序图 (图 6-4b):
图 6-4b 演示了对象在运行期间的一个场景:
TempDataPool
对象,并由它创建 1000 个 TempData
对象,存储在池中。TempData
对象,存储测得的温度值。TempData
对象分别传递给 TempView 。TempData
对象,将其放回池中。TempData
对象分别传递给 TempHistory。TempData
对象存储起来,维护最近 10 秒钟的温度历史记录。TempData
对象。TempData
对象,腾出空间存储新的数据。