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

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


咨詢
建站咨詢
