应用程序中内置RAM的内置资源控制
描述了一个相当简单的软件实现工具,用于在应用程序执行期间控制使用的RAM资源。 实现的基础是拦截和注册请求,以分配,释放和重用应用程序通过调用malloc(),calloc(),realloc(),free()发送给操作系统的内存资源。 所有内存请求都记录在一个特殊的日志中,在应用程序的结尾,累积的信息以报告的形式显示在控制台上或写入文本文件。 通过分析报告,您可以确定应用程序中RAM使用效率低下的情况。 这些包括“内存泄漏”(当请求的内存资源未释放且未被应用程序声明时),碎片(当污染的和释放的连续内存部分的大小不足以满足新请求时导致碎片),从而导致分配更多资源。
内置的内存控制工具可以处于打开或关闭状态(用于注册内存请求),并且通过编程状态切换的可能性,您可以控制和优化分配的内存资源接收的数据量。
引言
很大一部分现代软件系统是使用
C#,Java等编程语言开发的,其中RAM资源的管理是在系统级别执行的,同时最大限度地减少了软件开发人员的责任。 这种软件系统的一个示例是在
.net环境中以
C#实施的
Delta Design端到端自动化计算机辅助设计系统。 另一方面,自动化系统软件具有相当长的“寿命”(长达数十年),这导致需要维护“过时的” RAM内存管理技术,尤其是在将上述两类系统集成到通用控制方案中时。
因此,到目前为止,在功能上复杂的软件应用程序的创建,开发和维护中,迫切的问题仍然是需要优化其中的RAM资源的管理。 与有效的方法(智能指针,垃圾回收器)一起,继续使用通过对
malloc,calloc,realloc和free的调用来查询内存资源的软件工具
。这种方法为开发人员提供了对应用程序中RAM管理的完全控制权,同时强加了及时释放这些资源的高层责任,以避免“泄漏”。
通常,在软件开发的初始阶段,识别内存资源使用效率低下的事实的任务不是优先事项,因为应用程序的结构非常透明。 但是,当将系统的各种结构和功能组件与RAM资源的分布式控制以及它们之间的信息交换的复杂方案集成在一起时,就会出现问题。 系统开发人员世代的变化也对解决优化RAM资源管理的问题产生影响。 结果,以下负属性开始出现在应用程序中:
- 在消耗的RAM的实际大小和开发人员的估计之间发现了很大的差距;
- 在应用程序执行期间,使用的动态内存线性增加。
应用程序中RAM使用效率低下的原因是多种因素,这些因素包括以下基本事件:
- 放置和释放RAM的请求不匹配(“泄漏”);
- 释放的RAM区域的重用水平较低,这导致对新区域的请求(碎片)。
开发和维护具有复杂体系结构和已开发功能的软件应用程序的实践表明,应尽早开始控制其中的RAM资源的使用,以保持对该过程的控制。 您可以通过获取和使用适当的软件产品(例如
valgrind ),或通过实现和嵌入用于在应用程序代码中拦截和注册对RAM资源的请求的方法来控制应用程序的内存资源。
下面是此方法的一种可能的实现方式的示例。
嵌入式控制软件
提出的解决方案的基础是通过对应用程序在执行过程中向操作系统发送的对RAM资源的所有请求的内置控制来进行拦截。 通过调用
malloc(),realloc()或
free()可以实现各种此类查询。 下图显示了在关闭和打开内置控件时处理分配malloc()RAM的请求时发生的一系列事件的示例,如下图所示(可以为
realloc()或
free()调用构建类似的图)。 频段“
A ”包括在内存分配过程中在内置控制模式的关闭状态下发生的一系列事件。 该应用程序向操作系统发送请求,以分配所需的内存大小,并接收指向所选片段的起始地址的指针。 在请求的内存大小不可用的情况下,将返回地址为零的指针,该指针应由请求的应用程序相应地处理。

波段“
B ”包括在分配内存时发生的一系列事件,这些事件是在内置控制模式打开时发生的。 该序列与前面描述的序列完全一致,不同之处在于,在分配请求的内存之后,控制权传递给register_request()函数,该函数根据发出的请求保存有关分配的内存的地址和大小的信息。
实际上,对RAM资源的请求的拦截和注册是由memSupervisor对象执行的,该对象是通过调用init_memSupervisor()在单个实例中创建的,然后可以分别通过调用enable_memSupervisor()或disable_ memSupervisor()来打开或关闭该对象。
拦截对RAM资源的请求的技术基于对
GNU库的静态变量的使用
,如以下代码片段所示。


对RAM资源的所有已处理请求都记录在一个特殊的记录表中,其记录存储在memSupervisor.memRegister属性中。 每个条目包含以下信息:

该表中的每个记录在分配内存并记录请求之后,都与程序代码的控制点相关联。
文本报告生成器(
memSupervisor.genReport(file_name) )使用表数据并将信息写入指定的文本文件(或输出到应用程序控制台)来生成报告。 将报告数据下载到MS Excel表以及后者的相应设置将使您能够获得有关RAM资源使用情况的报告数据的图形表示。
内置控件的界面
可以通过在应用程序源代码中编译和放置宏来实现有关应用程序对RAM资源的请求的信息的收集,这些宏仅在设置了相应的环境变量时才被编译。

下面是一段程序代码,演示了内置控件的用法。



以下是对
“ foo”应用程序所请求的RAM资源的内置控制的所描述方法的使用说明,该应用程序在印刷电路板上执行连接的自动跟踪。 为了进行分析,选择了一个足够清晰和方便的弯折模型,该模型显示了在印刷电路板上铺设连接过程中应用程序所要求的动态随机存取存储器的尺寸。

该模型有助于确定RAM资源管理的以下问题:
- 在“ A”和“ D”点处的大小应与使用的RAM大致相同
- 在执行连接铺设的阶段,请求的内存大小的增加应该平稳。 如有必要,应通过在相应的代码段中设置断点来控制此阶段的主要步骤。 强制删除已铺设连接上的所有数据应导致在“ B”和“ C”点处消耗的内存大小相同
下图显示了提到的
“ foo”应用程序中的内存管理问题。

简要结论
所描述的RAM资源的集成控制方法可以在相应的软件产品不可用且由于任何原因不适用的情况下使用。
- 内置的控制工具以任何精确度和详细程度注册并累积有关所请求内存资源的信息;
- 可以在活动模式和非活动模式之间切换内置控件的功能,使您可以配置它们以提取和分析应用程序代码的选定片段中的数据。
- 内置控件允许在组装应用程序时将它们从应用程序中完全排除,而无需设置适当的编译参数。
- 对应用程序执行过程中使用的RAM资源的应用程序收到的报告内容进行程序分析,并通过参考副本进行验证,可以为应用程序开发回归测试程序,以检测应用程序对RAM的使用下降;
- 这种内置RAM控制的程序代码是开放的,以扩展其功能并适应其使用的特定条件。
- 所描述的工具的主要缺点是需要在受监视的应用程序的代码中包括内置的内存控制代码。
总之,应该注意的是,在软件应用程序中实现RAM资源的内置控制的上述方法不包含任何全新的解决方案。 该方法的有用之处在于实现的简单性和相当高的实际应用效率。