V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
aiqier
V2EX  ›  程序员

一个线程到底占有多大内存?

  •  1
     
  •   aiqier · 2019-03-05 09:56:43 +08:00 · 8889 次点击
    这是一个创建于 2116 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在书上读到过一个 linux 的线程大概占 8M 内存。 然而从一些人那里得到类似的描述说,其实没有那么多,有说法的线程的内核栈是 8k,还读到过下面的说法:

    “ linux 的栈是通过缺页来分配内存的,不是所有栈地址空间都分配了内存。因此,8M 是最大消耗,实际的内存消耗只会略大于实际需要的内存(内部损耗,每个在 4k 以内)。”

    读到这些我就有点懵了,所以想请教两个问题 1.一个 linux 线程到底占有多大内存? 2.java 中的线程是不是也有类似的说法?默认说一个线程 1M,实际内存没有那么大?

    12 条回复    2019-03-05 14:35:04 +08:00
    wencong
        1
    wencong  
       2019-03-05 10:00:30 +08:00
    哪本书读到的
    glasslion
        2
    glasslion  
       2019-03-05 10:15:23 +08:00
    8M 是指的每个线程默认分配 8M 的虚拟栈空间,但现代的软硬件可以通过 MMU 可以实现实际用到时才去占用的物理内存。
    jppxhz01
        3
    jppxhz01  
       2019-03-05 10:15:38 +08:00 via iPhone
    8M 太可怕了
    aiqier
        4
    aiqier  
    OP
       2019-03-05 10:20:00 +08:00
    @wencong ulimit -s 就是 8M
    visitant
        5
    visitant  
       2019-03-05 10:24:32 +08:00 via iPhone
    虚拟地址与物理地址之间的转换以及页表和缺页中断了解一下
    halfer53
        6
    halfer53  
       2019-03-05 10:26:49 +08:00 via Android
    这取决于操作自动,还有 clone 的参数。对于内核来说,大概是 size of(task_struct) +内核的 stack 1kb。user space stack 一般一开始是 512kb,不过这取决于 runtime
    hitmanx
        7
    hitmanx  
       2019-03-05 10:32:52 +08:00
    @halfer53 内核的 stack 1kb 指的是什么?
    GjriFeu
        8
    GjriFeu  
       2019-03-05 10:45:50 +08:00 via iPhone
    线程内核栈一般是两个页的大小,
    用户空间栈大小和编译器有关,一般是几 M, 但是是不是预先分配的呢,我觉得应该是
    kobe1941
        9
    kobe1941  
       2019-03-05 10:55:53 +08:00
    以 iOS 和 Mac 为例,iOS 的主线程栈内存占用最大 1M,子线程 512kb,Mac 的主线程最大 8M。
    测试这个值很方便,你只要定义一个局部变量的 int 数组就可以了,看看数组的长度可以到多大的时候系统会栈溢出导致崩溃。
    misaka19000
        10
    misaka19000  
       2019-03-05 11:02:09 +08:00 via Android
    最简单的办法是翻 linux 源码去了解
    halfer53
        11
    halfer53  
       2019-03-05 11:55:03 +08:00 via Android
    @hitmanx 对于每一个线程,内核会单独建一个 stack 给内核用
    lff0305
        12
    lff0305  
       2019-03-05 14:35:04 +08:00
    一个 thread 的内存占用,包括创建线程的时候可以指定参数来设置 stack 的大小,不指定就用默认的 stack 大小
    加上内核保存这个 thread 的状态信息的各种 struct。

    参考 pthread_create, pthread_attr_t

    Win 下也一样。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1916 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:15 · PVG 00:15 · LAX 08:15 · JFK 11:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.