在Linux中,进程/线程的大小是多少?当创建进程/线程时,除了task_struct
和其他内部数据结构外,还有什么?
一个进程/线程的栈是在初始化(固定大小)时分配的吗?还是在需要时(如虚拟内存)分配的?
当一个标准进程/线程在内存中被创建时,我如何知道它的大小?
在Linux中,进程/线程的大小是多少?当创建进程/线程时,除了task_struct
和其他内部数据结构外,还有什么?
一个进程/线程的栈是在初始化(固定大小)时分配的吗?还是在需要时(如虚拟内存)分配的?
当一个标准进程/线程在内存中被创建时,我如何知道它的大小?
man clone
。
http://linux.die.net/man/2/clone
大块内存是通过匿名的mmap(2)调用分配的。Andrew所说的是正确的,但这并不意味着您的线程/进程从创建时起就不会“使用内存”。为堆栈保留的空间始终会在您的进程中消耗虚拟地址空间,这意味着对于具有大型线程堆栈的32位机器而言,您很快就会用尽地址(仅使用glibc上的默认线程堆栈大小,大约300个线程将耗尽虚拟地址空间)。此外,堆栈会对提交费用做出贡献,该费用确定禁用超额提交时可以分配的总内存量。
Linux默认为主线程的堆栈预先提交128k,并允许在提交费用未耗尽的情况下自动获取更多。线程堆栈完全由用户空间(在大多数Linux系统上为glibc/NPTL)分配,并且无法超出其初始大小。根据版本和系统设置,glibc/NPTL通常默认为每个线程分配2 MB至10 MB之间的某个值。
uname -a
显示的 kbytes 中的堆栈大小是多少?最终,线程的大小是 thread_info struct
的大小 + kernel stack (8KB)
+ thread stack (user stack, 2MB~10MB)
的大小? - Amumu
uname -a
时,我的堆栈大小限制为8192 kb。这是每个进程/线程的上限吗? - Amumukthread
怎么样?每个线程是否立即分配一个在uname -r
中列出的固定堆栈大小? - Amumu