参考资料:

总结:

1、进程的栈大小是在进程执行的时刻才能指定的,即不是在编译的时候决定的,也不是在链接的时候决定的

2、进程的栈大小是随机确定的至少比线程栈要大,但是不到线程栈大小的2倍

3、线程栈大小是固定的,也就是ulimit -a 显示的值

查看线程栈大小:

5bfd56fcef4037f1c4baf0cff8197125.png

可以看到默认情况下线程栈大小为8192(8MB),可以使用ulimit -s xxx修改线程默认栈大小

(1)检查线程栈默认大小(8KB)

f7f3e132643ac6190c15b5b0a7ca0dc3.png

线程执行2030次之后,出现段错误(2030*4K=8120K)

ea7b339917f36a2899bc479b88b7d5f7.png

(2)修改栈大小,使用pthread_attr_setstack()

d2d685660974ae152d339cda383d795e.png

如上修改栈大小为16MB,其中线程栈的空间从堆中进行分配

dcea09968bc2d4fd9f7629c13747a779.png

程序执行4063次后出现段错误(4063*4KB)

(3)创建两个线程,使用默认栈大小执行

a645063f500b6cf20f9dc87c1cd11654.png

创建两个线程,默认单个线程栈大小为8M

41435cca3d8095abdc896afc16ecf0d8.png

执行结果1:程序执行4009次之后段错误(4009*4KB)

e973dd940ae79e5b025f2dec441d0726.png

执行结果2:程序执行3380次之后段错误(3380*4KB)

总结:

两个线程时,两个线程栈的总和不是固定值,也不是线程栈的2倍

(3)不使用任何线程

00227f62103445dc45ee444eca8f5a78.png

659f8b288217ac2c401d52da840ac2d9.png

执行结果1:程序执行2538次后段错误(2538*4KB)

817309f35aae2e28dafd193c66040678.png

执行结果2:程序执行2537次后段错误(2537*4KB)

总结:

进程的栈大小不是固定的,而是比线程栈大一些

(4)线程栈从进程栈中分配

b46efbe5472873a810e8a43c854d065f.png

d9f90011353a74b190bcd9fd70f4eb4f.png

执行结果1:   程序执行2536次后段错误(2536*4KB>8M)

34c11efb10978d189c513f295423cccc.png

执行结果2:程序执行2537次后段错误(2537*4KB>8M)

总结:

线程从进程栈分配空间,大小并不是固定的,如果分配空间大于进程栈空间,那么直接运行时出现段错误。

关于进程栈和线程栈总结:

(1)进程栈大小时执行时确定的,与编译链接无关

(2)进程栈大小是随机确认的,至少比线程栈要大,但不会超过2倍

(3)线程栈是固定大小的,可以使用ulimit -a 查看,使用ulimit -s 修改

进程内核栈、用户栈及 Linux 进程栈和线程栈的区别

Linux 进程栈和线程栈的区别 http://www.cnblogs.com/luosongchao/p/3680312.html 总结:线程栈的空间开辟在所属进程的堆区,线程与其所属的进程共享进程 ...

【摘】Linux虚拟地址空间布局以及进程栈和线程栈总结

Logo

更多推荐