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

标签 c memory concurrency

我想知道给定数据结构消耗了多少内存。所以假设我有一个并发链表。我想知道这份名单有多大。我有几个选择:malloc_hooks,我认为它不是线程安全的,以及 getrusageru_maxrss,但我不真的知道这给了我什么(整个过程在执行过程中消耗了多少内存?)。我想知道是否真的有人用这种方式测量过内存消耗。有没有工具可以做到这一点? massif 的票价如何?

最佳答案

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

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

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

或者,一般来说,编写您自己的分配器,您可以详细了解其行为和开销,并且它本身会从系统中获取大量数据。

关于c - C中并发数据结构的内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19965944/

相关文章:

python - Python 的类似 Erlang 的并发性?

java - 单线程在多核处理器上的数据可见性

c - : *** [test] Error 10 signify? 是什么品牌

计算并打印 C 中大 N 的 (2^N-1) mod (10^9 + 7)

c - C中的字符串递增函数

algorithm - 内存黑客中的指针扫描

c# - 文件输入和输出

无法访问 .bss 部分中的内存,但 gdb 'info files' 显示地址在范围内

Linux:由于虚拟内存限制,无法在单个进程中分配超过 32 GB/64 GB 的内存

java - 从 Hashmap 中同时添加或删除元素并实现同步