关于堆栈大小的问题

请问,QNX下,进程堆栈和线程堆栈是如何确定的?默认状态下是多大?

如果我没记错的话,默认是主线程512K,以后各线程128K。

不过,堆栈是LAZY_MAP的,也就是说只有用到时,才会实际分配内存。

上网查了下其他os的大小

在Windows中,CreateThread函数的参数dwStackSize是将要分配给新线程的以字节为单位的栈大小。栈大小应该是4KB的非零整数倍,最小为8KB。堆栈默认的大小1MB。
在Linux中,线程堆栈大小遵照系统的默认设置或在线程属性对象中设置,而我没有进行设置,于是使用ulimit命令查看了系统的堆栈大小,如下:stack size (kbytes, -s) 10240

好像qnx分配的很小,另外lazymap是指什么?

在QNX上,主线程(进程)的堆栈大小可以在链接时指定(-M?),不指定的话是默认的512K。

子线程的堆栈也可以在pthread_create()时,通过设pthread_attr_t来指定。不设的话是默认的128K。

传统来说,QNX上的程序没有用到很大的堆栈,所以默认值比较小。用户可以根据自己的需要修改。

LAZY_MAP的意思是说,即使你为线程定义了1M的堆栈,但系统一开始只分配8K做为线程的堆栈。当线程执行,使用堆栈超过8K时,系统会自动再追加4k内存。如此继续,直到堆栈到达设定的1M。当然,如果你不希望堆栈这样分配的话,也可以事先准备内存,在pthread_attr_t里传给线程当做堆栈。

pidin mem命令可以看到各线程的堆栈情况(当前allocate与最大值)