C中并发数据结构的内存消耗

时间:2013-11-13 22:39:10

标签: c memory concurrency

我想知道给定数据结构消耗了多少内存。所以假设我有一个并发链表。我想知道清单有多大。我有几个选项:malloc_hooks,我认为它不是线程安全的,getrusage的{​​{1}},但我真的不知道它给了我什么(多少记忆在执行过程中消耗的整个过程?)。我想知道是否有人以这种方式实际测量了内存消耗。有没有工具可以做到这一点? ru_maxrss怎么样?

2 个答案:

答案 0 :(得分:1)

要了解malloc某个结构实际花费了多少字节,就像链接列表节点一样,制作一个隔离的测试用例(非并发!),分配数千个,并查看程序内存使用中的delta值。有各种方法可以做到这一点。如果您的库具有mallinfo结构,如GNU / Linux系统上的GNU C库,您可以查看之前和之后的统计信息。另一种方法是跟踪程序的系统调用,以观察从OS分配的模式。例如,如果我们分配10,000,000个列表节点,并且程序执行大约39,000次sbrk()调用,则在每次调用中将进程的大小增加8192个字节,那么这意味着列表节点占用32个字节,开销和所有。

请记住,在单个线程中分配数千个相同大小的对象并不能真实地表示实际程序中的实际内存使用情况,包括碎片。

如果你想分配小型结构并接近不浪费一个字节(或者不造成任何你不知道和控制的浪费),并控制碎片,那么从{{分配大对象的数组1}}(或您选择的系统分配器)并自行分解它们。 malloc中仍然存在未知的开销,但它被分成大量的对象,使其可以忽略不计。

或者,通常,编写您自己的分配器,其详细了解其行为和开销,以及哪些本身从系统中获取大量内容。

答案 1 :(得分:0)

从概念上讲,您需要知道您正在使用的物品数量。然后,您需要知道数据结构中使用的每种不同数据类型的大小。您还必须考虑指针的大小或某些使用某种内存的东西。

然后你可以想出一个如下所示的公式:

消耗= N *(sizeof(数据类型))。

因此换句话说,您希望确保将任何数据类型一起添加(数据类型的大小)并将其乘以项目数。