萍聚社区-德国热线-德国实用信息网

 找回密码
 注册

微信登录

微信扫一扫,快速登录

萍聚头条

123
返回列表 发新帖
楼主: fusion

[其它] 问个初级的内存管理的问题

[复制链接]
发表于 2013-11-6 11:38 | 显示全部楼层
fusion 发表于 2013-11-6 09:38
比如已知有256M内存,其中只允许用70%,然后要实现几个功能模块,有use Case ,但还没Code ,有一个新模 ...

看明白点了。

要说估计个最小需求是有可能的。 以前实习 embedded C 时,公司要求不能用malloc,全静态变量+stack,这个就好估计了。

C++因为有对象生成,所以更复杂了。可以想象一下,系统max运行时,有多少objects还活着。

Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2013-11-6 11:49 | 显示全部楼层
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2013-11-6 12:00 | 显示全部楼层
我觉得你思考问题反了
内存使用大小和线程数量没有太大关系 是程序实现的时候才会有具体需求
比如你程序里面全局变量 和局部变量使用数量不一样 内存使用情况就不一样
嵌入式开发如果是复杂的应用,我觉得designer应该规划出每个功能大概能使用多少内存,然后在实现的时候去优化
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2013-11-6 12:08 | 显示全部楼层
fusion 发表于 2013-11-6 09:38
比如已知有256M内存,其中只允许用70%,然后要实现几个功能模块,有use Case ,但还没Code ,有一个新模 ...

首先必须赞一个,这明显就是leader或者architect操心的事,隐含的显摆贴啊,哈哈

我觉得最好的办法是在设计框架的时候考虑到新功能的扩展性,然后在完成已定功能的code以后,做bench,然后看是否仍然可以加进来新模块

当然这是纯从工程角度来看的,具体从市场和项目来说,可能要先期决定才好和客户谈。

如果要先期决定的话,我的一点想法:

这那个设计架构的工程师应该能对这个内存需求能做出比较准确的估计吧,这种估计写进文档的话,一般要从一般的case和worst case两个方面考虑

另外这个和模块静态数量没有直接关系,而是要考虑具体最多,或者有哪些模块会动态并行的运行(这个架构师应该必须很清楚),每个模块最多或者一般会占用多少内存(这个一般来说比较好估计一个范围吧),然后加起来不就完了?

如果有内存共享的话,嵌入式一般不会用自动内存管理的,那么那个模块开辟的这边内存,这块内存算那个模块的

最后,在总加和的最后,要考虑程序员的质量,比如非必要栈内存的申请之类的,再加个20%左右的权值,就估计个差不多了应该

嵌入式这个应该还是比较好估算的,而且一般来说因为内存有限,这个一般都要估算,估算要在框架设计之后,没框架没办法估算

Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2013-11-6 18:00 | 显示全部楼层
本帖最后由 mandriva 于 2013-11-6 18:37 编辑
fusion 发表于 2013-11-6 09:40
如果还没有Pseud. Code,怎么知道要加多少动态内存


动态内存 == heap memory == dynamic allocation 是指 malloc, realloc, calloc 和 free 管理的内存。
如你所说,
如果还没有Pseud. Code,

没有具体应用和代码,这个问题想都不用去想。
怎么知道要加多少动态内存

如有实际应用,比如说做一个服务器,单位时间内的连接数为一百万次,你需要监视这些连接的状态,
那就是 SOCKET * sockRef = (SOCKET *)malloc(1000 * 1000 * sizeof(SOCKET));
也可以在程序启动的时候 先不要开辟这么多,先开辟 initialSize = 10 这么多的存储区域,
SOCKET * sockRef = (SOCKET *)malloc(initialSize * sizeof(SOCKET));
同时
定义一个 的变量 used 去监视这个 堆栈 的 栈顶,每次插入连接就自增used++ , 如果 used 到达9的时候,这时候说明栈已经满了,那就增加这个堆栈。
initialSize +=10;
然后又在原来的基础上重新开辟内存,什么叫做原来的基础上? 原来的内存区块的左值(内存区块的地址叫做左值)的右值(该地址的内存区块存储的内容叫做右值)原封不动。
sockRef = (SOCKET *)realloc(sockRef, initialSize * sizeof(SOCKET));
然后就可以继续插入连接。
如果中间(设索引为1000,而堆栈数为10010)的某个连接不需要了,你可以用memmove 把1001-10009 的内存区块移回来,然后又used--,从而实现一种完全的内存管理,这就是 heap 这个英文单词的本质含义。

你要是用的纯C (ANSI C),要实现Array 办法就是我说的这种,你要是C++ 可以直接用C++ 的vector,不过C++ 的vector也是按照我说的办法实现的。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2013-11-6 19:44 | 显示全部楼层
本帖最后由 chinapope 于 2013-11-6 19:47 编辑
mandriva 发表于 2013-11-6 18:00
动态内存 == heap memory == dynamic allocation 是指 malloc, realloc, calloc 和 free 管理的内存。
...


我觉得楼主根本就没有必要操这个心,架构师会考虑这样的问题?

如今对一般嵌入式应用,主内存256MB会不够用?

系统上还有二级的存储空间吧,另外运行时间可以用来换空间。

要是C++程序出内存泻漏的问题,多少内存都不够用。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2013-11-6 20:23 | 显示全部楼层
我觉得楼主根本就没有必要操这个心,架构师会考虑这样的问题?

如今对一般嵌入式应用,主内存256MB会不够用?

系统上还有二级的存储空间吧,另外运行时间可以用来换空间。

要是C++程序出内存泻漏的问题,多少内存都不够用。

从第二页LZ的那些望文生义的回复来看,我的判断是LZ 在C/C++方面没有任何实际经验,不可能是架构师吧。架构师 ? FB, M$, APP 的老大坐的位置就是,必须同时具备领导能力和实战编程技能。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2013-11-6 22:20 | 显示全部楼层
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
您需要登录后才可以回帖 登录 | 注册 微信登录

本版积分规则

手机版|Archiver|AGB|Impressum|Datenschutzerklärung|萍聚社区-德国热线-德国实用信息网

GMT+1, 2024-11-6 08:43 , Processed in 0.059438 second(s), 14 queries , MemCached On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表