4

Linux中进程/线程的大小是多少?当创建进程/线程以及其中的task_struct其他数据结构时,还有其他什么吗?

进程/线程初始化时是否分配了进程/线程的堆栈(固定大小)?还是在必要时分配(如虚拟内存)?

当标准进程/线程在内存中创建时,我如何知道它的大小?

4

2 回答 2

3

当在 Linux 上首次分配大块内存(> pagesize = 4096 字节)时,它使用页表中没有任何支持的特殊“空”内存页,因此当一个线程启动时,它将分配 ~1 MB这些零页用于线程堆栈。随着堆栈的增长,页面随后被转换为实际内存支持的页面。由于这种“空”页面支持,通常可以使用大的堆栈。

线程和进程都是使用名为clone(2)的相同底层系统调用创建的。它有很多选择,可以做很多事情。查看man clone详细说明。

http://linux.die.net/man/2/clone

大块内存是通过匿名mmap(2)调用分配的。

您可能也有兴趣在网络上搜索“linux overcommit bit”

(如果你想完善你的问题,我可以更具体。)

于 2012-07-11T13:39:28.203 回答
1

安德鲁说的是真的,但这并不意味着您的线程/进程从创建的那一刻起就不会“使用内存”。为堆栈保留的空间总是在你的进程中消耗虚拟地址空间,这意味着对于大型线程堆栈,你将很快用完 32 位机器上的地址(glibc 上默认线程堆栈大小的大约 300 个线程将耗尽虚拟地址空间)。此外,堆栈会影响提交费用,这决定了禁用过度使用时可以分配的内存总量。

Linux 默认为主线程的堆栈预提交 128k,如果提交费用尚未用尽,则允许自动获得更多。线程堆栈完全由用户空间(glibc/NPTL,在大多数 Linux 系统上)分配,并且不能超过其初始大小。根据版本和系统设置,glibc/NPTL 通常默认为每个线程分配 2 MB 到 10 MB 的空间。

于 2012-07-11T14:52:23.433 回答