内核是 3.2 的,某厂家魔改的 linux 系统,如果在系统上跑一个程序,该程序有一段代码
void* ptr = alloc(32);
这里程序向系统申请了长度为 32 字节的内存,操作系统除了分配 32 字节的内存外,肯定还要分配一部分内存用于管理这段内存,比如记录这段内存的长度,地址等,也就是说这段代码操作系统需要分配( 32+n)字节,其中 32 字节分配给程序,n 字节用于记录该段内存的相关消息
那如何查看该操作系统的 n 的值?
1
ragnaroks 2023-01-27 04:02:32 +08:00
这个 N 是由内存分配实现决定的,与操作系统无关,直接看你的 alloc 源码即可
|
2
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 内存分配器解析的文章看。 |
3
geelaw 2023-01-27 04:50:16 +08:00
不太确定你的 alloc 是哪里来的(它似乎不是 C 语言的标准,也不是 POSIX 的一部分)。
取决于你考虑的抽象层级不同,这个问题可能无意义。例如如果你考虑 malloc ,那么它是 C 语言的一部分,不存在“操作系统分配了额外内存”的概念(当然可以猜想,C 语言的实现额外分配了内存,但这个问题处于 C 语言的抽象层面)。 如果你想问像 VirtualAlloc 之类的操作系统 API 导致实体内存的额外开销,这个问题恐怕也是不良定义的,因为操作系统可以采用复杂的数据结构维护内存分配情况,很难说每次调用带来的额外开销都是同一个数。 |
4
e9pWeUbh9PGCnp95 2023-01-27 10:45:31 +08:00
kernel 有个 mm 和 vma 结构体记录你想要的这些信息。
|
5
pipapa 2023-01-27 17:31:37 +08:00
看你 alloc 函数的实现,一般都是用 brk 申请的虚拟内存不占实际内存大小,缺页才分配。
|
6
LuckyPocketWatch OP |
7
ragnaroks 2023-01-27 18:17:14 +08:00
1:4+N
2:c++ 的编译器 |