Linux中进程/线程的大小是多少?创建进程/线程时,还有task_struct
和其中的其他数据结构,还有什么吗?
进程/线程初始化(固定大小)时是否分配了进程/线程的堆栈?或者在必要时分配(如虚拟内存)?
如何在内存中创建标准进程/线程的大小?
答案 0 :(得分:3)
当在Linux上首次分配大块内存(> pagesize = 4096字节)时,它在页面表中使用了特殊的“空”内存页面,这些页面没有任何内容支持,所以当一个线程启动时它会分配线程堆栈的这些零页面大约1 MB。随着堆栈的增长,页面将转换为实际内存支持的页面。由于这个“空”页面支持,通常可以拥有大量的堆栈。
线程和进程都使用名为 clone(2)的相同底层系统调用创建。它有很多选择,并做很多东西。有关详细说明,请参阅man clone
。
http://linux.die.net/man/2/clone
通过匿名 mmap(2)调用分配大块内存。
您可能也有兴趣在网上搜索“linux overcommit bit”
(如果你想改进你的问题,我可以更具体一点。)
答案 1 :(得分:1)
安德鲁说的是真的,但这并不意味着你的线程/进程从创建之时就不会“使用内存”。为堆栈保留的空间总是消耗进程中的虚拟地址空间,这意味着对于大型线程堆栈,您将快速耗尽32位机器上的地址(使用默认线程堆栈的大约300个线程) glibc上的-size会耗尽虚拟地址空间。此外,堆栈有助于提交费用,它决定了在禁用过度使用时可以分配的内存总量。
Linux默认情况下为主线程的堆栈预先提交128k,并且如果提交费用尚未用完,则允许自动获取更多内容。线程堆栈完全由用户空间(glibc / NPTL,在大多数Linux系统上)分配,并且不能超出其初始大小。根据版本和系统设置,glibc / NPTL通常默认为每个线程分配2 MB到10 MB之间的空间。