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