【发布时间】:2015-07-26 04:54:25
【问题描述】:
我正在用 C 语言开发一个多线程应用程序。我目前正在使用 40 个线程,每个线程使用大约 2Mb 的数组。
我目前正在动态分配这个数组,所以我这样做了:
char *data = malloc(2097152 * sizeof(char));
这些线程正在处理请求,因此每次有新请求进来时,这个数组都会不断分配和释放。
一切正常,但我使用的是 valgrind 的 massif 工具,它显示我有时有一个 80Mb 的堆。所以我有点想知道,我会有堆碎片问题吗?我还在代码的其他地方分配了较小的内存块。
另外,我会从静态数组中受益吗?我正在寻找提高我的表现的方法,我想知道这是否会有所帮助。但是,我害怕这样做并最终导致堆栈溢出。堆栈中的 80Mb 似乎太大了...
有什么建议吗?我真的不知道堆/堆栈的大小太大了。
【问题讨论】:
-
你怎么能得到一个 80 MB 的堆栈?无论如何,是的,你会有一些碎片,但设置一个 pool 数组将被重用的地方应该很容易......
-
为什么在固定大小的情况下使用动态内存?这可能会让你慢很多
-
当 40 个线程使用 2MB 每个加密到 80MB 时,为什么 80MB 的堆会成为问题?
-
仅供参考,
sizeof(char)总是和无处不在 1 ...见Are there machines, where sizeof(char) != 1? -
所以这个数组是不断分配和释放的,每次有新请求进来时为什么?为什么线程每次都不能使用相同的内存而不再次进行 malloc'ing?堆栈的主要问题是您不知道分配是否失败,并且还取决于您是否使用除此之外的更多堆栈存储。所以可能很危险。此外,大多数系统的默认堆栈大小为 8MB(当然可以更改)。所以 malloc'ing 可能是要走的路。
标签: c multithreading heap-memory stack-memory