linux多线程默认栈大小和最大可创建线程数
linux的线程栈大小可以使用ulimit -s命令查看,对于ubuntu 2.6的内核线程栈的默认大小为8M,如下:root@npti:/# ulimit -s819232位的系统,虚拟内存空间是4G,其中高1G是内核空间用户不可见,真正可以使用的内存空间大小是低3G的用户空间,具体参考下表:Linux的内存模型,一般为:地址作用说明>=0xc000 0000内核虚拟存储器用户代码
linux的线程栈大小可以使用ulimit -s命令查看,对于ubuntu 2.6的内核线程栈的默认大小为8M,如下:
root@npti:/# 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 表示用户空间,否则表示内核空间。
更多推荐
所有评论(0)