如何查看操作系统用于管理分配内存的内存大小?

2023-01-27 02:38:09 +08:00
 LuckyPocketWatch

内核是 3.2 的,某厂家魔改的 linux 系统,如果在系统上跑一个程序,该程序有一段代码

void* ptr = alloc(32);

这里程序向系统申请了长度为 32 字节的内存,操作系统除了分配 32 字节的内存外,肯定还要分配一部分内存用于管理这段内存,比如记录这段内存的长度,地址等,也就是说这段代码操作系统需要分配( 32+n)字节,其中 32 字节分配给程序,n 字节用于记录该段内存的相关消息

那如何查看该操作系统的 n 的值?

2003 次点击
所在节点    Linux
7 条回复
ragnaroks
2023-01-27 04:02:32 +08:00
这个 N 是由内存分配实现决定的,与操作系统无关,直接看你的 alloc 源码即可
msg7086
2023-01-27 04:34:50 +08:00
C 库里的 mallc/free 代码管理的。如果你用第三方 memory allocator 就会不太一样。
比如
https://github.com/google/tcmalloc
https://github.com/jemalloc/jemalloc
https://github.com/emeryberger/Hoard
等等。
想学习的话也可以参考他们的源码。

默认的分配器,如果是 GCC 的话,得去看 GCC 的 allocator 的实现了。可以找找 GCC 内存分配器解析的文章看。
geelaw
2023-01-27 04:50:16 +08:00
不太确定你的 alloc 是哪里来的(它似乎不是 C 语言的标准,也不是 POSIX 的一部分)。

取决于你考虑的抽象层级不同,这个问题可能无意义。例如如果你考虑 malloc ,那么它是 C 语言的一部分,不存在“操作系统分配了额外内存”的概念(当然可以猜想,C 语言的实现额外分配了内存,但这个问题处于 C 语言的抽象层面)。

如果你想问像 VirtualAlloc 之类的操作系统 API 导致实体内存的额外开销,这个问题恐怕也是不良定义的,因为操作系统可以采用复杂的数据结构维护内存分配情况,很难说每次调用带来的额外开销都是同一个数。
e9pWeUbh9PGCnp95
2023-01-27 10:45:31 +08:00
kernel 有个 mm 和 vma 结构体记录你想要的这些信息。
pipapa
2023-01-27 17:31:37 +08:00
看你 alloc 函数的实现,一般都是用 brk 申请的虚拟内存不占实际内存大小,缺页才分配。
LuckyPocketWatch
2023-01-27 17:32:31 +08:00
@geelaw

@ragnaroks

那如果是 C++的标准 new 呢,比如
int* v = new int;
假设这个系统 int 长度是 4 字节,这行代码向系统申请了长度位 4 字节的内存,

1.对于这样一个操作,系统是否需要额外的内存来管理 && 记录这段内存相关信息,也就是这行代码需要申请的内存长度是 4 还是(4+n)
2.如果申请的长度是(4+n),n 的值是由 C++来决定的还是由操作系统来决定的?
ragnaroks
2023-01-27 18:17:14 +08:00
1:4+N
2:c++ 的编译器

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/910794

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX