嵌入式系统设计中的存储碎片收集策略
随着嵌入式系统数据对象处理量的急剧增加,对存储碎片收集的实时性能的要求也显得日益突出,本文介绍的真正高效、实时、确定性的两种存储碎片收集技术将对(中国)工程师提供策略上的指导。
在嵌入式系统设计过程中,Java程序员并不需要弄清楚哪些数据占用了哪些存储器或者应该在什么位置释放哪些存储空间,设计工程师只需要简单地分配对象而后由系统来释放这些资源。这样就可以完全消除悬浮指针错误,因而极大地减小存储空间浪费的可能性。由于并不需要一些显式的规则来指定这些存储空间的释放,因此简化了接口并且增强了软件复用。自动诊测并释放这些不再使用的对象的系统进程称为存储碎片收集(garbage collection)。
假如存储碎片收集真有这么好,人们也许会怀疑为什么在ANSI C++中不具备这样的功能。事实上,C++语言扩充版允许程序员将一些类型指定为“受控对象类型”,比如在Microsoft Visual C++的.NET平台中就能找到这种应用。这些受控对象在一定的条件下,可以实现自动存储碎片收集。问题的关键是存储碎片收集器必须能够找到所有的对象指针。由于C++允许将指针映射为其它类型,所以通常情况下无法追踪所有的指针。
关联存储碎片收集是对传统存储碎片收集算法的一个重大改进。基本的思路就是关注最新的对象。这是由于大多数对象都是很快产生而又很快消失,这些很快消失的对象集通常构成了绝大部分存储碎片。当然事情远比这要复杂。
弹性清除存储碎片
基于“标示和扫描”方式的传统存储碎片收集算法工作过程如下:当存储空间太低(下降到一个失效的新值)时,系统就会停止所有用户线程,定位无法访问的对象集合并且释放这些对象。要做到这一点就必须检查每一个对象索引,如从“根”开始的局部变量和静态类型域。检查每一个索引的对象确定其是否已经被标记过。如果没有,首先标记该对象并且对它所有的索引进行处理,否则就继续处理下一个索引。这一过程结束后,任何未被标示的对象都被认为是无法访问的对象,因而可以回收再利用其占用的存储空间。由于这种技术能够正确地检测被其它消失对象索引的成组消失对象,因而要比索引计数机制高明。图1和图2分别显示出这一对应过程前/后的图像。
当然存储空间在任何时候都有可能出现自由空间过低的情况,并且标示和扫描过程所需要的时间正比于对象以及索引的数量,因而就会出现应用程序可能周期性地出现不响应或者滞后短暂的时间间隔才开始响应的问题。这样的滞后在实时系统甚至是在“软”实时的系统中都是不能接受的。
相关文章
- 2023-03-02智能化色谱分析软件的研究与应用探讨
- 2022-04-27监控摄像机日夜及彩色黑白转换两用简析
- 2024-07-31铁路客车提速轴承外圈非基准端面挡边平行度测量仪的研制
- 2024-07-09多CCD拼接相机中图像传感器不均匀性校正
- 2024-02-26实现同一分析周期内两流路并行分析的技术改造



请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。