行业报告 AI展会 数据标注 标注供求
数据标注数据集
主页 > 技术社区 > 物联网 > 正文

为什么内存分配弹性在物联网中很重要

内存分配是开发人员不会考虑太多的事情之一。

毕竟,现代计算机、平板电脑和服务器占据了如此多的空间,以至于内存常常看起来像是一种无限的资源而且,如果有任何问题,内存分配失败或错误的可能性很小,系统通常默认为程序退出。 

然而,当涉及到物联网 (IoT)时,情况就大不相同了在这些嵌入式连接设备中,内存是一种有限的资源,多个程序会争夺它们可以消耗多少。系统更小,内存也更小。因此,最好将其视为有限资源并谨慎使用。 

正是在这种情况下,内存分配(也称为 malloc)在我们的领域中变得非常重要。Malloc 是在执行程序或进程时保留一部分计算机内存的过程。做对了,特别是对于连接到互联网的设备,可以成就或破坏性能。 

那么,让我们来看看开发人员如何在他们的 malloc 方法中构建弹性,以及它对未来连接设备性能的意义。

Malloc 和连接设备:简史

让我们从头开始。传统上,malloc 在嵌入式系统中并不经常使用。这是因为旧设备通常不连接到互联网,因此计算出的内存需求大不相同。 

但是,这些较旧的设备确实会在系统启动时创建一个资源池来分配资源。资源可以是连接,系统可以配置为允许来自静态分配池的 n 个连接。

在非互联网连接的系统中,系统的状态通常会受到一定程度的限制,因此内存分配的上限更容易估计。但是,一旦嵌入式系统连接到互联网,这种情况就会发生翻天覆地的变化。 

例如,一个设备可以计算多个连接,并且每个连接都可以根据连接的用途有不同的内存要求。在这里,连接上数据流所需的缓冲存储器取决于连接的延迟,以使用某些概率函数来获得一定的吞吐量,以了解数据包丢失或其他网络相关行为。 

这在现代高端系统上通常不是问题。但是,请记住,开发人员在嵌入式环境中面临有限的内存资源。所以,你不能简单地假设有足够的内存。 

这就是为什么在 IoT 嵌入式开发中考虑如何创建对内存分配错误(也称为 malloc 失败)具有弹性的软件非常重要。

现代嵌入式连接系统和 Malloc

现代互联嵌入式系统中,malloc 的使用更为频繁,许多嵌入式系统和平台都有不错的 malloc 实现。发生这种转变的原因是现代互联嵌入式系统执行更多任务,并且静态地为所有可能的程序执行分配所需的最大资源通常是不可行的。

这种在现代连接的嵌入式系统中积极使用 malloc 的转变需要更彻底和系统的软件测试来发现错误。

通常,不会系统地测试分配错误,因为它通常被认为是发生概率很小的事情,因此不值得付出努力。由于分配错误非常罕见,因此任何错误在被发现之前都可能存在多年。

Mallocfail:如何测试错误

好消息是开发人员可以利用软件来测试分配错误。一种新颖的方法是运行程序并在发生分配的所有唯一执行路径中注入分配错误。这可以通过工具mallocfail 实现。 

顾名思义,Mallocfail 有助于以确定性方式测试 malloc 失败。该工具不是随机测试,而是通过不同的控制路径自动枚举 malloc 失败。它的灵感来自这个 Stack Overflow 答案

简而言之,此工具使用自定义版本覆盖 malloc、calloc 和 realloc。每次自定义分配器运行时,该函数都会使用 libbacktrace 生成当前调用堆栈的文本表示,然后生成该文本的 sha256 哈希。 

然后,该工具会检查是否已经看到新的散列。如果从未见过,则内存分配失败。哈希存储在内存中并写入磁盘。如果哈希——特定的调用堆栈——之前已经被看到,那么正常的 libc 版本的分配器被正常调用。每次程序启动时,都会从磁盘加载已经看到的哈希值。

这是我亲身使用过并发现非常有用的东西。例如,在我的公司,我们成功地在我们的嵌入式边缘软件开发工具包上测试了 mallocfail 。我很高兴地报告,该工具实际上设法识别了 SDK 及其第三方库中的一些问题。结果,前者的问题现在已经修复,后者已经收到补丁。

处理 Malloc 失败

在复杂的系统中处理分配错误可能有点棘手。例如,考虑需要分配数据来处理事件。存在不同的模式来规避这个问题。最重要的是分配必要的内存,以便在分配失败的情况下可以将错误反馈给程序,并且某些代码路径不会静默失败。

处理 malloc 失败的能力是我的团队经常考虑的问题。当然,这在其他设备上不是什么大问题,但在连接到互联网的嵌入式设备上可能会导致大问题。 

因此,我们的 SDK 计算了限制某些资源(包括连接、流、流缓冲区等)的功能。这样一来,系统可以配置为限制使用的内存量,从而不太可能发生 malloc 错误(然后它只是一个资源分配错误)。

通常,系统内存不足会导致系统难以执行。因此,降低分配错误的概率确实很有意义。这通常通过限制可以同时发生的功能/任务来处理。 

作为在该领域工作了 20 年的人,我认为开发人员在涉及现代嵌入式连接设备时应该采用最佳 malloc 实践。 

我的建议是深入考虑您的嵌入式设备如何解决 malloc 问题并研究使用内存的最有效方式。这意味着尽可能多地使用动态内存分配和测试进行设计。您设备的性能和可用性取决于它。

微信公众号

声明:本站部分作品是由网友自主投稿和发布、编辑整理上传,对此类作品本站仅提供交流平台,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,不为其版权负责。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。

网友评论:

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
SEM推广服务

Copyright©2005-2026 Sykv.com 可思数据 版权所有    京ICP备14056871号

关于我们   免责声明   广告合作   版权声明   联系我们   原创投稿   网站地图  

可思数据 数据标注行业联盟

扫码入群
扫码关注

微信公众号

返回顶部