V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
LuckyPocketWatch
V2EX  ›  Linux

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

  •  
  •   LuckyPocketWatch · 2023-01-27 02:38:09 +08:00 · 2030 次点击
    这是一个创建于 685 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    void* ptr = alloc(32);
    

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

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

    7 条回复    2023-01-27 18:17:14 +08:00
    ragnaroks
        1
    ragnaroks  
       2023-01-27 04:02:32 +08:00
    这个 N 是由内存分配实现决定的,与操作系统无关,直接看你的 alloc 源码即可
    msg7086
        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 内存分配器解析的文章看。
    geelaw
        3
    geelaw  
       2023-01-27 04:50:16 +08:00
    不太确定你的 alloc 是哪里来的(它似乎不是 C 语言的标准,也不是 POSIX 的一部分)。

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

    如果你想问像 VirtualAlloc 之类的操作系统 API 导致实体内存的额外开销,这个问题恐怕也是不良定义的,因为操作系统可以采用复杂的数据结构维护内存分配情况,很难说每次调用带来的额外开销都是同一个数。
    e9pWeUbh9PGCnp95
        4
    e9pWeUbh9PGCnp95  
       2023-01-27 10:45:31 +08:00
    kernel 有个 mm 和 vma 结构体记录你想要的这些信息。
    pipapa
        5
    pipapa  
       2023-01-27 17:31:37 +08:00
    看你 alloc 函数的实现,一般都是用 brk 申请的虚拟内存不占实际内存大小,缺页才分配。
    LuckyPocketWatch
        6
    LuckyPocketWatch  
    OP
       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
        7
    ragnaroks  
       2023-01-27 18:17:14 +08:00
    1:4+N
    2:c++ 的编译器
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2385 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:35 · PVG 23:35 · LAX 07:35 · JFK 10:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.