如何查看操作系统用于管理分配内存的内存大小? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
LuckyPocketWatch
V2EX    Linux

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

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

    内核是 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
    uckyPocketWatch  
    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     Solana     2683 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 13:57 PVG 21:57 LAX 05:57 JFK 08:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86