程序棧大小 與 執行緒棧大小

2021-07-25 11:38:13 字數 1240 閱讀 3496

結論: 

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 看來...

大小端與棧方向

大小端模式和棧生長方向 首先 棧是向下生長的 所以畫棧的時候 上面是高位址 下面是地位址 然後資料從上往下畫 大小端 大端 是指 資料的 高位 儲存在記憶體的 低位址 中,而資料的 低位 儲存在記憶體的 高位址 中 小端 是指 資料的 高位 儲存在記憶體的 高位址 中,而資料的 低位 儲存在記憶體的...