Linux進程棧和線程棧


參考資料:

http://blog.csdn.net/xhhjin/article/details/7579145

總結:

    1、進程的棧大小是在進程執行的時刻才能指定的,即不是在編譯的時候決定的,也不是在鏈接的時候決定的

    2、進程的棧大小是隨機確定的至少比線程棧要大,但是不到線程棧大小的2倍

    3、線程棧大小是固定的,也就是ulimit -a 顯示的值

 

查看線程棧大小:

ulimit

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

(1)檢查線程棧默認大小(8KB)

stacksize

    線程執行2030次之后,出現段錯誤(2030*4K=8120K)

stacksize_error

 

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

setattribute

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

setattribute_error

   程序執行4063次后出現段錯誤(4063*4KB)

 

(3)創建兩個線程,使用默認棧大小執行

twothread

    創建兩個線程,默認單個線程棧大小為8M

twothread1_error

    執行結果1:程序執行4009次之后段錯誤(4009*4KB)

twothread2_error

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

總結:

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

 

(3)不使用任何線程

nothread

nothread1_error

執行結果1:程序執行2538次后段錯誤(2538*4KB)

nothread2_error

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

總結:

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

 

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

getstacksize

getthreadsize1_error

執行結果1:   程序執行2536次后段錯誤(2536*4KB>8M)

getstacksize2_error

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

總結:

    線程從進程棧分配空間,大小並不是固定的,如果分配空間大於進程棧空間,那么直接運行時出現段錯誤。

 

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

    (1)進程棧大小時執行時確定的,與編譯鏈接無關

    (2)進程棧大小是隨機確認的,至少比線程棧要大,但不會超過2倍

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM