新聞中心
在Linux系統(tǒng)中,程序棧是一個用于存儲函數參數、局部變量及返回地址的內存區(qū)域。對于程序員來說,設置合適的程序棧大小是非常重要的,能夠避免程序運行時棧溢出等錯誤。本文將介紹Linux下如何設置程序棧大小。

網站建設哪家好,找創(chuàng)新互聯!專注于網頁設計、網站建設、微信開發(fā)、小程序制作、集團企業(yè)網站建設等服務項目。為回饋新老客戶創(chuàng)新互聯還提供了祁縣免費建站歡迎大家使用!
一、查看程序棧大小
在Linux系統(tǒng)中,可以使用”ulimit -s”命令查看系統(tǒng)的程序棧大小。該命令顯示的是當前程序棧的軟限制和硬限制,如下所示:
“`
$ ulimit -s
8192
“`
其中,軟限制是指可以改變的更大值,而硬限制是指可以設置的更大值。通常情況下,軟限制比硬限制小,但是可以通過提高軟限制來達到硬限制的效果。
二、增加程序棧大小
如果需要增加程序棧的大小,可以使用”ulimit -s”命令,例如:
“`
$ ulimit -s 16384
“`
這個命令將會將程序棧的軟限制修改為16384KB,如果在當前Shell會話中執(zhí)行該命令,那么該會話中啟動的所有程序都會受到限制。
如果希望在啟動某個程序時設置程序棧的大小,可以使用”ulimit -s”命令和程序命令同時執(zhí)行,例如:
“`
$ ulimit -s 16384
$ ./a.out
“`
該命令將會將程序棧修改為16384KB,然后執(zhí)行a.out程序。在執(zhí)行完程序后,程序棧大小會自動恢復為之前的大小。
三、設置全局程序棧大小
如果需要在所有Shell會話中都修改程序棧大小,可以修改”/etc/security/limits.conf”文件。打開該文件,找到以下行:
“`
# End of file
“`
在該行之前添加以下內容:
“`
* soft stack 16384
* hard stack 16384
“`
這個配置將會將系統(tǒng)中所有用戶的軟限制和硬限制都設置成16384KB。
注意:修改”/etc/security/limits.conf”文件需要root權限。
四、避免程序棧溢出
雖然設置程序棧大小可以有效避免程序運行時棧溢出等錯誤,但是程序員還需要遵循一些編程規(guī)范,以避免程序棧溢出。下面是一些避免程序棧溢出的編程規(guī)范:
1. 避免遞歸調用:遞歸函數容易引起程序棧溢出,應該盡量避免使用遞歸調用。
2. 避免申請過多的內存:過多的內存申請會導致程序棧大小增加,進而增加程序棧溢出的風險。
3. 使用??臻g較小的數據類型:對于存儲在棧中的變量,使用??臻g小的數據類型能夠有效減小程序棧占用的空間。
4. 盡量使用動態(tài)內存分配:對于大型的數據結構或者需要動態(tài)更新的數據,應該盡量使用動態(tài)內存分配器,以減小程序棧的負擔。
設置合適的程序棧大小是保證程序正常運行的重要因素之一。通過以上介紹,讀者可以了解如何在Linux系統(tǒng)中設置程序棧大小,以及如何避免程序棧溢出。同時,讀者也應該遵守一些編程規(guī)范,以充分利用程序棧的資源,提高程序的性能和安全性。
相關問題拓展閱讀:
- Linux進程虛擬地址空間的分布,以及堆和棧的區(qū)別
- linux下,gcc提示“段錯誤 (核心已轉儲)”,ubuntu剛上手不大會用,誰說一下是啥問題
Linux進程虛擬地址空間的分布,以及堆和棧的區(qū)別
一、具體分布如圖所示:
二、關于堆和棧
(1)分配方式:
棧:由編譯器自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。
堆: 一般由程序員分配釋放,它的分配方式類似于鏈表。
(2)申請后系統(tǒng)的響應:
棧:只要所申請的空間小于棧的剩余纖液空間,則系統(tǒng)為程序分配內存,否則棧溢出。
堆:操作系統(tǒng)有一個記錄空閑內存地址的鏈表,當系統(tǒng)收到程序的申請時,遍歷該鏈表,找出之一個大于所申請空間的節(jié)點,然后將其從鏈表中刪除并分配,如果沒用完,則系統(tǒng)會把多余的重新放回到鏈表中。
(3)申請大小的限制:
棧:棧是高地址向低地址擴展的連續(xù)毀棗物內存,棧的大小一般是2M;
堆:堆是低地址向高地址擴展的不連續(xù)內存,堆的大小與計算機有效的虛擬內存有關系。
(4)申請巖戚效率:
棧:由系統(tǒng)自動分配,速度較快;
堆:速度慢,容易產生內存碎片;
關于Linux命令的介紹,看看《linux就該這么學》,具體關于這一章地址3w(dot)linuxprobe/chapter-02(dot)html.
linux下,gcc提示“段錯誤 (核心已轉儲)”,ubuntu剛上手不大會用,誰說一下是啥問題
segmentation fault(core dump)
你寫的代碼有嚴重bug,導致程序崩潰
主要有以下幾個方面的原因:
一、內存訪問出錯
這類問題的典型代表就是數組越界。
二、非法內存訪問
出現這類問題主要是程序試圖訪問內核段內存而產生的錯誤。
三、棧溢出
Linux默認給一個進程分配的棧空間大小為8M。c++申請閉虛變量時,new操作申請的變量在堆中,其他變量一般在存儲在棧中。
因此如果數組開的過大變會出現這種問題。
擴展資料:
注意事項
段錯誤一般就是指訪問的內存超出了系統(tǒng)所給這個程序的內存空間,通常這個值是由gdtr來保存的,他是一個48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相應于gdt的下標,最后3位包括了程序是否在內存中以及程序的在cpu中的運行級別,指向的gdt是由以64位為一個單位的表,在這張表中培態(tài)隱就保存著程序運行的代碼段以配廳及數據段的起始地址以及與此相應的段限和頁面交換還有程序運行級別還有內存粒度等等的信息。
一旦一個程序發(fā)生了越界訪問,cpu就會產生相應的異常保護,于是segmentation fault就出現了。在編程中基本是是錯誤地使用指針引起的。
出現此問題的原因如下:
1、內存訪問伍旦洞錯誤
這種問題的典型代表是數組越界。
2、非法內存訪問
這種問題主要是由程序嘗試訪問內核段內存的錯誤引起的。
3、堆棧溢出
默認情況下,Linux為進程分配8M的堆??臻g。 當C ++申請變量遲納時,新申請的變量在堆中,而其他變量通常存儲在堆棧中。
因此,如果數組太大,則會出現此問題。
擴腔枯展資料:
段故障通常意味著訪問的內存超出了系統(tǒng)為程序分配的內存空間。 通常,此值由gdtr存儲,是一個48位
寄存器
,其軌道中的32位由其存儲。
gdt表,后13位保存與gdt對應的下標,后3位包括程序是否在內存中以及cpu中程序的運行級別,gdt指向的表是一個以64位為單位的表。在此表中,代碼段的信息和數據段的起始地址,相應的段限制和頁交換,程序運行級別和內存粒度存儲在該表中。
一旦對程序進行越界訪問,CPU將生成相應的異構保護,并且將出現分段錯誤。 基本上,這是由于編程中不正確使用指針引起的。
linux系統(tǒng)為一個進程的分配的堆??臻g只有8k左右,你定義了一個凱攜300萬的整形數組,需要占用*4=1200萬k大小的堆棧空間,肯定會把堆棧撐爆的,故會出現核心已轉儲的錯誤提示。
為了提高程序的健壯性,防止堆棧越界的情況發(fā)生,一般局部變量分配的空間不要超過1024字節(jié)大猛孫蘆小,就是一個255的整形數組。如果你想要用超過1024字節(jié)枝帶以上的空間,就調用malloc在堆中分配你想要的空間。
大概是堆棧溢出,3百萬個指針的數組太大了,占地12M(32位機器手世),24M(64bit)。
想確認請在渣返終端輸入 ulimit -s,查看堆棧限制畢梁肢。
想無視堆棧限制,請嘗試ulimit -s unlimited
linux 設置程序棧大小的介紹就聊到這里吧,感謝你花時間閱讀本站內容,更多關于linux 設置程序棧大小,Linux下如何設置程序棧大???,Linux進程虛擬地址空間的分布,以及堆和棧的區(qū)別,linux下,gcc提示“段錯誤 (核心已轉儲)”,ubuntu剛上手不大會用,誰說一下是啥問題的信息別忘了在本站進行查找喔。
成都創(chuàng)新互聯科技有限公司,是一家專注于互聯網、IDC服務、應用軟件開發(fā)、網站建設推廣的公司,為客戶提供互聯網基礎服務!
創(chuàng)新互聯(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務器和獨立服務器。創(chuàng)新互聯——四川成都IDC機房服務器托管/機柜租用。為您精選優(yōu)質idc數據中心機房租用、服務器托管、機柜租賃、大帶寬租用,高電服務器托管,算力服務器租用,可選線路電信、移動、聯通機房等。
新聞名稱:Linux下如何設置程序棧大小?(linux設置程序棧大小)
網頁鏈接:http://m.fisionsoft.com.cn/article/cdsogos.html


咨詢
建站咨詢
