Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Linux中进程/线程的大小_C_Linux_Multithreading_Kernel - Fatal编程技术网

C Linux中进程/线程的大小

C Linux中进程/线程的大小,c,linux,multithreading,kernel,C,Linux,Multithreading,Kernel,Linux中进程/线程的大小是多少?当一个进程/线程连同task\u struct和它内部的其他数据结构一起被创建时,还有其他的东西吗 进程/线程初始化时是否分配了进程/线程堆栈(固定大小)?还是在必要时分配(如虚拟内存) 在内存中创建标准进程/线程时,如何知道它的大小 在Linux上首次分配大内存块(>pagesize=4096字节)时,它会在pagetable中使用没有任何支持的特殊“空”内存页,因此当线程启动时,它会为线程堆栈分配约1 MB的这些零页。随着堆栈的增长,这些页将转换为真正的内

Linux中进程/线程的大小是多少?当一个进程/线程连同
task\u struct
和它内部的其他数据结构一起被创建时,还有其他的东西吗

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


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

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

线程和进程都是使用名为克隆(2)的相同底层系统调用创建的。它有很多选择,做很多事情。有关详细说明,请参见《克隆人》

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

您可能还对“linux Overmit bit”的web搜索感兴趣


(如果你想细化你的问题,我可以更具体一些。)

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


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

谢谢。因此,每个线程为其堆栈大小保留1MB。但是,您说过线程的内存只在真正需要时分配,这意味着在线程将某些内容写入内存之前,物理内存不会丢失另一个1MB的物理内存,是吗?如果是这种情况,请考虑我的内核是50 MB(例如),我的内存是70MB,我仍然可以分配超过20个线程吗?或者内核实际上在物理内存中保留了1MB?而且,当我键入
uname-a
时,我的堆栈大小限制是8192KB。这是每个进程/线程的上限吗?Linux上的每个进程不是都有自己的一组页面表,可以增长到几MB吗?堆栈最初由空页面组成,不使用物理内存。读操作将返回0,写操作将导致页面错误,导致它们使用实际内存进行备份。假设推送堆栈上的第一项,则仅使用总共4096字节的物理内存备份第一页。一旦推送超过4096字节,第2页将由物理内存支持,以此类推。因此,您可以看到堆栈只使用了大约所需的物理内存量(在4096字节的粒度范围内)。kthread用于内核内部(例如通过设备驱动程序),无法从userland进程访问。我对他们了解不多对不起。我不知道克隆系统调用是否调用start_kthread来创建新的进程或线程,或者kthread是否是一个单独的内核工具。谢谢。
uname-a
显示的堆栈大小(以KB为单位)是多少?最后,线程的大小是
thread\u info struct
+
内核堆栈(8KB)
+
线程堆栈(用户堆栈,2MB~10MB)
?这是32位虚拟地址空间耗尽的一个好问题。我住在64位的土地,这不是一个问题。