linux多线程默认栈大小和最大可创建线程数
linux的线程栈大小可以使用ulimit -s命令查看,对于ubuntu 2.6的内核线程栈的默认大小为8M,如下:
[email protected]:/# ulimit -s
8192
32位的系统,虚拟内存空间是4G,其中高1G是内核空间用户不可见,真正可以使用的内存空间大小是低3G的用户空间,具体参考下表:
Linux的内存模型,一般为:
地址 |
作用 |
说明 |
>=0xc000 0000 |
内核虚拟存储器 |
用户代码不可见区域 |
<0xc000 0000 |
Stack(用户栈) |
ESP指向栈顶 |
|
↓
↑ |
空闲内存 |
>=0x4000 0000 |
文件映射区 |
|
<0x4000 0000 |
↑ |
空闲内存
|
|
Heap(运行时堆) |
通过brk/sbrk系统调用扩大堆,向上增长。 |
|
.data、.bss(读写段) |
从可执行文件中加载 |
>=0x0804 8000 |
.init、.text、.rodata(只读段) |
从可执行文件中加载 |
<0x0804 8000 |
保留区域 |
|
也就是说用户可使用的内存空间就是0x00000000~0xc0000000的大小,这个空间的大小刚好是3G。
那么进程中能创建的最大线程数就会受默认线程栈的大小限制,假设线程数N,则N*8M < 3*1024M一定要成立。
64位系统的地址空间不是2^32, 也不是2^64,而一般是2^48。因为并不需要2^64那么大的寻址空间,过大的空间只会导致资源的浪费。64位linux一般使用48位来表示虚拟地址空间,使用40位来表示物理地址空间,可以通过cat /proc/cpuinfo来查看
&lt;img src="https://pic3.zhimg.com/50/v2-941f814105489a0e4bfff1b60df9d93c_hd.jpg" data-caption="" data-size="normal" data-rawwidth="540" data-rawheight="433" class="origin_image zh-lightbox-thumb" width="540" data-original="https://pic3.zhimg.com/v2-941f814105489a0e4bfff1b60df9d93c_r.jpg"&gt;其中,0x0000000000000000~0x00007fffffffffff 表示用户空间, 0xFFFF800000000000~ 0xFFFFFFFFFFFFFFFF 表示内核空间,共提供 256TB(2^48) 的寻址空间。
这两个区间的特点是,第 47 位与 48~63 位相同,若这些位为 0 表示用户空间,否则表示内核空间。