fusion 发表于 2013-11-5 20:48

问个初级的内存管理的问题

只有架构,线程设计,还没写一个code的时候,怎么算内存大概要占多少。有人能带我入个门么

Angevil 发表于 2013-11-5 23:54

什么语言?Java 的话,先预算个 4GB 吧……

雪候鸟 发表于 2013-11-5 21:50

这个问题也太难了。什么应用背景呢,代码量数据量能给个大概吗,然后看看大家能否有个主意

orionsnow 发表于 2013-11-5 22:04

你的程序是不是要消耗很多内存那种的?

如果是的话,可以根据一单位数据所占的字节做一个乘法。

如果是逻辑性很强,有很多过程那种的,我就没啥经验能估算了。

你查查数据结构里头的时间消耗和空间消耗吧,可能会有提示。

乐水鸣佩环 发表于 2013-11-5 22:10

太坑爹了,这活你还得自己动手diy?

mandriva 发表于 2013-11-5 22:20

本帖最后由 mandriva 于 2013-11-5 21:23 编辑

所以LZ 究竟是 男人 还是 女人啊?
这个不就是?
线程内存等于 IO 缓冲 加 动态 内存 加 基本类型
然后又 整个程序内存 又等于线程累加么?
么??!
def memory_costOfThreadedprogram:
   ∑ memory_costOfThread
       for thread in 0:n-1
def memory_costOfThread:
   ∑ IO_buf + ∑ heap_memory + ∑ base_type
if you fread or fwrite a file of 2 GB, you need minimum 2 GB.
if you allocate an array of 2000 elements with size of 4 bytes, 2000 * 4 bytes are occupied.
an advanced compiler can optimize the memory usage for base type, so it can be ignored.

那些牛鬼蛇神不用去敲谷歌的算盘,这个是我做出来的。

雪候鸟 发表于 2013-11-5 23:50

mandriva 发表于 2013-11-5 21:20
所以LZ 究竟是 男人 还是 女人啊?
这个不就是?
线程内存等于 IO 缓冲 加 动态 内存 加 基本类型


楼主是女的,而且白富美。好好表现,兄弟我挺你。

公式很唬人,不过不知道楼主应用类型,没法评价

mandriva 发表于 2013-11-6 00:02

雪候鸟 发表于 2013-11-5 22:50
楼主是女的,而且白富美。好好表现,兄弟我挺你。

公式很唬人,不过不知道楼主应用类型,没法评价

啥子意思?
你难道是说你亲自见过LZ,所以lz是白富美?
lz是白富美 你就要好好表现?

雪候鸟 发表于 2013-11-6 00:13

mandriva 发表于 2013-11-5 23:02
啥子意思?
你难道是说你亲自见过LZ,所以lz是白富美?
lz是白富美 你就要好好表现?

你怎么理解都行。反正也是莫名其妙

sbtree 发表于 2013-11-6 01:01

雪候鸟 发表于 2013-11-5 23:13
你怎么理解都行。反正也是莫名其妙

你们歪楼了,富春妹子是来求教的

whatI 发表于 2013-11-6 02:35

LZ是来挖坑的

chinapope 发表于 2013-11-6 09:08

说实话,你这问题问得,也许是你搞架构的要高瞻远瞩,俺底层IT不理解你的Motivation

fusion 发表于 2013-11-6 10:28

Angevil 发表于 2013-11-5 22:54
什么语言?Java 的话,先预算个 4GB 吧……

C++

fusion 发表于 2013-11-6 10:38

本帖最后由 fusion 于 2013-11-6 09:41 编辑

雪候鸟 发表于 2013-11-5 20:50
这个问题也太难了。什么应用背景呢,代码量数据量能给个大概吗,然后看看大家能否有个主意

比如已知有256M内存,其中只允许用70%,然后要实现几个功能模块,有use Case ,但还没Code ,有一个新模块,没有参照项目,现在决定接不接受实现这个新模块,因为这块板子设计不能改了。如果有Risk ,就不增加这个新模块功能了。或者要重新分配内存。因为我们有三块处理器,包括dsp,看看能不能有的功能跑在一个处理器上。或者直接推掉这个要求

fusion 发表于 2013-11-6 10:40

mandriva 发表于 2013-11-5 21:20
所以LZ 究竟是 男人 还是 女人啊?
这个不就是?
线程内存等于 IO 缓冲 加 动态 内存 加 基本类型


如果还没有Pseud. Code,怎么知道要加多少动态内存

Darkpriest 发表于 2013-11-6 11:19

fusion 发表于 2013-11-6 09:38
比如已知有256M内存,其中只允许用70%,然后要实现几个功能模块,有use Case ,但还没Code ,有一个新模 ...

每个模块没有定义自己的内存范围么?256M都是全部模块share的?

fusion 发表于 2013-11-6 11:23

本帖最后由 fusion 于 2013-11-6 10:24 编辑

Darkpriest 发表于 2013-11-6 10:19
每个模块没有定义自己的内存范围么?256M都是全部模块share的?

恩。全部Share ,动态的嘛。数据静态存储有另外的

fusion 发表于 2013-11-6 11:25

chinapope 发表于 2013-11-6 08:08
说实话,你这问题问得,也许是你搞架构的要高瞻远瞩,俺底层IT不理解你的Motivation

看我的14楼

Darkpriest 发表于 2013-11-6 11:27

fusion 发表于 2013-11-6 10:23
恩。全部Share ,动态的嘛。数据静态存储有另外的

那要想得到具体的结果,怕是你们只能把模型建起来跑跑仿真才知道了。。

fusion 发表于 2013-11-6 11:32

Darkpriest 发表于 2013-11-6 10:27
那要想得到具体的结果,怕是你们只能把模型建起来跑跑仿真才知道了。。

大致想有个概念,能跑仿真那都设计的差不多了。有什么算法,比如靠Funktion Point 估个大概。因为毕竟我们本来就有30%reserve ,在必要的时候可以申请动用

chinapope 发表于 2013-11-6 12:38

fusion 发表于 2013-11-6 09:38
比如已知有256M内存,其中只允许用70%,然后要实现几个功能模块,有use Case ,但还没Code ,有一个新模 ...

看明白点了。

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

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

orionsnow 发表于 2013-11-6 12:49

你不是搞电子的么?怎么转行研究这个了?

mting 发表于 2013-11-6 13:00

我觉得你思考问题反了
内存使用大小和线程数量没有太大关系 是程序实现的时候才会有具体需求
比如你程序里面全局变量 和局部变量使用数量不一样 内存使用情况就不一样
嵌入式开发如果是复杂的应用,我觉得designer应该规划出每个功能大概能使用多少内存,然后在实现的时候去优化

schlafgern 发表于 2013-11-6 13:08

fusion 发表于 2013-11-6 09:38
比如已知有256M内存,其中只允许用70%,然后要实现几个功能模块,有use Case ,但还没Code ,有一个新模 ...

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

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

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

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

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

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

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

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

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

mandriva 发表于 2013-11-6 19: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也是按照我说的办法实现的。

chinapope 发表于 2013-11-6 20:44

本帖最后由 chinapope 于 2013-11-6 19:47 编辑

mandriva 发表于 2013-11-6 18:00
动态内存 == heap memory == dynamic allocation 是指 malloc, realloc, calloc 和 free 管理的内存。
...

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

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

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

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

mandriva 发表于 2013-11-6 21:23


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

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

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

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

从第二页LZ的那些望文生义的回复来看,我的判断是LZ 在C/C++方面没有任何实际经验,不可能是架构师吧。架构师 ? FB, M$, APP 的老大坐的位置就是,必须同时具备领导能力和实战编程技能。

乐水鸣佩环 发表于 2013-11-6 23:20

Fu MM 更像是划定硬件配置给项目做预算
页: [1]
查看完整版本: 问个初级的内存管理的问题