執行緒棧空間的大小

2021-06-21 15:18:58 字數 912 閱讀 3100

一直做windows伺服器向linux平台的移植工作,對於執行緒的棧空間也是似懂非懂,因而出現了一些問題和總結了部分經驗,供大家分享。

在我的伺服器上啟動了286個執行緒後,其後的執行緒啟動失敗了,返回的錯誤原因是12,經查詢定義如下:

#define

enomem        12    /* out of memory */

看來建立執行緒失敗的原因是分配記憶體失敗,同時程序占用的virt顯示也達到了3070mb,估計是虛擬記憶體不足了。

於是檢視了兩個平台關於執行緒堆疊空間方面的內容,列舉如下:

在windows中,createthread函式的引數dwstacksize是將要分配給新執行緒的以位元組為單位的棧大小。棧大小應該是4kb的非零整數倍,最小為8kb。堆疊預設的大小1mb。

stack size            (kbytes, -s) 10240

怪不得使用了如此多的虛擬記憶體呢,286*10m=2860m,再加上其他部分消耗的,所以虛擬記憶體就不足了。

另外查閱文件,反映linux平台的棧預設大小應該是8192kb,而不是10m;但我這台伺服器是否被別人修改了就不清楚了。

linux平台使用如下函式操作posix執行緒棧空間:

int pthread_attr_setstacksize(pthread_attr_t *threadattr, int stack_size);//設定

int pthread_attr_getstacksize(pthread_attr_t *threadattr, int stack_size);//取得

馬上使用上述函式進行了測試,流程如下:

把執行緒棧空間設定為2m後進行了測試,確認成功減小了建立執行緒消耗的虛擬記憶體了。

執行緒棧空間的大小

一直做windows伺服器向linux平台的移植工作,對於執行緒的棧空間也是似懂非懂,因而出現了一些問題和總結了部分經驗,供大家分享。在我的伺服器上啟動了286個執行緒後,其後的執行緒啟動失敗了,返回的錯誤原因是12,經查詢定義如下 define enomem 12 out of memory 看來...

測試棧空間的大小

比如區域性變數是儲存在棧空間中的,今天突然在想棧的上限是多大呢,什麼時候才會棧溢位?ulimit 命令 linux下使用ulimit 命令可以檢視系統的很多上限值。可以看到系統設定棧的上限是8m 測試 現在我們寫個程式測試一下 兩種方法 1 第一種方法 最簡單的是在函式或直接在main 函式裡定義多...

棧空間大小限制

不同系統的棧空間大小不同,可通過如下方法檢視系統棧大小限制 cat proc 1 limits 該檔案列出了系統資源限制情況 ubuntu 16.04 limit soft limit hard limit units max cpu time unlimited unlimited seconds...