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

2019-03-05 09:56:43 +08:00
 aiqier

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

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

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

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

参考 pthread_create, pthread_attr_t

Win 下也一样。

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

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

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

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

© 2021 V2EX