關于進程棧和線程棧總結:
(1)進程棧大小時執(zhí)行時確定的,與編譯鏈接無關
(2)進程棧大小是隨機確認的,至少比線程棧要大,但不會超過2倍
(3)線程棧是固定大小的,可以使用ulimit -a 查看,使用ulimit -s 修改
(4)一般默認情況下,線程棧是在進程的堆中分配??臻g,每個線程擁有獨立的棧空間,為了避免線程之間的??臻g踩踏,線程棧之間還會有以小塊guardsize用來隔離保護各自的??臻g,一旦另一個線程踏入到這個隔離區(qū),就會引發(fā)段錯誤。
查看線程棧大小:

1.png
可以看到默認情況下線程棧大小為8192(8MB),可以使用ulimit -s xxx修改線程默認棧大小
(1)檢查線程棧默認大小(8MB)

2.png
線程執(zhí)行2030次之后,出現(xiàn)段錯誤(20304K=8120K)

3.png
(2)修改棧大小,使用pthread_attr_setstack()

4.png
如上修改棧大小為16MB,其中線程棧的空間從堆中進行分配

5.png
程序執(zhí)行4063次后出現(xiàn)段錯誤(40634KB)
(3)創(chuàng)建兩個線程,使用默認棧大小執(zhí)行

6.png
創(chuàng)建兩個線程,默認單個線程棧大小為8M

7.png
執(zhí)行結果1:程序執(zhí)行4009次之后段錯誤(40094KB)

8.png
執(zhí)行結果2:程序執(zhí)行3380次之后段錯誤(33804KB)
總結:
兩個線程時,兩個線程棧的總和不是固定值,也不是線程棧的2倍
(3)不使用任何線程

9.png

執(zhí)行結果1:程序執(zhí)行2538次后段錯誤(25384KB)

3.png
執(zhí)行結果2:程序執(zhí)行2537次后段錯誤(25374KB)
總結:
進程的棧大小不是固定的,而是比線程棧大一些
(4)線程棧從進程棧中分配

4.png

5.png
執(zhí)行結果1: 程序執(zhí)行2536次后段錯誤(25364KB>8M)

6.png
執(zhí)行結果2:程序執(zhí)行2537次后段錯誤(25374KB>8M)
總結:
線程從進程棧分配空間,大小并不是固定的,如果分配空間大于進程??臻g,那么直接運行時出現(xiàn)段錯誤。