linux下進程和線程的空間分配

關于進程棧和線程棧總結:

(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)段錯誤(4063
4KB)

(3)創(chuàng)建兩個線程,使用默認棧大小執(zhí)行

6.png

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

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

執(zhí)行結果2:程序執(zhí)行3380次之后段錯誤(3380
4KB)

總結:

兩個線程時,兩個線程棧的總和不是固定值,也不是線程棧的2倍

(3)不使用任何線程

9.png


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

執(zhí)行結果2:程序執(zhí)行2537次后段錯誤(2537
4KB)

總結:

進程的棧大小不是固定的,而是比線程棧大一些

(4)線程棧從進程棧中分配

4.png

5.png

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

執(zhí)行結果2:程序執(zhí)行2537次后段錯誤(2537
4KB>8M)

總結:

線程從進程棧分配空間,大小并不是固定的,如果分配空間大于進程??臻g,那么直接運行時出現(xiàn)段錯誤。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容