注意:
下面的测试代码在我自己的机子上(ubuntu6.06,ubuntu6.10,redhat 9, gentoo)通过了测试,但是很奇怪的是在我同事的机子上,无论是改变环境,还是想其它方法都不能正常的运行。在网上查了一下,很多人也存在同样的问题,至今不知道为何。
linux线程的实现方式决定了对进程的限制同样加在了线程身上:)所以,有问题,请参见之线程栈空间(2)(进行栈)
看看执行过程:
dongq@DongQ_Lap ~/workspace/test/pthread_attr $ make
cc -pthread -g -DDEBUG -lrt -o thread_attr thread_attr.c
dongq@DongQ_Lap ~/workspace/test/pthread_attr $ ./thread_attr
Default stack size is 8388608; minimum is 16384 //默认的栈大小为8M
Default stack size is 16777216; minimum is 16384 //设置后的结果为16M
The thread is here
The thread is here
The thread is here
The thread is here
The thread is here
Get 15M Memory!!!
Get More Memory!!!
Get 15M Memory!!!
Get More Memory!!!
Get 15M Memory!!!
Get 15M Memory!!!
Get More Memory!!!
Get More Memory!!!
Get 15M Memory!!!
Get More Memory!!!
Main exitings
用下面的命令来看linux下面的对系统的一些限制:
dongq@DongQ_Lap ~/workspace/test/pthread_attr $ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 16365
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8196
cpu time (seconds, -t) unlimited
max user processes (-u) 16365
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
通过上面的命令,我们可以清楚的看到一个进程在正常的情况下,最大的栈空间为8M。
那么8M我们够用吗?当你分配大量的static或者auto变量的时候,一般都是放在栈空间的。如果分配一个大于8M的数组,会发生什么呢?
先来看看测试代码:
int main()
{
int i = 1024 * 1024 * 8;
char p[ i ];
memset( p, 0, sizeof( char ) * i );
while( i-- )
{
p[ i ] = i;
}
return 0;
}
上面的代码直接分配一个大小为8M的数组,编译后运行,出现段错误!!
很奇怪吗?不是说可以分配8M吗?怎么不行?当然不行,因为在分配p时,栈中已经放有其它的变量,最明显的就是int i;
这样子的话,栈中就没有足够的空间给变量p分配,从而出现段错误。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |