linux的线程栈大小可以使用ulimit -s查看,对于ubunt 2.6的内核线程栈的默认大小为8M,如下:
shine@shine-bupt:~/Program/C$ 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一定要成立。