linux 进程栈 线程栈,Linux进程栈和线程栈

参考资料:

总结:

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

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

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

查看线程栈大小:

030ee0d91c1cfa4e990d6bf8d8b429bb.png

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

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

8b37d74f0901cbf76e644b4792043225.png

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

7662253d1dea8767794c169a3cd07878.png

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

e1dda81b3e9baaf14ac3e23c2115c1e0.png

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

fe688bd3b7993e9943d16a8becad3677.png

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

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

9a416a4591807f295607e3d9171d0828.png

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

eab49e5814f37b607b794ae097b2cf87.png

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

5274cd018c8adda13e5b659f2d9d7c1b.png

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

总结:

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

(3)不使用任何线程

bf3c242cb9fe46a0b1d70235e459d0aa.png

6d27524e7d355088d83d8022044182f9.png

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

4d58aebd1864b6911d2f61e72b9994c1.png

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

总结:

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

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

95d217466df100e1c0e28c30d910dd55.png

1ca2444295bbefa050e1f8482969c7e3.png

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

bd49f05ffe7e39cebeebffe751aa5632.png

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

总结:

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

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

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

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

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

来源:https://www.cnblogs.com/luosongchao/p/3680312.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值