Nat*_*ons 6 c++ embedded viper new-operator windows-ce
我正在研究嵌入式处理器(400 MHz Intel PXA255 XScale),我想我看到一个没有足够内存来满足"新"操作的情况.该程序没有崩溃,所以我假设其他线程已经释放了他们的记忆,这只是一个短暂的事情.这是一些非常关键的代码,因此退出不是一个选项,需要将某种错误返回给远程用户.
以下小修补程序是否足以解决问题,还是有更好的方法?在用以下代码替换每个'new'之前,我想我会问.
char someArr[];
do{
someArr = new char[10];
Sleep(100); // no justification for choosing 100 ms
} while ( someArr == NULL );
Run Code Online (Sandbox Code Playgroud)
睡眠有帮助吗?我应该设置一些最大重试次数吗?是否可以在任何地方使用静态初始化?
最后更新:非常感谢您提供有用的响应,但事实证明在代码检查中存在错误的内存分配错误.我会记住所有这些答案,尽可能多地替换malloc和new(特别是在错误处理代码中).
Nor*_*sey 15
您正试图通过本地推理解决全局问题.全局问题是整个设备对操作系统和所有应用程序具有有限数量的RAM(以及可能的后备存储).为了确保不超过此数量的RAM,您有以下几种选择:
每个进程在固定数量的RAM中运行,以便在启动时按每个进程确定; 程序员做了推理以确保一切都适合.所以,是的,可以静态分配所有内容.这只是很多工作,每次更改系统配置时,都必须重新考虑分配.
进程知道自己的内存使用情况和需求,并不断向对方建议他们需要多少内存.他们合作,所以他们不会耗尽记忆.这假设系统中的至少一些进程可以调整它们自己的存储器要求(例如,通过改变内部高速缓存的大小).Alonso和Appel写了一篇关于这种方法的论文.
每个进程都意识到内存可能会耗尽,并且可以故障转移到消耗最少内存量的状态.通常,这种策略是通过内存异常来实现的.异常在main()中或附近处理,并且内存不足事件实质上从头开始重新启动程序.如果内存响应用户请求而增长,则此故障转移模式可以工作; 如果程序的内存需求增长与用户的行为无关,则可能导致颠簸.
上面的提议与所有方案都不匹配. 相反,您希望其他一些过程可以解决问题,最终会出现您需要的内存.你可能会很幸运.你可能不会.
如果您希望系统可靠地工作,那么考虑到共享有限内存的需要,您最好重新考虑系统上运行的每个进程的设计.它可能比你预期的更重要,但如果你理解这个问题,你就可以做到这一点.祝好运!
小智 2
有几种不同的方法可以解决此问题 - 请注意,根据您使用的 Windows CE / Windows Mobile 版本,工具说明会略有不同。
需要回答的一些问题:
1. 您的应用程序是否泄漏内存,导致内存不足的情况?
2. 您的应用程序是否只是在某些阶段使用了太多内存,导致内存不足的情况?
1 和 2 可以使用 Windows CE AppVerifier 工具进行调查,该工具可以为您的产品提供详细的内存记录工具。其他堆包装工具也可以提供类似的信息(并且可能具有更高的性能),具体取决于您的产品设计。
http://msdn.microsoft.com/en-us/library/aa446904.aspx
3. 在此过程中您是否非常频繁地分配和释放内存?
Windows CE 在操作系统版本 6.0 之前(不要与 Windows Mobile 6.x 混淆)具有 32MB/进程虚拟内存限制,这往往会导致许多有趣的碎片问题。在这种情况下,即使您有足够的可用物理内存,也可能会耗尽虚拟内存。使用自定义块分配器通常可以缓解此问题。
4. 您是否分配了非常大的内存块?(> 2MB)
与 3 相关,您可能只是耗尽了进程虚拟内存空间。有一些技巧(在某种程度上取决于操作系统版本)可以在进程空间之外的共享虚拟机空间中分配内存。如果您的虚拟机用完了,但物理 RAM 还没有用完,这可能会有所帮助。
5. 您是否使用大量 DLL?
还与 3 相关,根据操作系统版本,DLL 也可能会很快减少可用 VM 总量。
进一步的出发点:
CE内存工具概述
http://blogs.msdn.com/ce_base/archive/2006/01/11/511883.aspx
目标控制窗口“mi”工具
http://msdn.microsoft.com/en-us/library/aa450013.aspx
归档时间: |
|
查看次数: |
3315 次 |
最近记录: |