2012-07-11 77 views
3

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

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

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

回答

3

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

线程和进程都使用名为clone(2)的相同底层系统调用来创建。它有很多选择,并做很多东西。有关详细说明,请参阅man clone

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

的存储器大块被分配与匿名MMAP(2)呼叫。

您可能也有兴趣做的“Linux的过量使用位”

网络搜索(如果你想改进你的问题,我可以更具体。)

+0

谢谢。所以,每个线程都保留1MB的堆栈大小。然而,你说线程的内存只在真正需要的时候被分配,这意味着物理内存不会损失另一个物理内存1MB,直到线程向内存写入内容为止。如果是这种情况,请考虑我的内核是50 MB(例如),我的内存是70 MB,我仍然可以分配超过20个线程吗?或者内核实际在物理内存中保留1MB? – Amumu 2012-07-11 14:01:15

+0

另外,当我输入'uname -a'时,我的堆栈大小限制为8192 kb。这是每个进程/线程的上限吗? – Amumu 2012-07-11 14:02:07

+0

Linux上的每个进程是不是也获得了自己的一堆可以增长到几MB的页表? – 2012-07-11 15:54:15

1

什么安德鲁说这是真的,但这并不意味着你的线程/进程在创建时不会“使用内存”。为堆栈保留的空间在您的进程中始终消耗虚拟地址空间,这意味着对于大型线程堆栈,您将快速耗尽32位机器上的地址(仅在glibc上使用默认线程堆栈大小的约300个线程将会排空虚拟地址空间)。另外,堆栈贡献了提交费用,这决定了过度使用禁用时可分配的总内存量。

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

+0

谢谢。 'uname -a'显示的堆栈大小以千字节为单位?最后,线程的大小是'thread_info struct'''内核栈(8KB)''''线程堆栈(用户堆栈,2MB〜10MB)'的大小'? – Amumu 2012-07-11 15:13:24

+0

这是关于32位虚拟地址空间用完的好处。我住在64位的土地,这不是一个问题。 – 2012-07-11 18:02:53