結論:
1. 程序的棧大小是在程序執行的時刻才能指定的,即不是在編譯的時刻決定,也不是鏈結的時刻決定,否則就不會有實驗5的結果
2. 程序的棧大小是隨機確定的至少比執行緒的棧要大,但是不到執行緒棧大小的2倍
3. 執行緒棧的大小是固定的,也就是ulimit -a顯示的值
實驗:我在fc3,gcc3.4.2環境下進行該實驗,證明執行緒的棧確實有固定大小,也就是ulimit -a顯示的那個值,在我的實驗室環境下為10m位元組
實驗1:
#include
#include
int i = 0;
void *test(void * s)
int main()
並且可以使用如下**修改這個執行緒棧的大小為16m:
實驗2:
#include
#include
int i = 0;
void *test(void * s)
int main()
但是如果用兩個執行緒使用預設大小,來進行上面的實驗,兩個棧的總和並不是乙個執行緒的二倍,並且這個總和也不是固定值
實驗3:
#include
#include
int i = 0;
pthread_mutex_t mutex=pthread_mutex_initializer;
void *test(void * s)
int main()
如果不使用任何執行緒的話,那麼乙個程序的棧也不是理論上的2g,而是比乙個執行緒的棧稍(ulimit -a 的值10m)大一些,並且這個棧的大小也不總是固定的
實驗4:
#include
int i=0;
void fun()
int main()
如果pthread_attr_setstack設定的執行緒棧是從棧空間分配的話,如果執行緒棧的大小為10m的話,那麼執行緒棧的大小也不是固定不變了而是和實驗4的結果相同(類似?)
如果執行緒棧大小為11m的話,那麼執行緒棧的大小也不是固定不變,但這個時候有可能在程序一開始的時候就發生段錯誤,即使是同乙個可執行檔案多次不同執行也會出現這種現象,說明這個棧的大小是和gcc的編譯與鏈結無關的
實驗5:
#include
#include
int i = 0;
void *test(void * s)
int main()
執行緒棧空間的大小
一直做windows伺服器向linux平台的移植工作,對於執行緒的棧空間也是似懂非懂,因而出現了一些問題和總結了部分經驗,供大家分享。在我的伺服器上啟動了286個執行緒後,其後的執行緒啟動失敗了,返回的錯誤原因是12,經查詢定義如下 define enomem 12 out of memory 看來...
執行緒棧空間的大小
一直做windows伺服器向linux平台的移植工作,對於執行緒的棧空間也是似懂非懂,因而出現了一些問題和總結了部分經驗,供大家分享。在我的伺服器上啟動了286個執行緒後,其後的執行緒啟動失敗了,返回的錯誤原因是12,經查詢定義如下 define enomem 12 out of memory 看來...
大小端與棧方向
大小端模式和棧生長方向 首先 棧是向下生長的 所以畫棧的時候 上面是高位址 下面是地位址 然後資料從上往下畫 大小端 大端 是指 資料的 高位 儲存在記憶體的 低位址 中,而資料的 低位 儲存在記憶體的 高位址 中 小端 是指 資料的 高位 儲存在記憶體的 高位址 中,而資料的 低位 儲存在記憶體的...